2

我正在寻找来自 janestreet 的 ppx_xml_conv 模块的简单示例。我对(相对)新的 ppx 东西不是很熟悉,也无法从源代码中真正弄清楚。最终,我正在尝试为旧的 SOAP 服务编写客户端,并希望将 xsd(来自 wsdl)转换为类型和序列化器/反序列化器。

4

2 回答 2

3

由于ppx_xml_conv 中存在错误,我将举一个 ppx_sexp_conv 的示例,它的工作原理相同。

$ cat a.ml
open Sexplib.Std

type attr = {
  attr_id : string;
  attr_path : string;
  attr_value : string;
} [@@deriving sexp]

$ cat a.mli
type attr = {
  attr_id : string;
  attr_path : string;
  attr_value : string;
} [@@deriving sexp]

$ ocamlfind ocamlc -package sexplib,ppx_sexp_conv -dsource -c a.mli
type attr = {
  attr_id: string;
  attr_path: string;
  attr_value: string;}[@@deriving sexp]
val attr_of_sexp : Sexplib.Sexp.t -> attr
val sexp_of_attr : attr -> Sexplib.Sexp.t

$ ocamlfind ocamlc -package sexplib,ppx_sexp_conv -dsource -c a.ml
(* ... long output ... *)

我使用了这个-dsource标志,所以你可以看到生成的输出。请注意,不必创建 ppx 可执行文件并单独调用它。使用包进行编译ppx_sexp_conv会导致自动应用该包的 ppx 扩展。

作为另一个示例,这是一个可执行文件:

$ cat b.ml
open Sexplib.Std

type attr = {
  attr_id : string;
  attr_path : string;
  attr_value : string;
} [@@deriving sexp]

let x = {attr_id="abc"; attr_path="foo/bar"; attr_value="something"}

let () = Printf.printf "sexp: %s\n" (Sexplib.Sexp.to_string (sexp_of_attr x))

$ ocamlfind ocamlc -package sexplib,ppx_sexp_conv -linkpkg b.ml

$ ./a.out 
sexp: ((attr_id abc)(attr_path foo/bar)(attr_value something))
于 2015-11-17T16:21:39.760 回答
3

对于那些像我一样容易陷入无知的人,我建议您查看 [ppx_driver] 的自述文件(https://github.com/janestreet/ppx_driver)。

总而言之,基本过程是,首先构建一个驱动程序(替换-package ppx_sexp_conv -package ppx_bin_prot为您正在使用的转换模块):

$ ocamlfind ocamlopt -predicates ppx_driver -o ppx -linkpkg \
  -package ppx_sexp_conv -package ppx_bin_prot \
  ppx_driver_runner.cmxa

这会给你一个ppx可执行文件。对您的源文件运行此命令将转储源的扩展版本。

$ ./ppx -help
ppx [extra_args] [files] ...
$ ./ppx src/myFile.ml

然后这个可执行文件可以在构建时用作预处理器。

$ ocamlc -c -pp ./ppx src/myFile.ml

我的消息来源有

type attr = {
  attr_id : string;
  attr_path : string;
  attr_value : string;
} [@@deriving xml]

并添加了预处理器to_xml tfrom_xml xml功能。

正如上面提到的,这是你所能得到的,因为 ppx_driver 框架仍然有一些突出的问题。

于 2015-11-09T19:14:11.663 回答