Nim宏出现异常运算符优先级导致编译报错是什么原因?
编译报错原因
该错误由运算符优先级不符合预期导致:
- Nim 通用语法规则中,成员访问运算符
.的优先级高于前缀运算符$,你编写的$(arg).to_upper()会被编译器解析为$(arg.to_upper()),而非你预期的先把arg转成字符串再调用转大写方法的($(arg)).to_upper() - 宏的入参
arg固定为NimNode类型,按照解析后的执行顺序,编译器会先执行arg.to_upper()。由于Nim标识符不区分大小写与下划线,to_upper和标准库的toUpper为同一个过程,该过程仅接收Rune或string类型的入参,传入NimNode类型自然触发类型不匹配报错,和你贴出的报错信息完全对应。
修复方法
添加括号明确运算顺序即可,修改后可正常运行的代码如下:
macro somefn*(arg) = echo ($arg).to_upper() somefn arg
运行后会输出ARG,符合预期逻辑。
与宏优先级规则的关系
该报错和Nim宏的特有规则无关,是Nim通用的运算符优先级规则导致的,就算不在宏代码块内,同样的写法也会触发相同逻辑的优先级问题。
内容的提问来源于stack exchange,提问作者Alex Craft
相关产品推荐
相关产品推荐

