Static analysis 在'之后不允许使用语句;返回'';中断'';提高'';继续';

Static analysis 在'之后不允许使用语句;返回'';中断'';提高'';继续';,static-analysis,compile-time,nim-lang,Static Analysis,Compile Time,Nim Lang,错误:“return”、“break”、“raise”之后不允许使用语句, 使用noreturn pragma进行“continue”或proc调用 使用elif是可行的,但是要求一个链接的when/else语句不是不合理的吗?真正的问题是:当您只需编写代码时,允许此代码编译会有什么好处 proc myproc(T: typedesc): string = when T is bool: return "bool" when T is float: return "flo

错误:“return”、“break”、“raise”之后不允许使用语句, 使用noreturn pragma进行“continue”或proc调用


使用
elif
是可行的,但是要求一个链接的when/else语句不是不合理的吗?

真正的问题是:当您只需编写代码时,允许此代码编译会有什么好处

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

echo myproc(bool)
您的代码不会变短,也不能做其他情况下不可能做的事情。因此,允许您的代码编译只会给编译器带来额外的负担,而不会带来任何投资回报。我的代码也让意图更加清晰:要么做一件事,要么做另一件事,而代码说可能做这个,也可能做那个

我不知道具体的实现细节,但我假设编译器证明
t是bool
t是float
是不相交的,这并不是一件小事

编辑:证明没有好处

假设我们的身体是从

when T is bool:
  return "bool"
elif T is float:
  return "float"
显然,如果编译时
T为bool
的计算结果为
true
,则编译一条无条件的
return
语句,之后可能没有语句。也就是说,除非上述条件为
false
,否则编译时必须吞并
when
块后面的所有语句

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

when T is bool: return "bool"
通过将其改写为以下内容,可以轻松解决此问题:

when T is bool: return "bool"
call(T)
我承认我们这里有更多的代码,但我看不到我们从省略
else:
中得到任何真正的好处


如果您仍然不相信,我请您给出您认为有实际好处的示例代码,以便我们讨论。

真正的问题是:当您只需编写代码时,允许此代码编译会给您带来什么好处

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

echo myproc(bool)
您的代码不会变短,也不能做其他情况下不可能做的事情。因此,允许您的代码编译只会给编译器带来额外的负担,而不会带来任何投资回报。我的代码也让意图更加清晰:要么做一件事,要么做另一件事,而代码说可能做这个,也可能做那个

我不知道具体的实现细节,但我假设编译器证明
t是bool
t是float
是不相交的,这并不是一件小事

编辑:证明没有好处

假设我们的身体是从

when T is bool:
  return "bool"
elif T is float:
  return "float"
显然,如果编译时
T为bool
的计算结果为
true
,则编译一条无条件的
return
语句,之后可能没有语句。也就是说,除非上述条件为
false
,否则编译时必须吞并
when
块后面的所有语句

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

when T is bool: return "bool"
通过将其改写为以下内容,可以轻松解决此问题:

when T is bool: return "bool"
call(T)
我承认我们这里有更多的代码,但我看不到我们从省略
else:
中得到任何真正的好处


如果您仍然不相信,我请您给出您认为有实际好处的示例代码,以便我们讨论。

您缺乏想象力。C编译器也会发出警告(或不警告),以防出现不完全不相交的ifs;如果静态分析器发现可能没有返回的潜在流或路径。C#编译器做得非常完美,这是一个错误。而且它没有强加这种白痴限制。@v.oddou
如果
不同时。如果您的目标只是抱怨语言不能完全按照您的期望工作,那么这不是一个合适的平台(使用)。如果你的问题是这是否可能:当然,是的。如果你的问题是为什么它没有被实施,尽管它是可能的,最可能的答案仍然是因为没有好处。好的评论,但你没有证明,因为没有好处,事实上,我声明相反。因为当作为断开连接的序列编写时,某些嵌套级别为
的表达式更容易理解。或者当这些条件没有共同之处时。示例:Fowler-guard子句。e、 g.
when sizeof(int)>4 return
LFLF
when T是bool…
我看到了分离子句的好处。哦,是的,我所有的问题都伴随着一点咆哮,因为这种语言对我的神经来说是一场灾难。这是粗糙和不受欢迎的。@v.oddou补充了证据fwiw;你可能想在你认为有好处的问题上添加实际代码。你缺乏想象力。C编译器也会发出警告(或不警告),以防出现不完全不相交的ifs;如果静态分析器发现可能没有返回的潜在流或路径。C#编译器做得非常完美,这是一个错误。而且它没有强加这种白痴限制。@v.oddou
如果
不同时。如果您的目标只是抱怨语言不能完全按照您的期望工作,那么这不是一个合适的平台(使用)。如果你的问题是这是否可能:当然,是的。如果你的问题是为什么它没有实现,尽管它是可能的,最有可能的