で定義されている次のサンプルマクロを見てみましょう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; -*-
ため、私の質問は特に以下の状況に関係しています。
- 場合
function.el
結合が、用途は字句macro.el
ません。 - 場合
macro.el
結合が、用途は字句function.el
ません。
some-var
内部で(defvarを使用して)グローバルに宣言されている場合、違いはありfunction.el
ますか?もしそうなら、私はそれがそうでない場合に特に興味があります。
Jisang Yooがyoo2080.wordpress.com/2013/08/14/…でこれを詳細に説明したと思います
—
phils
確かではありませんが、マクロ展開は、マクロ定義からではなく、展開サイトからバインディングセマンティクスを継承していると思います。拡張は実際には呼び出し側で置き換えられるため、これは理にかなっています。しかし:なぜ知りたいのですか?これらの詳細に実際に依存するコードを書くつもりですか?
—
lunaryorn 2014
@Malabarba次に、ターゲットバッファーのバインディングに依存しない方法でマクロを記述します。または、マクロを使用しないでください。
—
lunaryorn 14
@lunaryorn私ははっきりしていませんでした。マクロは単なるletフォームであり、どちらの方法でもアドバタイズされたとおりに機能します。このletフォームが展開されたファイルで指定されたスコープに従うことを確認したいだけです。この質問は、それが自動的に行われるのか、それともマクロでコーディングする必要があるのかを見つけるための一部です。
—
Malabarba 14