在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)))
Run Code Online (Sandbox Code Playgroud)
该功能完成了我想要的功能,但我想知道在Emacs lisp中是否存在类似这样(或更好)的东西.我不想重新发明轮子.
更新1:Stefan在下面指出此代码不适用于词法范围.有没有办法让它发挥作用?
更新2:以前我认为重复过滤会很好,但事实并非如此.我确实需要重复.
这几乎相当于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))
Run Code Online (Sandbox Code Playgroud)
1 append不会复制最终元素,而是直接将其用作新列表的尾部,因此该部分是相同的.但是,如果存在对原始列表对象(或其某些部分)的附加引用,则在复制该列表(via )和仅扩展它(with )之间将存在功能差异.当然,你真正想要的那两个结果中的哪一个取决于你.appendsetcdr
我在我的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)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5787 次 |
| 最近记录: |