【发布时间】:2018-12-11 14:39:11
【问题描述】:
我正在尝试创建指向过程(或等效过程)的指针。当我做这样的事情时:
import random
# maybe a command line argument
let choice = "some algorithm"
proc withoutSideEffects(): int = 0
proc withSideEffects(): int = rand(10)
let procPtr =
case choice
of "algorithm1": withoutSideEffects
of "algorithm2": withSideEffects
(...)
编译器抱怨,要求 case 表达式中的所有过程都必须具有 pragma {.noSideEffects.}
我有以下问题:
- 有没有办法解决这个问题?
- 如果不是,这是故意的吗(可能是为了阻止糟糕的设计)?
- 有哪些替代方案?
【问题讨论】:
-
问题似乎在于编译器正在从第一个分支中扣除变量类型。如果你交换分支,它就可以正常工作,因为 proc{.noSideEffects,gcsafe.} 可以转换为 proc{.gcsafe.}。
-
但是,我不确定如何将 procPtr 明确标记为具有副作用,这将是正确的解决方案。
-
我明白了。我很高兴至少有一个解决方案(这也不太方便)。谢谢!
-
我已在github.com/nim-lang/Nim/issues/12642 上将此作为问题打开。
标签: function-pointers side-effects nim-lang