2017-08-01 15 views
2

私のコードは次のようであるが引用符を使用してリストを作成します。私は結果がEmacsには、Lisp:ローカルスコープで(例えば関数スコープ)

(A B) 
(A B) 

私の場合であることを期待するので

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

それは奇妙に思えます(setq lista '(A))(setq lista (list '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)) 

をあなたは、コードの一部ですコンスセルを変更します。最初の呼び出しの後、t1'(A B)になります。

(list)代わりの(quote)を使用して、それを避ける:

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

それは妥当な音だ。つまり、elispはローカルスコープで引用式を使用してリストを作成するときに一時変数を作成しますが、グローバルスコープでは発生しません。 elispは少し混乱しているので、なぜそれらが違うのですか? – hw9527

+0

テンポラリ変数は、引用符に遭遇するたびにリーダによって作成されます。それはかなり一時的ではありません:それは関数定義の一部です。したがって、関数を実行すると、関数定義が変更されます。 –

関連する問題