Veja o exemplo de macro a seguir, definido em macro.el
.
(defmacro some-macro (&rest body)
`(let ((some-variable 1))
,@body))
E tomar a seguinte função, definida em um arquivo diferente , function.el
.
(defun some-function ()
(some-macro (do-something)))
Quando function.el
é compilado por byte, será some-variable
vinculado sob ligação lexical ou dinâmica?
Entendo que isso depende de o arquivo ser usado -*- lexical-binding: t; -*-
, portanto, minha pergunta diz respeito especificamente às seguintes situações:
- Se
function.el
usa ligação lexical, masmacro.el
não. - Se
macro.el
usa ligação lexical, masfunction.el
não.
Faz diferença se some-var
foi declarado global (com um defvar) por dentro function.el
? Se isso acontecer, estou especificamente interessado no caso em que não ocorreu .
elisp
elisp-macros
lexical-scoping
Malabarba
fonte
fonte
Respostas:
O tipo de escopo ativo para o
(let ((some-variable ..)) ...)
seu exemplo é o ativo no site da chamada de macro (ou seja, o que se aplicasome-function
).Uma macro pode saber que tipo de escopo será usado para o código retornado, verificando o valor da
lexical-binding
variável.fonte