Ним параметры макроса

здесь код, который я хочу скомпилировать:

macro defineSomething(amount:expr):stmt=
   var amountInt = intVal(amount).int
   # Boring staff

defineSomething(42);

Это работает отлично. У меня есть все, что я хочу, внутри моего макроса, я могу управлять персоналом по-своему.

Но тогда я думаю, что было бы лучше убрать магический номер в некоторые константные настройки:

const MAGIC_AMOUNT:int = 42

# Whole lot of strings
defineSomething(MAGIC_AMOUNT)

Этот код не работает. Потому что MAGIC_AMOUNT буквально не является целочисленным значением, в отличие от 42 магического числа.

Итак, как получить значение моей переменной внутри макросов в nim?


person Vasiliy Stavenko    schedule 07.07.2015    source источник


Ответы (2)


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

import macros

macro defineSomething(amount: typed):stmt=
  echo getType(amount)
  var amountInt = intVal(amount).int
  echo "Hey ", amount_int

const MAGIC_AMOUNT = 42
defineSomething(43)
defineSomething(MAGIC_AMOUNT)

Или просто используйте обычный int в качестве типа параметра, если вы не хотите, чтобы другие типы также передавались в case в параметре вид внутри вашего макроса.

person Grzegorz Adam Hankiewicz    schedule 07.07.2015
comment
О, я только что попробовал macro defSomething(amount:int):stmt=, и это сработало с amount.intVal.int. Итак, помогло. - person Vasiliy Stavenko; 08.07.2015

По умолчанию макросы будут получать выражения AST, а не значения. Если ваш макрос должен работать с конкретными значениями, вам нужно использовать статические параметры:

macro defineSomething(amount: static[int]): stmt=
  echo "int value: ", amount + 100

const MAGIC_AMOUNT = 42

defineSomething(43)
defineSomething(MAGIC_AMOUNT)

Это будет напечатано во время компиляции:

int value: 143
int value: 142
person zah    schedule 08.07.2015