3

这是我要编译的代码:

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

defineSomething(42);

它完美地工作。我的宏里有我想要的一切我可以用我自己的方式操作员工。

但后来我认为,最好将幻数删除到一些 const 设置:

const MAGIC_AMOUNT:int = 42

# Whole lot of strings
defineSomething(MAGIC_AMOUNT)

此代码失败。因为MAGIC_AMOUNT字面上不是整数值,不像42幻数。

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

4

2 回答 2

3

默认情况下,宏将接收 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
于 2015-07-08T16:54:02.347 回答
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的参数类型传递给其他类型。

于 2015-07-07T20:42:37.297 回答