15

文字列がEmacsLispのリストにすでに含まれているかどうかを確認するにはどうすればよいですか?特定のパス文字列がすでに含まれているかどうかを確認しexec-path、含まれていない場合はそのリストに追加する必要があります。

4

2 に答える 2

25

関数add-to-listは追加する前に自動的にチェックします

(setq a '(1 2 3))
(add-to-list 'a 4)
(add-to-list 'a 3)

結果はa(4 1 2 3)に等しくなります

Emacs 26からC-h f add-to-list

(リストに追加リスト-VAR要素とオプションのAPPEND COMPARE-FN)

LIST-VARの値がまだない場合は、ELEMENTを値に追加します。
ELEMENTの存在のテストは、「等しい」または「
比較-それがゼロでない場合はFN。
ELEMENTが追加されると、リストの先頭に追加されます。
オプションの引数APPENDがnil以外の場合を除き、その場合は
最後にELEMENTが追加されます。

戻り値は、LIST-VARの新しい値です。

これは、構成変数にいくつかの要素を追加するのに便利です。
しかし、あなたが通常いるElispコードでそれを乱用しないでください
'push'または'cl-pushnew'を使用することをお勧めします。

そうでない変数で「リストに追加」を使用する場合
特定のパッケージがロードされるまで定義されている場合は、
のみ実行されるフック関数への「リストへの追加」の呼び出し
パッケージをロードした後。'eval-after-load'は、
これを行う。場合によっては、メジャーモードフックなどの他のフック、
仕事をすることができます。
于 2009-05-22T06:29:20.897 に答える
2

についてのcobbalの 答えに加えて、次add-to-listもありcl-pushnewます:

(require 'cl-lib)

(setq list-of-strings '("one" "two" "three"))
(cl-pushnew "two" list-of-strings :test #'string=)
    ⇒ ("one" "two" "three")
(cl-pushnew "zero" list-of-strings :test #'string=)
    ⇒ ("zero" "one" "two" "three")

はデフォルトで比較に使用され、同じ内容の2つの文字列を等しいものとして扱わないため、この場合は引数が必要です。()も機能します。:test #'string=cl-pushneweqlequal

(eql "some-string" "some-string")
    ⇒ nil
(string= "some-string" "some-string")
    ⇒ t
(equal "some-string" "some-string")
    ⇒ t

Emacs 26からC-h f cl-pushnew

cl-pushnewは、「cl-lib.el」のLispマクロです。

(cl-pushnew X PLACE [KEYWORD VALUE] ...)

(cl-pushnew X PLACE):まだリストにない場合は、リストの先頭にXを挿入します。
(push X PLACE)と同様ですが、Xが'eql'の場合、リストは変更されません。
すでにリストにある要素。

サポートされているキーワード::test:test-not:key
于 2020-05-22T06:30:37.553 に答える