for循环中的OCaml分号单表达式

时间:2014-10-09 19:44:23

标签: syntax ocaml

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

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行。

1 个答案:

答案 0 :(得分:8)

在这个表达式之后没有必要以半分号表示,但作为句法礼貌,这里允许这样做。在您引用的示例中,有一个半列,因为之后是第二个表达式。

基本上,您可以将半列视为二元运算符,它采用两个单位表达式,从左到右执行它们并返回一个单位。

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

然后以下示例将更容易理解:

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

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

如果打开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