微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么两个不同的宏函数在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。