ch10.md 2.6 KB

Глава 10. Макросы

Как мы уже видели, шаблоны можно использовать для решения задач, с которыми не справляются обычные процедуры. В некотором смысле шаблон мощнее процедуры. Макрос еще мощнее шаблона, потому что он может анализировать передаваемый ему блок кода.

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

Другими словами, код довольно императивный и низкоуровневый.

Следующий пример — макрос, который преобразует полученный блок кода в пустой список операторов (newStmtList()). Это означает, что блок кода игнорируется компилятором:

  import std/macros                       # 1
  macro disable(body: untyped): untyped = # 2
    result = newStmtList()                # 3
  disable:                                # 4
    drawText(10, 10, "Disabled piece of code!", Blue)
  • 1 Для работы с макросами требуется API, который находится в std/macros.
  • 2 Объявление макроса похоже на объявление шаблона, за исключением того, что ключевое слово template заменено на macro.
  • 3 Результатом работы макроса является синтаксическое дерево, представляющее собой пустой список операторов.
  • 4 Для вызова макроса используется тот же синтаксис, что и для процедур и шаблонов.

В книге можно найти множество примеров использования макросов, но лучшие из них слишком сложны для этого вводного раздела. На этом наш первый экскурс в Nim заканчивается. Пора нырять в окоп!