Как макрос `quote` выполняет интерполяцию?

#rust #scope #macros #hygiene

#Ржавчина #область видимости #макросы #гигиена

Вопрос:

Как quote (декларативные) и proc_quote (процедурные) макросы позволяют интерполировать локальные переменные?

Поскольку (декларативные) макросы гигиеничны, я бы ожидал, что они не смогут получить доступ к среде, в которой они вызываются.

Ответ №1:

Поскольку (декларативные) макросы гигиеничны, я бы ожидал, что они не смогут получить доступ к среде, в которой они вызываются.

Хотя почему?

 vec![a, b, c]
  

работает нормально.

Гигиеничность макросов не означает, что они не могут получить доступ к среде, в которой они вызываются (это сделало бы их совершенно бесполезными), это означает, что они случайно не влияют на среду, в которой они вызываются, то есть внутренние символы макроса не будут ни просачиваться, ни конфликтовать с символами среды.

Например, при использовании макросов C имена внутри и за пределами макроса находятся в одном и том же пространстве имен, поэтому возможны коллизии и странные побочные эффекты.

Комментарии:

1.Я думаю, что ОП может быть сбит с толку тем, что макрос like format! нуждается в том, чтобы первый параметр был постоянным литералом. Этот вопрос был бы лучше, если бы он объяснял, почему они разные.

2. Я не понял, что макрос расширяется до старой среды, то есть «как он обращается к ней» 🙂 Он просто вообще не обращается к нему; интерполяция просто отмечает, что что-то должно обрабатываться как переменная, не заключаемая в кавычки, а, например, перемещаемая в метод.

3. @mcarton Из того, что я получил из источника библиотеки, format! и друзья, в конечном счете, являются внутренними для компилятора, что, следовательно, требует, чтобы строка была известна во время компиляции.