Возьмите следующий пример макроса, определенный в 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
? Если это так, меня особенно интересует случай, когда это не так .
elisp
elisp-macros
lexical-scoping
Malabarba
источник
источник
Ответы:
В
(let ((some-variable ..)) ...)
вашем примере активная область видимости - это та, которая активна в месте вызова макроса (т. Е. Та, к которой относитсяsome-function
).Макрос может знать, какой вид области действия будет использоваться для кода, который он возвращает, проверив значение
lexical-binding
переменной.источник