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))
如果一个人调用一个破坏性的函数,因为它改变了名字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))
对于Emacs新手想知道为什么bb和dd等于(1 2 3),请随意为此打开一个单独的stackoverflow问题,并留下“添加评论”按钮的链接。对于Emacs新手想知道为什么有些新手想知道为什么,用(setcar aa 111)替换(add-to-list'aa 0)并看看。
对于不使用Emacs的Lispers,这里是add-to-list的简化定义
(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))))))
答案 0 :(得分:2)
如果它能够修改传递给它的列表,那么它就是破坏性的。
如果一个函数通过一个符号获取一个列表,它应该被自动假设为破坏性的,不是吗?否则为什么不直接拿这份名单?