在 Utop 中使用电池时出现语法错误

Syntax error when using batteries in Utop

我已经成功安装了 Batteries 并且可以正常工作...有点。

自 Opam 列出以来我收到语法错误的任何想法:

取决于:"ocaml" {>= "4.00.0" & < "4.10.0"}

而且,我在:OCaml 顶层,版本 4.07.1

此代码依赖于 Batteries 库的 camlp4 preprocessor which is deprecated and is no longer supported. Moreover, list comprehension is no longer a part,是一个单独的包。所以你需要使用 opam install pa_comprehension 安装它。您仍然可以通过在启动 OCaml toplevel(或 utop)后立即发出以下指令来使您的代码适用于 OCaml 4.07.1

#use "topfind";;
#camlp4o;;
#require "pa_comprehension";;

第一个指令(注意你必须输入 # 它是指令的一部分),在顶层启用 ocamlfind(我认为在 utop 中不需要它,但不会伤害)。下一个指令启用 camlp4o 语法,以便对所有输入进行预处理。之后您不再使用 OCaml 编码,而是使用 camlp4o 方言。最后,最后一个指令加载支持列表理解的预处理器。

要编译使用列表理解的代码,您需要向编译器指定相同的选项(即启用语法、加载预处理器),例如,

ocamlfind ocamlopt -syntax camlp4o -package pa_comprehension -linkpkg example.ml -o example

camlp4 包还提供了另一种列表理解语法,它与 Batteries 提供的有点不同。它被称为 camlp4.listcomprehension,您可以将它与对包名称取模的大致相同的调用一起使用,例如,在顶层,

#use "topfind";;
#camlp4o;;
#require "camlp4.listcomprehension";;

并编译

ocamlfind ocamlopt -syntax camlp4o -package camlp4.listcomprehension -linkpkg example.ml -o example

综上所述,我强烈建议您不要在现代使用 camlp4 列表理解。这是一项过时的技术。

此外,您的示例格式错误,您在右括号中缺少 ? 字符,例如,这是与顶层交互的示例,

   # #use "topfind";;
   # #camlp4o;;
   # #require "pa_comprehension";;
   # open Batteries;;
   # [? x | x <- 1--10; x mod 2 = 0 ?];;
   - : int Batteries.Enum.t = <abstr>