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

安德烈·哈兹

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章