emacs - 我应该将 Emacs Lisp 中的 add-to-list 称为破坏性函数吗?

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

是否应该将 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/

相关文章:

emacs - 用于比较文档各部分的Emacs技术?

emacs - 如何在emacs中选择(标记)C函数的主体?

recursion - 如何避免 Clojure 中每个宏递归的附加括号级别

node.js - 我可以使用swank-js在js2模式下完成node.js API吗?

emacs - Emacs 中的 eval 命令到其他缓冲区

emacs - 在 babel-execute-subtree 中运行多个 block 而不回答 yes

lisp - 如何检查另一端是否已从单个线程关闭我的套接字流?

emacs - 在 emacs 中最大化/恢复窗口

emacs - 如果要编程Emacs,ELisp要学习的最重要部分是什么?

debugging - Elisp:符号作为变量的值在 let* 和 (lambda) 中是无效的