以下来自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);
谢谢!
答案 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不支持的语法扩展。