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))
我的代码是这样的:
(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))