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.el
se compila byte, ¿ some-variable
se 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.el
usa enlace léxico, peromacro.el
no lo hace. - Si
macro.el
usa enlace léxico, perofunction.el
no lo hace.
¿Hace alguna diferencia si some-var
se 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-binding
variable.fuente