Macros Nim宏参数

Macros Nim宏参数,macros,nim-lang,Macros,Nim Lang,下面是我要编译的代码: macro defineSomething(amount:expr):stmt= var amountInt = intVal(amount).int # Boring staff defineSomething(42); 它工作得很好。我的宏中有我想要的一切,我可以用我自己的方式操作员工 但我认为,最好将幻数删除到一些常量设置: const MAGIC_AMOUNT:int = 42 # Whole lot of strings defineSomet

下面是我要编译的代码:

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\u AMOUNT
42
MAGIC number不同,字面上不是整数值

那么,如何在nim中的宏中获取我的变量值呢?

表达式是。由于您确实希望获得整数,因此可以指定参数,然后编译:

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

默认情况下,宏将接收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

哦,我刚刚尝试了
macro defSomething(amount:int):stmt=
,它与
amount.intVal.int
一起工作。所以,这很有帮助。