Ocaml正在编译列表综合



我想使用ocamlopt编译列表综合。我不想使用任何特殊的库,因为ocaml至少在顶级(交互式(级别支持列表理解。

Marko Tunjic发布:

列表理解已经包含在标准ocaml 中

#require "camlp4.listcomprehension";;
[ x * x | x <- [ 1;2;3;4;5] ];;
- : int list = [1; 4; 9; 16; 25]

在ocaml 4.07.1上,我发现交互式需要以下内容:

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

文件lc1.ml包含

open Camlp4.ListComprehensions
let _ = [ x * y | x <- [ 1;2;3;4;5]; y <- [10;11;12;13;14 ] ];;

编译

ocamlfind ocamlopt -package camlp4 -linkpkg lc1.ml -o lc1
File "lc1.ml", line 3, characters 16-17:
Error: Syntax error

预期结果

[10; 11; 12; 13; 14; 20; 22; 24; 26; 28; 30; 33; 36; 39; 42; 40; 44;      48; 52;
56; 50; 55; 60; 65; 70]

首先是免责声明。Camlp4已被弃用,因此我强烈反对在任何新项目中使用它。考虑使用ppx,或者如果你真的需要ppx无法提供给你的东西,那么camlp5仍然为你服务。

要构建一个用非标准OCaml语法编写的程序,您需要明确地告诉ocamlfind您正在使用的语法,例如-syntax camlp4o。这类似于您正在使用的topfind实用程序的#camlp4o指令。

接下来,您不需要打开任何东西(OCaml中的open语句只是使用打开的模块中的定义扩展当前名称空间(。没有Camlp4.ListComprehensions这样的模块,因此,您的程序的正确版本是

let _ = [ x * y | x <- [ 1;2;3;4;5]; y <- [10;11;12;13;14 ] ]

这是构建命令

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

最新更新