抱怨OCaml中的默认值

时间:2017-05-25 14:08:10

标签: ocaml

以下来自Real World OCaml第17章:使用S-Expressions进行数据序列化第339页的代码未在utop上编译:

type http_server_config = { web_root: string;
 port: int with default(80);
 addr: string with default("localhost");
} [@@deriving sexp] ;;

抱怨with

中的port: int with default(80);

谢谢!

2 个答案:

答案 0 :(得分:3)

在最新版本的Janestreet核心库中,所有语法扩展都已从camlp4扩展转换为ppx扩展。因此,遗憾的是,您需要使用Real World OCaml中的语法扩展来调整所有示例的语法。

幸运的是,与camlp4扩展相反,ppx扩展不能疯狂地修改OCaml语法。与vanilla OCaml相比,它们最多可以使用略微扩展的语法,并添加扩展节点和属性。

特别是,这意味着由于field:type with …对于vanilla OCaml不是同义词有效的,因此它也不是启用了ppx_sexp_conv扩展名的有效语法。在您的情况下,需要将默认值注释写为相应记录字段的属性:

 type http_server_config = { 
   web_root: string;
   port: int [@default 80];
   addr: string [@default "localhost"];
 } [@@deriving sexp] ;;

请注意,要在utop中工作,首先需要具备 ppx_sexp_conv扩展并打开默认运行时模块:

#require "ppx_sexp_conv";;
open Sexplib.Std ;;
type http_server_config = { 
  web_root: string;
  port: int [@default 80];
  addr: string [@default "localhost"];
} [@@deriving sexp] ;;

答案 1 :(得分:0)

Real World OCaml中的示例假设您已安装Core,其中包含一些语法扩展。我按照安装说明here进行了操作,我仍然看到了您遇到的同样问题。

当我尝试安装语法扩展模块时,我看到了:

utop # #camlp4o;;
utop was built without camlp4 support.

因此,我得出结论,设置Real World OCaml所期望的环境有点棘手。

无论如何,@ Baasile_Starynkevitch是正确的。代码使用的是utop不支持的语法扩展。