为什么两个不同的宏函数在 Nim 中共享变量命名空间?

问题描述

下面的代码无法编译,因为 let a 变量的重新声明。

但如果第二个 test 模板注释掉它会起作用。

为什么会这样,以及如何解决

playground

template test*(name: string,body) =
  block: body

template test*(name: string,group: string,body) =
  block: body

test "a1":
  let a = 1

test "a2":
  let a = 1

解决方法

第一个模板的 body 参数会进行类型检查,因为在它上面有一个重载,其中在同一个地方有一个类型化的参数。我认为您现在最好的选择是删除组上的 : 字符串注释。为了解决这个问题,Nim 需要在这种情况下改变它的重载语义,在这种情况下,很明显参数不匹配,但这可能是不可预测的。

感谢 hlaaftanaGitHub Issue

中提供答案

所以固定代码是:

template test*(name: string,body) =
  block: body

template test*(name: string,group,body) =
  block: body

test "a1":
  let a = 1

test "a2":
  let a = 1