我正在阅读一本名为“Real World OCaml”的书,学习OCaml,目前进展顺利。
我在sexp和Sexplib方面遇到了问题。
# module type M = sig
# type t with sexp
# end;;
这是一个教科书式的例子,但我在utop中遇到了语法错误,with
这个单词下划线了。同时Core.Std
已经被打开。
有人能解释一下吗?我怀疑他们是否改变了语言语法。
我正在阅读一本名为“Real World OCaml”的书,学习OCaml,目前进展顺利。
我在sexp和Sexplib方面遇到了问题。
# module type M = sig
# type t with sexp
# end;;
这是一个教科书式的例子,但我在utop中遇到了语法错误,with
这个单词下划线了。同时Core.Std
已经被打开。
有人能解释一下吗?我怀疑他们是否改变了语言语法。
[@@deriving sexp]
替换"with sexp
"。这还需要使用ppx_sexp_conv
重写器。或者,您也可以使用ppx_jane
,它包括所有Janestreet PPX重写器(当您使用corebuild
命令时会自动使用)。# #use "topfind";;
# #require "core";;
# #require "ppx_sexp_conv";;
# open Core.Std;;
# module type M = sig type t [@@deriving sexp] end;;
module type M =
sig
type t
val t_of_sexp : Sexplib.Sexp.t -> t
val sexp_of_t : t -> Sexplib.Sexp.t
end
说明:
http://blogs.janestreet.com/extension-points-or-how-ocaml-is-becoming-more-like-lisp/
这篇文章介绍了OCaml如何通过扩展点来增强其功能,类似于Lisp中的宏。扩展点是一种机制,允许用户将自己的代码插入到编译器中,并且在编译时进行处理。作者还提供了一些使用扩展点的示例,例如生成重复模板代码和创建新语言特性等。Real World OCaml于2013年出版,由于语法扩展部分,一些示例在最新版本的OCaml中无法正常工作,这是可以理解的。
作为学习者,如果您不介意回退到旧版本(例如4.02.1),则可以运行本书提供的大多数示例程序。
"opam switch 4.02.1
在切换opam版本后,您可能需要重新安装您需要的所有内容,例如utop。
Real World Ocaml 依赖于 ocaml 4.01.0(请参见序言)。 使用此版本的 ocaml,您需要首先包含 Sexplib.syntax(它不是 Core 的一部分)。
#require "sexplib.syntax";;
为了拥有这个功能,您还需要安装type_conv,它将选择正确的sexplib版本(111.25.00而不是112.01.00)。
>opam install type_conv