我应该在Emacs Lisp中调用add-to-list一个破坏性的函数吗?

时间:2013-05-27 09:01:03

标签: emacs lisp elisp

如果元素不在列表中,

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))))))

1 个答案:

答案 0 :(得分:2)

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

如果一个函数通过一个符号获取一个列表,它应该被自动假设为破坏性的,不是吗?否则为什么不直接拿这份名单?