OCaml 编译器在 "in" 上报告语法错误,但交互式解释器运行没有缺陷

OCaml compiler reports a syntax error on "in" but interactive interpreter runs without flaws

以下代码在 https://try.ocamlpro.com/

上运行没有错误
open Printf

let l = ref [] in
for i = 3 downto 0 do
  l := i :: !l
done;
List.iter (printf "%d " ) !l

但在 Linux 上使用 ocamloptocamlc 编译器时会触发语法错误。

ocamlc array.ml -o array
let l = ref [] in
               ^^
Error: Syntax error

语法错误可能隐藏在您未包含的代码中。 看来你写的很有可能

open Printf
let l = ref [] in
for i = 3 downto 0 do
  l := i :: !l
done;
List.iter (printf "%d " ) !l

这是一个语法错误,因为顶层表达式不能跟在非表达式顶层项之后。这就是语法错误出现在 in 上的原因:此位置仅允许顶层定义(因此没有 in)。

这就是为什么通常建议使用顶层单元定义而不是表达式的原因:

open Printf
let () =
  let l = ref [] in
  for i = 3 downto 0 do
    l := i :: !l
  done;
  List.iter (printf "%d " ) !l

通过这个小改动,您只需要顶层定义,而无需记住顶层表达式的规则。

另一个简单的选择是考虑所有顶层表达式都应该由 ;;:

引入
open Printf

;; let l = ref [] in
  for i = 3 downto 0 do
    l := i :: !l
  done;
  List.iter (printf "%d " ) !l