在 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>
我已经成功安装了 Batteries 并且可以正常工作...有点。
取决于:"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>