Как определяется переменная область видимости для макросов?

11

Возьмите следующий пример макроса, определенный в 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; -*-, поэтому мой вопрос конкретно касается следующих ситуаций:

  1. Если function.elиспользует лексическое связывание, но macro.elне использует.
  2. Если macro.elиспользует лексическое связывание, но function.elне использует.

Имеет ли это значение, если some-varон был объявлен глобальным (с defvar) внутри function.el? Если это так, меня особенно интересует случай, когда это не так .

Malabarba
источник
Я думаю, что Jisang Yoo подробно рассказал об этом на yoo2080.wordpress.com/2013/08/14/…
phils
Я точно не знаю, но могу поспорить, что расширение макроса наследует семантику связывания от сайта расширения, а не от определения макроса. Это имело бы смысл, так как расширение фактически заменено на сайте вызовов. Но: почему вы хотите знать? Намереваетесь ли вы написать код, который на самом деле опирается на эти детали ?!
lunaryorn
@lunaryorn макрос не полностью полагается на это, но он может привести к неожиданным ошибкам для пользователя, если он не
учитывает
@Malabarba Напишите свой макрос так, чтобы он не зависел от привязки в целевом буфере. Или даже лучше, не используйте макрос вообще.
lunaryorn
@lunaryorn Я не совсем понял. Макрос - это просто форма let, и она работает так же, как и в любом случае. Я просто хочу убедиться, что эта форма let соответствует области видимости, указанной в файле, в котором она развернута. Этот вопрос является частью выяснения, происходит ли это автоматически или мне нужно кодировать это в макросе.
Малабарба

Ответы:

9

В (let ((some-variable ..)) ...)вашем примере активная область видимости - это та, которая активна в месте вызова макроса (т. Е. Та, к которой относится some-function).

Макрос может знать, какой вид области действия будет использоваться для кода, который он возвращает, проверив значение lexical-bindingпеременной.

Стефан
источник