为什么Proc.num_stack_slots.(i) <- 0在以下代码的末尾有分号?我认为分号是OCaml中的分隔符.我们总是可以为块的最后一个表达式添加一个可选的分号吗?
for i = 0 to Proc.num_register_classes - 1 do
Proc.num_stack_slots.(i) <- 0;
done;
Run Code Online (Sandbox Code Playgroud)
有关完整示例,请参阅https://github.com/def-lkb/ocaml-tyr/blob/master/asmcomp/coloring.ml第273行.
在这个表达式之后没有必要以半分号表示,但作为句法礼貌,这里允许它.在您引用的示例中,有一个半列,因为之后是第二个表达式.
本质上,您可以将半列视为二元运算符,它采用两个单位表达式,从左到右执行它们并返回一个单位.
val (;): unit -> unit -> unit
Run Code Online (Sandbox Code Playgroud)
那么下面的例子将更容易理解:
for i = 1 to 5 do
printf "Hello, ";
printf "world\n"
done
Run Code Online (Sandbox Code Playgroud)
这里;只是胶水.允许;在第二个表达式之后放置一个,但仅作为语法糖,仅仅是编译器开发人员的礼貌.
如果打开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)) }
Run Code Online (Sandbox Code Playgroud)
这意味着,您甚至可以编写这样的奇怪代码:
let x = 2 in x; let y = 3 in y; 25
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1346 次 |
| 最近记录: |