add-to-list 通常用于将元素添加到列表(如果该元素不在列表中)。
(let* ((aa (list 1 2 3))
(bb aa))
(add-to-list 'aa 0)
(list :aa aa :bb bb))
=> (:aa (0 1 2 3) :bb (1 2 3))
是否应该将 add-to-front 称为破坏性函数,因为它改变了名称 aa 的含义?或者它应该被称为非破坏性,因为 aa 用来指向的列表是完整的?
(let* ((cc (list 1 2 3))
(dd cc))
(add-to-list 'cc 0 t)
(list :cc cc :dd dd))
=> (:cc (1 2 3 0) :dd (1 2 3))
对于想知道为什么 bb 和 dd 等于 (1 2 3) 的 Emacs 新手,请随意为此打开一个单独的 stackoverflow 问题,并留下带有“添加评论”按钮的链接。如果 Emacs 新手想知道为什么其他新手会想知道这一点,请将 (add-to-list 'aa 0) 替换为 (setcar aa 111) 并查看。
对于不使用 Emacs 的 Lispers,这里是添加到列表的简化定义
(defun simple-add-to-list (list-var element &optional append)
"Add ELEMENT to the value of LIST-VAR if it isn't there yet.
If ELEMENT is added, it is added at the beginning of the list,
unless the optional argument APPEND is non-nil, in which case
ELEMENT is added at the end.
The return value is the new value of LIST-VAR."
(let ((lst (symbol-value list-var)))
(if (member element lst)
lst
(set list-var
(if append
(append lst (list element))
(cons element lst))))))
最佳答案
如果它能够修改传递给它的列表,那么它就是破坏性的。
如果一个函数通过符号获取列表,它应该被自动假定为具有破坏性,不是吗?否则为什么不直接获取列表本身呢?
关于emacs - 我应该将 Emacs Lisp 中的 add-to-list 称为破坏性函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16769669/