setqとdefvarの違いは何ですか


回答:


18

あなたは、必要があるのEmacsに尋ねる:この質問をC-h i(elispのマニュアルを選択し、m Elisp()、および「defvarの」のためのインデックスを検索しますi defvar)。ノードの変数の定義に移動します。

Emacsはdoc文字列をdefvar添付できること、そして変数がすでに値を持っている場合は何もしないことを伝えます。

またdefvar、値が割り当てられていないの使用についても説明します(defvar foo)変数が動的にスコープされるように宣言していることを示しています

setq これらのプロパティはありません。

defvarそして、setqはEmacs LispとCommon Lispの中で、似ていますが、全く同じではありません。

詳細については、詳細をご覧ください。


1
実際、defvarは、指定された値がある場合は「動的スコープ」も宣言します。変数に既に値が設定されている場合でも、trueのままです。OTOH "変数が既に値を持っている場合、それは何もしません"はdefvarのすべての有効な使用に当てはまります(そして、バイトコンパイラーは残りの場合、つまり変数を最初に使用した後に宣言する場合)。
YoungFrog 16

そのため、defvar(命令型プログラミングスタイルのように)グローバル変数とカスタマイズの規則のように聞こえますが、setqは関数型プログラミング言語のletバインディングのようなものです(グローバルスコープモードがアクティブであるかどうかに応じて、動的/字句スコープ規則を使用します)。 .......)
ニコラス

@nicolas:マニュアルを読んでください。setqvar(オカレンス)がローカルであるかどうかに関係なく、var値を設定します。defvarvarをグローバルとして宣言します。(「バッファローカル」も可能ですlocal-variable-p。)関数argまたはbyとしてバインドされたvarオカレンスletは、通常の意味では「ローカル」です。letetcなどによってバインドされたvar がグローバル(またはバッファローカル)である場合、そのための期間/スコープで、ローカルバインド(通常の意味)が作成されletます。そのバインディングスコープ内でsetq、ローカル値を変更します。varが発生するのは、varが発生するよりもローカル(スタック上)またはグローバル(ヒープ上)の方が適切です。
ドリュー

1
@nicolas:時間をかけて読んで、もう一度読んでください。正式な仕様のように、正確であるが把握するのが難しい場合があります。一度それを手に入れたら、M-x report-emacs-bug他の人がそれをより簡単にするのを助けるかもしれない改善を提案することはあなたにとって役に立つかもしれません。
ドリュー

1
@nicolas:ヒープ変数(グローバル変数またはバッファーローカル変数)を理解することから始めます。本当のローカル変数、つまりスタック変数をすでに理解している可能性があります。グーグルも役立つかもしれません。
ドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.