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