マクロの変数スコープはどのように決定されますか?


11

で定義されている次のサンプルマクロを見てみましょうmacro.el

(defmacro some-macro (&rest body)
  `(let ((some-variable 1))
     ,@body))

そして、別のファイル定義された次の関数を取りますfunction.el

(defun some-function ()
  (some-macro (do-something)))

ときにfunction.elバイトコンパイルされ、うsome-variable字句または動的バインディングでバインドできますか?

これはファイルがを使用しているかどうかに依存することを理解している-*- lexical-binding: t; -*-ため、私の質問は特に以下の状況に関係しています。

  1. 場合function.el結合が、用途は字句macro.elません。
  2. 場合macro.el結合が、用途は字句function.elません。

some-var内部で(defvarを使用して)グローバルに宣言されている場合、違いはありfunction.elますか?もしそうなら、私はそれがそうでない場合に特に興味があります。


Jisang Yooがyoo2080.wordpress.com/2013/08/14/…でこれを詳細に説明したと思います
phils

確かではありませんが、マクロ展開は、マクロ定義からではなく、展開サイトからバインディングセマンティクスを継承していると思います。拡張は実際には呼び出し側で置き換えられるため、これは理にかなっています。しかし:なぜ知りたいのですか?これらの詳細に実際に依存するコードを書くつもりですか?
lunaryorn 2014

@lunaryorn マクロは完全にこれに依存していないが、それはそれはで使われているファイルの結合を尊重していない場合、それはユーザーに意外なバグが生じる可能性があります。
Malabarba

@Malabarba次に、ターゲットバッファーのバインディングに依存しない方法でマクロを記述します。または、マクロを使用しないでください。
lunaryorn 14

@lunaryorn私ははっきりしていませんでした。マクロは単なるletフォームであり、どちらの方法でもアドバタイズされたとおりに機能します。このletフォームが展開されたファイルで指定されたスコープに従うことを確認したいだけです。この質問は、それが自動的に行われるのか、それともマクロでコーディングする必要があるのか​​を見つけるための一部です。
Malabarba 14

回答:


9

(let ((some-variable ..)) ...)あなたの例のでアクティブなスコープの種類は、マクロ呼び出しのサイトでアクティブなスコープです(つまり、に適用されるスコープsome-function)。

マクロは、lexical-binding変数の値をチェックすることにより、返されるコードにどのスコープが使用されるかを知ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.