【发布时间】:2018-04-02 14:18:59
【问题描述】:
如果我想制作一个可以接受 2 个 untyped 参数的模板,并通过 do 表示法传递它们,当我省略第二个 do 时,我想有一种方法可以在参数默认值的形式。像这样:
template tpl(x: bool, body: untyped, bodyFinally: untyped): void =
if x: body
else: bodyFinally
#call site:
var r: int
tpl(true) do:
r = 2
do:
raise newException(Exception, "")
这行得通,但是:
template tpl(x: bool, body: untyped, bodyFinally: untyped = discard): void =
# same rest
错误:应为表达式,但发现“关键字丢弃”
不接受默认值,而且消息很奇怪,discard 不是表达式。
解决方法的尝试:
template tpl(x: bool, body: untyped, bodyFinally: untyped = proc()): void =
# same rest
然后我们得到:
错误:表达式 'proc ()' 的类型为 'type proc (){.closure.}' 并且 必须丢弃
我已经准备好接受这一点,尽管我发现这个 discard 要求毫无用处,而且是语言的麻烦,因为它迫使我们在像这里这样的通用代码中进行不舒服的体操。
让我们再次编辑:
template tpl(x: bool, body: untyped, bodyFinally: untyped = proc()): void =
if x: body
else: discard bodyFinally
现在结果是:
错误:内部错误:expr(nkProcTy);未知节点类型
【问题讨论】:
标签: templates nim-lang default-arguments