为什么最后有一个分号Proc.num_stack_slots.(i) <- 0
在下面的代码中?
我认为分号是 OCaml 中的分隔符。我们是否可以始终为块的最后一个表达式添加一个可选的分号?
for i = 0 to Proc.num_register_classes - 1 do
Proc.num_stack_slots.(i) <- 0;
done;
See https://github.com/def-lkb/ocaml-tyr/blob/master/asmcomp/coloring.ml 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 编译器的解析器定义,您将看到,a 中的表达式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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)