BorrowCheck › Ядро языка Rust

Макросы

macro_rules!, гигиена, повторения, процедурные макросы, derive и атрибуты.

Тема объясняет декларативные макросы macro_rules!: как правила сопоставляются по порядку, что принимают фрагменты expr, ty, tt, ident и pat, почему подставленный expr ведёт себя как единое выражение и какие токены могут следовать за фрагментом (follow-set). Раздел о гигиене (hygiene) разбирает, где разрешаются имена из тела макроса, почему локальные переменные и метки циклов не смешиваются с кодом вызывающего, зачем нужен $crate и как макрос становится видимым за пределами модуля. Вопросы о повторениях проверяют разделители, операторы *, + и ?, вложенные повторения, рекурсивный разбор по токенам (tt munching), подсчёт аргументов и предел рекурсии раскрытия. Раздел о процедурных макросах объясняет, почему они живут в отдельном крейте с proc-macro = true, как они получают TokenStream, разбирают его через syn, порождают код через quote! и сообщают об ошибке через compile_error!. Последний раздел посвящён derive и встроенным макросам: какие границы добавляет derive, к чему его можно применить, как работает derive(Default) у перечисления, что возвращают stringify! и line! и почему строка формата проверяется при сборке.

44 вопроса: базовый уровень — 18, средний — 22, углублённый — 4. 5 справок, 31 источник.

Разделы

  1. macro_rules! и фрагменты
  2. Гигиена
  3. Повторения и рекурсия
  4. Процедурные макросы
  5. derive, атрибуты и встроенные макросы

Предыдущая тема: Unsafe, UB, FFI · Следующая тема: Тесты, бенчмарки, профилирование