【问题标题】:statement not allowed after 'return', 'break', 'raise', 'continue'在“return”、“break”、“raise”、“continue”之后不允许使用语句
【发布时间】:2018-04-03 15:55:36
【问题描述】:
proc myproc(T: typedesc): string =
  when T is bool:
    return "bool"
  when T is float:
    return "float"

echo myproc(bool)

错误:在'return'、'break'、'raise'之后不允许声明, 'continue' 或使用 noreturn pragma 进行 proc 调用

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

【问题讨论】:

    标签: static-analysis compile-time nim-lang


    【解决方案1】:

    真正的问题是:任何人都可以通过编译这段代码获得什么好处,而你所要做的就是编写

    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: 会带来什么真正的好处。

    如果您仍然不相信,我邀请您提供示例代码,您认为您会从中受益,以便我们进行讨论。

    【讨论】:

    • 你缺乏想象力。对于这种不完整的不相交 if 的情况,C 编译器也会发出警告(或不发出警告);如果静态分析器发现可能没有返回的潜在流或路径。 C# 编译器做得非常完美,这是一个错误。而且它不会强加这种白痴限制。
    • @v.oddou whenif 不同。如果您的目标只是抱怨该语言不能完全按照您的意愿工作,那么这不是执行此操作的正确平台(使用forum)。如果你的问题是它是否可能:当然,它是。如果您的问题是尽管有可能但为什么没有实施,那么最可能的答案仍然是因为没有任何好处
    • 好评论,但你还没有证明因为没有任何好处,事实上,我说的恰恰相反。因为某些嵌套级别为when 的表达式在编写为断开连接的系列时更容易理解。或者当条件没有共同点时。例如:Fowler 保护条款。例如when sizeof(int) > 4 return LFLF when T is bool... 我看到了将子句分开的好处。
    • 哦,是的,我所有的问题都伴随着咆哮,因为这种语言对我的神经来说是一场灾难。这是粗暴和不受欢迎的。
    • @v.oddou 添加了证明 fwiw;您可能希望将实际代码添加到您认为有好处的问题中。
    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多