我已经成功安装了电池并且可以让它工作......有点。
自从 Opam 列出以来,我为什么会收到语法错误的任何想法:
取决于:“ocaml”{>=“4.00.0”&<“4.10.0”}
而且,我在:OCaml 顶层,版本 4.07.1
此代码依赖于已弃用且不再受支持的camlp4预处理器。此外,列表理解不再是电池库的一部分,而是一个单独的包。所以你需要使用. 您仍然可以通过在启动 OCaml 顶层(或 utop)后立即发出以下指令来使您的代码适用于 OCaml 4.07.1opam install pa_comprehension
#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>