1

Python 3 には、少なくとも読み取り専用の目的で、現在のスコープの名前付きの値を関数に渡すことができる関数locals()ansがあります。globals()

emacs lisp で、文字列補間の関数を書きたいと思っています。この目的のために、呼び出しスコープのレキシカル変数にアクセスする必要があります。マクロが変更されたときに他のファイルの再コンパイルを回避したいので、マクロを使用する明白な解決策は実行できません。

emacs lispでこれを行う可能性はありますか?

私はすでにこの機能を試しましたが、 では機能しlisp--local-variablesません。lexical-bindingt

Elisp ドキュメントからの関連する引用

(内部的には、レキシカル環境はシンボルと値のペアの連想リストであり、連想リストの最後の要素はコンス セルではなくシンボル 't' です。このような連想リストは、'eval' 関数の 2 番目の引数として渡すことができます。 , フォームを評価するレキシカル環境を指定するため. *Note Eval::. ただし、ほとんどの Emacs Lisp プログラムは、この方法でレキシカル環境と直接やり取りするべきではありません; デバッガーのような特別なプログラムだけです.)


現在、Emacs Lisp クロージャー オブジェクトは、シンボル `closure' を最初の要素として持つリスト、2 番目の要素としてレキシカル環境を表すリスト、残りの要素として引数リストと本体フォームで表されます。

 ;; lexical binding is enabled.
 (lambda (x) (* x x))
      => (closure (t) (x) (* x x))

しかし、クロージャーの内部構造が Lisp の世界の残りの部分に「公開」されているという事実は、内部実装の詳細と見なされます。このため、クロージャー オブジェクトの構造を直接調べたり、変更したりすることはお勧めしません。

4

1 に答える 1