2011-10-04 23 views
18

これで、Emacs 24にレキシカルスコープの変数が追加されました。もちろん、動的スコープの変数もあります。これは両方があるので、変数がどのような種類のスコープを持っているかについてはかなり混乱しています。レキシカルバインディングが有効になっているときを制御する変数lexical-bindingがあります。私はdefvarについて何かを読んで、今や動的スコープの変数を宣言していると思いますが、一般的にはかなり失われています。 Emacs 24の新しいスコープ規則のどこかで良い説明がありますか?あるいは、別の言い方をすれば、Emacs 24用に書かれたEmacs Lispコードの変数を見ると、その変数がどのスコープを使用しているかをどのようにして知ることができますか?Emacs 24の変数スコープの新しい規則は何ですか?

+2

Emacs 24をインストールしている場合、この情報は情報に記載されています。 "Emacs Lisp"ノードを開き、索引を検索するために「i」を押します。 –

+0

私は23と24の両方をインストールしていますので少し混乱しました。 「Elisp」と「Elisp(emacs-snapshot)」の両方のエントリがありました。私は今それを見る。また、私は時々、Emacsが適切なドキュメントを持っているプロジェクトの一つであることを忘れています。 –

答えて

21

このマニュアルは最終的な情報源です。ここからスタート:

Chのを私はグラム(elisp) Variable ScopingRET

私はもともとこの答えではマニュアルが、(Emacsの24.0.90.1にさかのぼる)、その情報を引用していたの外にわずかでした日付。使用しているバージョンの情報が正しいように、Emacsの中からマニュアルを読む方がよいでしょう。

あなたは、特に、Webページ上の現在のバージョンを、それを読みたい場合は次のとおりです。
http://www.gnu.org/software/emacs/manual/html_node/elisp/Variable-Scoping.html

3

はあなたがちょうどC-x C-eか理由がなかったので、いくつかのコードは、どちらか(Emacsで段階的に評価されているとしましょうEmacs Lispファイルがロードされている、またはフックの関数が実行されているなど)、Emacsはそのコード内でmy-abcを評価しようとしています。おそらくmy-abcはそのコード内のローカル変数であるか、宣言されていないかもしれませんし、グローバル値などがあるかもしれません。とにかく、現在のステップはmy-abcの評価です。その時点で、Emacsは、語彙スコープを使用してmy-abcを評価するかどうかを決定するために、2つの点だけをチェックします。

Emacsの最初のチェックは "my-abc特別な変数ですか?"です。過去の任意の時点で(defvar my-abc ...)または(defcustom my-abc ..)などが実行された場合、その質問に対する答えは「はい」です。他のEmacs Lispファイルをロード中に(defcustom my-abc ..)が実行されたか、またはスクラッチバッファに(defvar my-abc ...)が含まれているコードが評価された可能性があります。もし何らかの理由で答えがイエスならば、Emacsは動的スコープを使ってmy-abcと評価します。

答えが「いいえ」の場合、Emacsは(A)「私がEmacsを踏んでいるこのコードはどこですか?」(my-abcを含んでいます)をチェックします。これは(B) "現在のバッファは今何ですか?"ではありません。バッファでCx Ceを押したばかりの場合、foo.elと入力し、Cx ceを押した式にmah-stuff.elで定義されたmah-helloという関数の呼び出しが含まれていて、mah-hello関数本体にmy-helloという名前の関数がmy-stuff.elで定義されていて、my-helloという関数本体に変数​​my-abcが含まれていた場合、Emacsが最終的にmy-helloの実行に達したときに、my-abcを評価しようとしているとき、Emacsが質問Aを求める時点でmy-stuff.elそれ自体に。開始式を含むバッファfoo.elではありません。

次にEmacsは "lexically scoped bufferであるmy-stuff.elです。言い換えれば、そのバッファにはlexical-bindingが本当ですか?"yesの場合、Emacsはレキシカルスコープを使用してmy-abcを評価し、そうでなければダイナミックスコープを使用して評価します。

一部の更新:コードがデータとして引用され、eval関数に渡されると、(A)に対する答えはバッファになりません。それでも、evalがコードを配置する仮想バッファを構成し、そのバッファのバッファローカル値lexical-bindingevalに渡された第2引数に設定しているかのようです。 (A)に対する答えは、ではなく、で、 `eval '呼び出しを含むバッファです。想像上のバッファです。

Lispマクロの場合、マクロ展開されたコードが実行されているときは、展開されたコードがマクロを呼び出すコードを含むバッファに書き込まれているかのようになります。したがって、この場合の(A)に対する答えは、ではなく、マクロを定義したバッファですが、マクロを呼び出したコードが存在するバッファです。

+0

大きな説明。ありがとう! – killdash9

関連する問題