Tome el siguiente ejemplo de macro, definido en macro.el.
(defmacro some-macro (&rest body)
`(let ((some-variable 1))
,@body))
Y tomar la siguiente función, definida en un archivo diferente , function.el.
(defun some-function ()
(some-macro (do-something)))
Cuando function.else compila byte, ¿ some-variablese vinculará bajo enlace léxico o dinámico?
Entiendo que esto depende de si el archivo se usa -*- lexical-binding: t; -*-, por lo que mi pregunta se refiere específicamente a las siguientes situaciones:
- Si
function.elusa enlace léxico, peromacro.elno lo hace. - Si
macro.elusa enlace léxico, perofunction.elno lo hace.
¿Hace alguna diferencia si some-varse ha declarado global (con un defvar) dentro function.el? Si lo hace, estoy específicamente interesado en el caso donde no lo ha hecho .
elisp
elisp-macros
lexical-scoping
Malabarba
fuente
fuente

Respuestas:
El tipo de alcance activo para el
(let ((some-variable ..)) ...)en su ejemplo, es el activo en el sitio de la llamada de macro (es decir, el que se aplica asome-function).Una macro puede saber qué tipo de alcance se utilizará para el código que devuelve al verificar el valor de la
lexical-bindingvariable.fuente