Nehmen Sie das folgende Beispielmakro, definiert in macro.el
.
(defmacro some-macro (&rest body)
`(let ((some-variable 1))
,@body))
Nehmen Sie die folgende Funktion, die in einer anderen Datei definiert ist function.el
.
(defun some-function ()
(some-macro (do-something)))
Wann function.el
wird Byte kompiliert, wird some-variable
unter lexikalischer oder dynamischer Bindung gebunden?
Ich verstehe, dass dies davon abhängt, ob die Datei verwendet -*- lexical-binding: t; -*-
wird. Meine Frage bezieht sich daher speziell auf die folgenden Situationen:
- Wenn
function.el
lexikalische Bindung verwendet, abermacro.el
nicht. - Wenn
macro.el
lexikalische Bindung verwendet, aberfunction.el
nicht.
Macht es einen Unterschied, ob some-var
es im Inneren als global (mit einer Defvar) deklariert wurde function.el
? Wenn ja, interessiert mich speziell der Fall, in dem dies nicht der Fall ist .
elisp
elisp-macros
lexical-scoping
Malabarba
quelle
quelle
Antworten:
Die Art des Gültigkeitsbereichs, die für das
(let ((some-variable ..)) ...)
in Ihrem Beispiel aktiv ist, ist diejenige, die am Ort des Makroaufrufs aktiv ist (dh diejenige, die für giltsome-function
).Ein Makro kann durch Überprüfen des Werts der
lexical-binding
Variablen erkennen, welche Art von Gültigkeitsbereich für den zurückgegebenen Code verwendet wird.quelle