gpt4 book ai didi

syntax - for循环中的分号单个表达式

转载 作者:行者123 更新时间:2023-12-05 08:24:01 25 4
gpt4 key购买 nike

为什么Proc.num_stack_slots.(i) <- 0末尾有个分号在下面的代码中?我认为分号是 OCaml 中的分隔符。我们总是可以为 block 的最后一个表达式放置一个可选的分号吗?

for i = 0 to Proc.num_register_classes - 1 do
Proc.num_stack_slots.(i) <- 0;
done;

参见 https://github.com/def-lkb/ocaml-tyr/blob/master/asmcomp/coloring.ml完整示例的第 273 行。

最佳答案

此表达式后无需分号,但出于句法礼貌,此处允许分号。在您引用的示例中,有一个分号,因为在它之后是第二个表达式。

本质上,您可以将分号视为二元运算符,它采用双单元表达式,从左到右执行它们,并返回一个单元。

val (;): unit -> unit -> unit

那么下面的例子会更容易理解:

for i = 1 to 5 do
printf "Hello, ";
printf "world\n"
done

here ; 只是一个胶水。允许在第二个表达式之后放置一个 ;,但只是作为语法糖,只不过是编译器开发人员的礼貌。

如果您打开 OCaml 编译器的解析器定义,您会看到,seq_expr 中的表达式可以用分号结束:

seq_expr:
| expr %prec below_SEMI { $1 }
| expr SEMI { reloc_exp $1 }
| expr SEMI seq_expr { mkexp(Pexp_sequence($1, $3)) }

这意味着你甚至可以写出这样奇怪的代码:

let x = 2 in x; let y = 3 in y; 25

关于syntax - for循环中的分号单个表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26286734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com