Emacs lisp:在本地范围内使用引号创建列表(例如函数范围)

Emacs lisp: create list using quote in local scope(e.g function scope)

我的代码是这样的:

(defun test () "Test."
  (setq lista '(A))
  (push 'B lista)
  (nreverse lista))

(message "%s" (test))  ; Output is (A B)
(message "%s" (test))  ; Output is (B A B)

这似乎很奇怪,因为我希望结果是

(A B)
(A B)

如果我用 (setq lista (list 'A)) 替换 (setq lista '(A)),我会得到预期的结果。我认为列表创建方法导致了差异,但我不知道细节。

我的 emacs 版本是 GNU Emacs 24.5.1

您正在这样做:

(defvar t1 '(A))
(defun test ()
  "Test."
  (setq lista t1)
  (push 'B lista)
  (nreverse lista))

您修改了作为代码一部分的 cons 单元格:在第一次调用后,t1 变为 '(A B)

通过使用 (list) 而不是 (quote) 来避免它:

(defun test ()
  "Test."
  (setq lista (list 'A))
  (push 'B lista)
  (nreverse lista))