在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:以前我认为重复过滤会很好,但事实并非如此.我确实需要重复.
我在我的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)))
这几乎相当于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
不会复制最终元素,而是直接将其用作新列表的尾部,因此该部分是相同的.但是,如果存在对原始列表对象(或其某些部分)的附加引用,则在复制该列表(via )和仅扩展它(with )之间将存在功能差异.当然,你真正想要的那两个结果中的哪一个取决于你.append
setcdr