2017-08-01 93 views
2

我的代码是这样的创建列表:的Emacs Lisp:使用报价在本地范围内(例如,功能范围)

(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

+0

你的问题已经有答案了:'quote'不*创建*任何东西,它只是让你指的是硬编码到代码的值。 – Stefan

回答

3

你这样做:

(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)) 
+0

这听起来很合理。所以你的意思是当在本地范围内使用引用表达式创建列表时,elisp将创建临时变量,但这不会发生在全局范围内。为什么elisp使它们与众不同,因为它有点混乱。 – hw9527

+0

临时变量是读者在每次遇到报价时创建的。这并不是暂时的,它是函数定义的一部分。所以当你运行这个函数时,你可以修改你的函数定义。 –