Emacs Lisp setqとdefvarEmacs Lispの違いは何ですか?
/programming/3855862に同じ質問の一般的なLispバージョンがあります。Elispでも同じですか?
Emacs Lisp setqとdefvarEmacs 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バインディングのようなものです(グローバルスコープモードがアクティブであるかどうかに応じて、動的/字句スコープ規則を使用します)。 .......)
setqvar(オカレンス)がローカルであるかどうかに関係なく、var値を設定します。defvarvarをグローバルとして宣言します。(「バッファローカル」も可能ですlocal-variable-p。)関数argまたはbyとしてバインドされたvarオカレンスletは、通常の意味では「ローカル」です。letetcなどによってバインドされたvar がグローバル(またはバッファローカル)である場合、そのための期間/スコープで、ローカルバインド(通常の意味)が作成されletます。そのバインディングスコープ内でsetq、ローカル値を変更します。varが発生するのは、varが発生するよりもローカル(スタック上)またはグローバル(ヒープ上)の方が適切です。
M-x report-emacs-bug他の人がそれをより簡単にするのを助けるかもしれない改善を提案することはあなたにとって役に立つかもしれません。