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 上使用 ocamlopt
或 ocamlc
编译器时会触发语法错误。
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
以下代码在 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 上使用 ocamlopt
或 ocamlc
编译器时会触发语法错误。
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