如何检查字符串是否已经在 Emacs Lisp 的列表中?我需要检查某个路径字符串是否已经存在exec-path
,如果不是,则将其添加到该列表中。
问问题
2121 次
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
:
(添加到列表 LIST-VAR ELEMENT &optional APPEND COMPARE-FN) 将 ELEMENT 添加到 LIST-VAR 的值(如果它尚不存在)。 ELEMENT 是否存在的测试使用“equal”或 COMPARE-FN 如果那不是零。 如果添加了 ELEMENT,则添加在列表的开头, 除非可选参数 APPEND 不为零,在这种情况下 最后添加 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")
在您的情况下需要该参数,因为默认情况下用于比较,并且它不会将具有相同内容的两个字符串视为相等。( ) 也可以。:test
#'string=
cl-pushnew
eql
equal
(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 [关键字值] ...) (cl-pushnew X PLACE):如果 X 还没有,则在列表的开头插入 X。 与 (push X PLACE) 类似,但如果 X 为 'eql' 则列表未修改 已在列表中的元素。 支持的关键字: :test :test-not :key
于 2020-05-22T06:30:37.553 回答