2017-07-25 6 views
1

私はこのようなelispのコードがあります:私が欲しいものelispの変数バインド

(setq a nil) 
(defun testa (a) (add-to-list a "ABCD")) 
(testa 'a) 

aリスト("ABCD")を作ることであるが、機能testaの引数名は、変数aと同じであるため、ローカルバインディング関数内のaの値はそれ自身であり、関数の外部の値をバインドしません。

私の質問は:変数を外部に名前を変更しないと、まともな解決策がないと回避できないのは、elispの機能ですか?

答えて

1

これはelispの意図した動作です。 elispによる変数スコープの詳細については、the manualに詳しい説明があります。 This postは、スコープの説明にも適しています。

変数への参照を渡すことはできません。ただし、グローバル(または動的)スコープの変数を返すか変更する関数を渡すことは可能です。既に知られている変数を変更する関数を持つことも可能です。

編集:詳細を追加しました。

+1

これは疑問に答えるものではありません。OPが不思議に思う動作を説明するものではありません。リンク先の説明の関連部分を組み込んでください。それ以外の場合、これは本質的にリンクオンリーの回答であり、削除される危険性があります。 – Drew

+1

ありがとうございます。たぶん、私は機能する字句の束縛を使用して関数を定義する必要があります。 – hw9527