在OCaml utop中使用s表达式

6

我正在阅读一本名为“Real World OCaml”的书,学习OCaml,目前进展顺利。

我在sexp和Sexplib方面遇到了问题。

# module type M = sig
#   type t with sexp
# end;;

这是一个教科书式的例子,但我在utop中遇到了语法错误,with这个单词下划线了。同时Core.Std已经被打开。

有人能解释一下吗?我怀疑他们是否改变了语言语法。

3个回答

6
[@@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中的宏。扩展点是一种机制,允许用户将自己的代码插入到编译器中,并且在编译时进行处理。作者还提供了一些使用扩展点的示例,例如生成重复模板代码和创建新语言特性等。

1
"

Real World OCaml于2013年出版,由于语法扩展部分,一些示例在最新版本的OCaml中无法正常工作,这是可以理解的。

作为学习者,如果您不介意回退到旧版本(例如4.02.1),则可以运行本书提供的大多数示例程序。

"
opam switch 4.02.1

在切换opam版本后,您可能需要重新安装您需要的所有内容,例如utop。


0

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

对我来说,你的解决方案不起作用,也许你可以检查一下。祝你有美好的一天(2017新年快乐)。 - V. Michel
嗯,我再次检查了一下,它可以在OCaml 4.01.0上运行(在此之前,我执行了opam update & upgrade)。也祝你新年快乐!!! - Pierre G.
你的解决方案似乎比我的更好,我使用的是OCaml 4.02.2。您能展示一下utop指令的开头吗? - V. Michel
除了我引用的那一行之外,没有其他内容。.ocamlinit文件仅包含#use“top_find”;;… - Pierre G.

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