2

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

1 回答 1

2

如果它能够修改传递给它的列表,那么它就是破坏性的。

如果函数通过符号获取列表,则应该自动假定它是破坏性的,不是吗?否则为什么不直接拿清单呢?

于 2013-05-27T09:32:01.523 回答