function-pointers - Nim:具有副作用的别名程序
问题描述
我正在尝试创建指向过程(或等效)的指针。当我做这样的事情时:
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.}
我有以下问题:
- 有没有解决的办法?
- 如果不是,这是故意的(也许是为了阻止糟糕的设计)?
- 有哪些替代方案?
解决方案
解决方案是将表达式形式(从第一个分支推断其返回类型)替换为语句形式(没有返回类型的形式)
if/then 表达式存在相同的问题和相同的解决方案
let procPtr = block:
var result:proc():int
case choice
of "algorithm1": result = withoutSideEffects
of "algorithm2": result = withSideEffects
else: discard
result
推荐阅读
- laravel - Laravel vuejs axios response.data 我无法显示数据
- ssl - 使用 Tornado 在 SaltStack 上 8 出现 SSL 错误
- android - 为什么我使用softInputMode,键盘消失后不回原位?
- c# - 如何检测段落标记是否隐藏在 Aspose.Words 中?
- typescript - TypeScript - 将值添加到文字类型的数组
- python - 下载文档 Selenium 和 Firefox
- vba - VBA Word中的图形图表对齐
- ant - ant中的参数化依赖目标
- iis - 哪种机器密钥加密方法最安全?
- c++ - 如何使用单一职责原则