在Emacs lisp中,add-to-list
将单个元素添加到列表中(如果它已经不存在)。
而不是一个,我想添加多个元素。此外,我不想过滤重复的元素,但仍然将它们添加到列表中。
目前,我已实施以下功能:
(defun append-to-list (list-var elements)
"Append ELEMENTS to the end of LIST-VAR.
The return value is the new value of LIST-VAR."
(set list-var (append (symbol-value list-var) elements)))
该功能可以满足我的需求,但我想知道Emacs lisp中是否存在类似(或更好)的内容。我不想重新发明轮子。
更新1 :Stefan在下面指出此代码不适用于词法作用域。有没有办法让它发挥作用?
更新2 :以前我认为重复过滤会很好,但事实并非如此。我确实需要重复。
答案 0 :(得分:5)
这几乎等同于 1 但速度更快,因为它在附加新元素之前不会复制原始列表。
(defun append-to-list (list-var elements)
"Append ELEMENTS to the end of LIST-VAR.
The return value is the new value of LIST-VAR."
(unless (consp elements)
(error "ELEMENTS must be a list"))
(let ((list (symbol-value list-var)))
(if list
(setcdr (last list) elements)
(set list-var elements)))
(symbol-value list-var))
1 append
不会复制最终元素,而是直接将其用作新列表的尾部,因此该部分是相同的。但是,如果对原始列表对象(或其某些部分)有其他引用,那么 将是复制该列表(通过append
)和仅扩展它之间的功能差异(与setcdr
)。当然,你真正想要的那两个结果中的哪一个取决于你。
答案 1 :(得分:5)
我的init文件中有以下内容,允许添加多个元素。我不知道循环添加的项目有多高效,但它可以防止重复的元素。
(defun jlp/add-to-list-multiple (list to-add)
"Adds multiple items to LIST.
Allows for adding a sequence of items to the same list, rather
than having to call `add-to-list' multiple times."
(interactive)
(dolist (item to-add)
(add-to-list list item)))
答案 2 :(得分:2)
如果您不在乎订购:
(setf var (cl-list* elt1 elt2 elt3 var))
list*
的最后一个参数成为结果列表的尾部。
答案 3 :(得分:0)
如果要过滤重复元素,也可以使用 dash.el。
(setq list1 (-union list1 list2))