0

我已经成功安装了电池并且可以让它工作......有点。

电池语法错误 自从 Opam 列出以来,我为什么会收到语法错误的任何想法:

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

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

4

1 回答 1

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>
于 2020-01-08T20:48:45.763 回答