在链接“ let”语句时更好使用“ and”或“ in”?

| 我意识到这可能是一个愚蠢的问题,但是... 如果我要链接一堆不需要知道彼此值的
let
语句,使用
and
还是
in
更好? 例如,如果有以下哪个是更可取的:
let a = \"foo\"
and b = \"bar\"
and c = \"baz\"
in
  (* etc. *)
要么
let a = \"foo\" in
let b = \"bar\" in
let c = \"baz\"
in
  (* etc. *)
我的直觉告诉我,前者应该是“更好的”(通过对“更好”的非常小定义),因为它创建了必要的最小范围,而后者是一个范围内的范围,在范围内,编译器/解释器会注意这一点,但最终并不重要且不必要地深入。     
已邀请:
        仅当两种解释没有区别时,“哪个更好?”这个问题的答案才真正有意义。 ML语言家族(至少SML和OCaml)具有并行初始化形式(
and
)和顺序的,基本上是嵌套作用域的形式(
in
),因为它们在某些情况下都很有用。 在您的情况下,语义是相同的,因此您只能回答问题“什么最适合您?”,也许(如果还不成熟,则)“可能更有效地执行?”替代方法是: 对于“ 1”例:评估一串字符串,并对三个标识符进行并行绑定。 对于
in
情况:将
foo
绑定到
a
,然后将
bar
绑定到
b
,然后将
baz
绑定到
c
。 哪个更好看?在这种情况下,这是一个折腾,因为结果并不重要。您可以投票给一些说英语的人,但我怀疑会不会有很多选择。也许大多数人会喜欢
and
,因为它分隔了绑定,而在表达式之前留下了唯一的
in
。 至于执行效率更高的问题,我认为一个好的编译器可能会产生相同的代码,因为它可以检测绑定的顺序无关紧要。但是也许您有一个为多核处理器生成代码的编译器,该处理器在ѭ1时性能更好。又或者是一个幼稚的编译器,它将所有RHS写入临时存储,然后将它们绑定在一起,从而使ѭ1的情况变慢。 这些可能不是必需的优化问题,尤其是因为它们涉及绑定并且可能没有紧密的循环。 底线:在这种情况下,这确实是一个折腾;只需确保在结果很重要时正确使用并行或顺序即可。     
        我的观点是
in
更好。 ѭ1的使用意味着定义互相依赖。我认为最好弄清楚事实并非如此。另一方面,对于一些非常简短的定义,某些OCaml程序员确实更喜欢ѭ1,在这种情况下,稍微紧凑的符号看起来更清晰。当您可以将定义放在一行上时,尤其如此:
let a = \"foo\" and b = \"bar\" in
    
        我相信,这与Lisp中
let
let*
之间的差异相同。
let*
(功能类似于
in..in..
结构-问题中的第二个结构)有时用于隐藏命令式编程,因为它可以保证顺序执行表达式(请参阅Paul Graham关于On Lisp中let *的论述)。 因此,我想说以前的结构更好。但事实是,我认为后者在我所见过的Ocaml程序中更为常见。让一个基于先前命名的表达式构建起来可能更容易使用。     
        我会说in更好,因为它可以缩小范围并更好地表达意图。如果我看到所有这些定义都以一种共享作用域的方式链接在一起,那么我会以为这样做是有原因的,并且会寻找它们如何相互影响的印象。     

要回复问题请先登录注册