2017-08-01 57 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

臨時變量是讀者在每次遇到報價時創建的。這並不是暫時的,它是函數定義的一部分。所以當你運行這個函數時,你可以修改你的函數定義。 –