'return','break','raise','continue'后不允许声明

时间:2018-04-03 15:55:36

标签: static-analysis compile-time nim

proc myproc(T: typedesc): string =
  when T is bool:
    return "bool"
  when T is float:
    return "float"

echo myproc(bool)
  

错误:'return','break','raise'后不允许声明,   '继续'或使用noreturn pragma进行调用

使用elif有效,但要求链接的when / else语句是不合理的吗?

1 个答案:

答案 0 :(得分:2)

真正的问题是:当你需要做的只是编写时,任何人都可以从允许编译代码中获得什么

when T is bool:
  return "bool"
elif T is float:
  return "float"

您的代码不会缩短,也不能做其他事情无法实现的事情。因此,允许您的代码编译只会给编译器带来额外的负担而不会有任何投资回报。我的代码也使意图更清晰:要么做一件事,要么做其他事情,而你的代码说也许这样做,也许那样做

我不知道实现细节,但我认为编译器证明T is boolT is float是不相交的并不是一件容易的事。

编辑证明没有任何好处

假设我们的身体以

开头
when T is bool: return "bool"

显然,如果T is bool在编译时计算为true,则会编译无条件return语句,并且可能后面没有语句。也就是说,when之后的所有语句必须在编译时被吞下,除非上述条件为false

我相信在编译时基本上可以吞下两个不同的语句:其他when语句和对模板或宏的调用(它们可能返回一个空的AST节点)。我已经证明,成功的when可能会被elif取代而不会失去任何表现力。现在让我们看一下宏或模板调用:

when T is bool: return "bool"
call(T)

这可以通过将其重写为:

轻松解决
when T is bool: return "bool"
else: call(T)

我承认我们这里有更多的代码,但是我没有看到我们从遗漏else:中获得任何实际收益。

如果您仍然不相信,我邀请您提供您认为可以获得实际利益的示例代码,以便我们进行讨论。