gpt4 book ai didi

nim-lang - 具有类型化属性的脏模板

转载 作者:行者123 更新时间:2023-12-02 20:42:51 25 4
gpt4 key购买 nike

我已经使用 nim 一段时间了,而不断让我困惑的是模板。我希望它们 - 至少在签名级别 - 像 procs 一样工作,但它们缺少某些功能(例如可选/默认参数 - 这真的让我昨天陷入了困境)

无论如何,我有一个我认为足够简单的使用模板的模式,所以这里有一些代码:

template Kitten*(name: string, age, body: untyped) {.dirty.} =
var kitty_name = name # my {.dirty.} exposes this
echo("Hi, " & name)
if age != 0: echo("wow, " & $age & " years old already!")
body
echo("Bye, " & name)

template Kitten*(name: string, body: untyped) {.dirty.} =
Kitten(name, 0, body)


Kitten("Jimmy"):
echo("It's really nice to meet you, " & kitty_name)
## Ralph and Jimmy cannot co-exist - it's fine, I understand the issue here
# Kitten("Ralph", 5):
# echo("Great that you joined us, " & kitty_name)

编译正确,并且工作正常。因为我的模板很脏,所以可以从 body 中使用 kitty_name。取消注释 Ralph 并注释掉 Jimmy,这也可以正常工作。

然后,我意识到 age 没有关联的类型。我当然不想那样——我真是太傻了!所以我修复了它:

template Kitten*(name: string, age:int, body: untyped) {.dirty.}=

突然间,Jimmy 无法编译。 Ralph 很好 - Ralph 直接使用模板,但是因为 Jimmy 使用了覆盖的(如果该术语甚至适用于模板?)方法,突然间就像主要的 Kitten 关闭了其边界?还不够脏吗?

所以问题是,为什么它有效,为什么失败,它是一个错误还是一个被误解的功能?或者我只是滥用模板?

(p.s.在0.17.0和最新的开发分支上尝试过这个)

最佳答案

我认为这是一个可以解决的编译器错误,但我将提供当前行为的解释。

这里的关键是,在 Kitten 的调用站点,涉及注入(inject)的 kitty_name 变量的 block 无法进行类型检查(由于引用了非现有变量)。它们必须作为原始 AST 传递,这是通过使用模板的无类型参数来指示的。一旦您在同一位置引入另一个不使用 untyped 参数的重载,编译器将尝试在重载决策期间对传入的 block 进行类型检查,并且您将在以下位置收到错误:调用站点(不是像您所假设的那样在模板扩展之后)。

编译器可以使用几个额外的标准来避免错误 - 例如,它可以根据参数的数量排除其中一个重载。这就是为什么我认为这个问题将来可能会得到解决。

要解决此问题,您可以重命名这两个模板,这样它们就不会重载:

template AgedKitten*(name: string, age: int, body: untyped) {.dirty.} =
block:
var kitty_name = name # my {.dirty.} exposes this
echo("Hi, " & name)
if age != 0: echo("wow, " & $age & " years old already!")
body
echo("Bye, " & name)

template Kitten*(name: string, body: untyped) {.dirty.} =
AgedKitten(name, 0, body)

Kitten("Jimmy"):
echo("It's really nice to meet you, " & kitty_name)

AgedKitten("Ralph", 5):
echo("Great that you joined us, " & kitty_name)

过去,我还对类型化参数和非类型化参数之间的差异提供了更深入的解释,您可能也会觉得有用:

typed vs untyped vs expr vs stmt in templates and macros

关于nim-lang - 具有类型化属性的脏模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45517125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com