Emacs Lisp setq
とdefvar
Emacs Lispの違いは何ですか?
/programming/3855862に同じ質問の一般的なLispバージョンがあります。Elispでも同じですか?
Emacs Lisp setq
とdefvar
Emacs Lispの違いは何ですか?
/programming/3855862に同じ質問の一般的なLispバージョンがあります。Elispでも同じですか?
回答:
あなたは、必要があるのEmacsに尋ねる:この質問をC-h i
(elispのマニュアルを選択し、m Elisp
()、および「defvarの」のためのインデックスを検索しますi defvar
)。ノードの変数の定義に移動します。
Emacsはdoc文字列をdefvar
添付できること、そして変数がすでに値を持っている場合は何もしないことを伝えます。
またdefvar
、値が割り当てられていないの使用についても説明します(defvar foo)
。変数が動的にスコープされるように宣言していることを示しています。
setq
これらのプロパティはありません。
defvar
そして、setq
はEmacs LispとCommon Lispの中で、似ていますが、全く同じではありません。
defvar
(命令型プログラミングスタイルのように)グローバル変数とカスタマイズの規則のように聞こえますが、setqは関数型プログラミング言語のletバインディングのようなものです(グローバルスコープモードがアクティブであるかどうかに応じて、動的/字句スコープ規則を使用します)。 .......)
setq
var(オカレンス)がローカルであるかどうかに関係なく、var値を設定します。defvar
varをグローバルとして宣言します。(「バッファローカル」も可能ですlocal-variable-p
。)関数argまたはbyとしてバインドされたvarオカレンスlet
は、通常の意味では「ローカル」です。let
etcなどによってバインドされたvar がグローバル(またはバッファローカル)である場合、そのための期間/スコープで、ローカルバインド(通常の意味)が作成されlet
ます。そのバインディングスコープ内でsetq
、ローカル値を変更します。varが発生するのは、varが発生するよりもローカル(スタック上)またはグローバル(ヒープ上)の方が適切です。
M-x report-emacs-bug
他の人がそれをより簡単にするのを助けるかもしれない改善を提案することはあなたにとって役に立つかもしれません。