如果元素不在列表中,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,这里是 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))))))