これで、Emacs 24にレキシカルスコープの変数が追加されました。もちろん、動的スコープの変数もあります。これは両方があるので、変数がどのような種類のスコープを持っているかについてはかなり混乱しています。レキシカルバインディングが有効になっているときを制御する変数lexical-binding
があります。私はdefvar
について何かを読んで、今や動的スコープの変数を宣言していると思いますが、一般的にはかなり失われています。 Emacs 24の新しいスコープ規則のどこかで良い説明がありますか?あるいは、別の言い方をすれば、Emacs 24用に書かれたEmacs Lispコードの変数を見ると、その変数がどのスコープを使用しているかをどのようにして知ることができますか?Emacs 24の変数スコープの新しい規則は何ですか?
答えて
このマニュアルは最終的な情報源です。ここからスタート:
Chのを私はグラム(elisp) Variable Scoping
RET
私はもともとこの答えではマニュアルが、(Emacsの24.0.90.1にさかのぼる)、その情報を引用していたの外にわずかでした日付。使用しているバージョンの情報が正しいように、Emacsの中からマニュアルを読む方がよいでしょう。
あなたは、特に、Webページ上の現在のバージョンを、それを読みたい場合は次のとおりです。
http://www.gnu.org/software/emacs/manual/html_node/elisp/Variable-Scoping.html
はあなたがちょうど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-binding
をeval
に渡された第2引数に設定しているかのようです。 (A)に対する答えは、ではなく、で、 `eval '呼び出しを含むバッファです。想像上のバッファです。
Lispマクロの場合、マクロ展開されたコードが実行されているときは、展開されたコードがマクロを呼び出すコードを含むバッファに書き込まれているかのようになります。したがって、この場合の(A)に対する答えは、ではなく、マクロを定義したバッファですが、マクロを呼び出したコードが存在するバッファです。
大きな説明。ありがとう! – killdash9
- 1. C++プライベート変数スコープ規則
- 2. Clojureのスコープ規則
- 3. Javaのスコープ規則
- 4. haskellの複数の型変数の順序の規則は何ですか?
- 5. 含まれているサブルーチンの変数と関数のスコープ規則
- 6. booleanを返す関数の命名規則は何ですか?
- 7. ローカル変数の通常のjavascript jQuery命名規則とは何ですか?
- 8. winapi関数の宣言規則は何ですか?
- 9. __func関数の規則は何ですか?
- 10. Java MVCパターンの変数宣言の規則/規則?
- 11. のEmacs 24:モードラインスタイル
- 12. 新しいiOSデバイスの命名規則
- 13. robots.txtがない場合の規則は何ですか?
- 14. 構造体所有関数の錆のスコープ規則
- 15. 新しいbashコマンドの命名規則はありますか?
- 16. ジェネリックと規則の規則の規則
- 17. EmacsのPythonシェル24?
- 18. クラスコンストラクタ内の変数の命名規則
- 19. ココアのインスタンス変数の命名規則
- 20. 'angular2-input-mask'の24時間正規表現は何ですか?
- 21. 私のケーキのテーブルの命名規則は何ですか?
- 22. Javaで副作用のある関数の命名規則は何ですか?
- 23. C++のmain関数の戻り値の規則は何ですか?
- 24. 変数\プロパティの命名規則
- 25. Go:スライス変数/パラメータの命名規則?
- 26. Oracleストアド・プロシージャ変数の命名規則
- 27. インスタンス変数への命名規則
- 28. clojureの通常の命名規則は何ですか?
- 29. Javascriptのグローバルオブジェクトの標準命名規則は何ですか?
- 30. スタイリングとイベントのCSSクラスの命名規則は何ですか?
Emacs 24をインストールしている場合、この情報は情報に記載されています。 "Emacs Lisp"ノードを開き、索引を検索するために「i」を押します。 –
私は23と24の両方をインストールしていますので少し混乱しました。 「Elisp」と「Elisp(emacs-snapshot)」の両方のエントリがありました。私は今それを見る。また、私は時々、Emacsが適切なドキュメントを持っているプロジェクトの一つであることを忘れています。 –