OCaml顶层环境与语法扩展

14

我不知道如何一般性地完成这件事,但是我会就一个特定的实例询问以便更清楚:

Sexplib对我来说很有趣。我想玩一下它。我已经下载并安装好了(我非常确定)。我想在toplevel中使用“with sexp”语法扩展。我该如何做到这一点?我找到的所有例子都假定你已经知道如何制作toplevel和/或编译语法扩展。

我最好的尝试是像这样:

ocamlmktop -I +site-lib/sexplib -pp "camlp4 -I +site-lib/sexplib pa_sexp_conv.cma" -o sexplib-top

当我运行该toplevel时,我可以成功地open Sexplib,但是当我尝试使用with sexp语法扩展时,我会遇到语法错误。

1个回答

15

已经进入了21世纪 - 使用ocamlfind:

        Objective Caml version 3.11.2

# #use "topfind";;
- : unit = ()

# #camlp4o;;
/usr/lib/ocaml/dynlink.cma: loaded
/usr/lib/ocaml/camlp4: added to search path
/usr/lib/ocaml/camlp4/camlp4o.cma: loaded
    Camlp4 Parsing version 3.11.2

# #require "sexplib.syntax";;
/usr/lib/ocaml/unix.cma: loaded
/usr/lib/ocaml/bigarray.cma: loaded
/usr/lib/ocaml/nums.cma: loaded
/usr/lib/ocaml/num-top: added to search path
/usr/lib/ocaml/num-top/num_top.cma: loaded
/usr/lib/ocaml/sexplib: added to search path
/usr/lib/ocaml/sexplib/sexplib.cma: loaded
/usr/lib/ocaml/type-conv: added to search path
/usr/lib/ocaml/type-conv/pa_type_conv.cmo: loaded
/usr/lib/ocaml/sexplib/pa_sexp_conv.cmo: loaded

# type t = { x : int; y : float; } with sexp;;
type t = { x : int; y : float; }
val t_of_sexp__ : Sexplib.Sexp.t -> t = <fun>
val t_of_sexp : Sexplib.Sexp.t -> t = <fun>
val sexp_of_t : t -> Sexplib.Sexp.t = <fun>

4
涂上橙色,叫我苏珊。谢谢。如果任何在线或印刷的学习资源在任何地方提到过这一点,那将非常有帮助。 - koschei
哇,喜欢这个惯用语 :) 这里有一篇关于findlib的文章(俄文)- https://github.com/camlunity/kamlo_wiki/blob/master/Findlib.md - 并附有此示例。 - ygrek
上面的 #camlp4o;; 是做什么用的?当我输入上面的部分时,我没有看到任何加载的模块列表 - 但也没有错误。似乎不起作用。 - aneccodeal
实际上,在较新的版本中,您必须在定义 type t = ... 之前打开 Sexprlib.Std,以便所需的 {int,float}_of_sexp,sexp_of_{int,float} 标准函数在作用域内。 - jrk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接