OCaml ppx_xml_conv 模块是否有任何使用示例
Are there any usage examples for the OCaml ppx_xml_conv module
我正在寻找来自 janestreet 的 ppx_xml_conv 模块的简单示例。我不太熟悉(相对)新的 ppx 东西,也无法从源代码中真正弄清楚。
最终,我正在尝试为旧的 SOAP 服务编写客户端,并希望将 xsd (来自 wsdl)转换为类型和 serializer/deserializer.
对于像我一样倾向于在无知中勇往直前的人,我建议您查看 [[=33=]] (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 t
和 from_xml xml
函数。
不过如上所述,这只是您所能了解的,因为 ppx_driver 框架仍然存在一些突出的问题。
因为有一个 bug in 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))
我正在寻找来自 janestreet 的 ppx_xml_conv 模块的简单示例。我不太熟悉(相对)新的 ppx 东西,也无法从源代码中真正弄清楚。 最终,我正在尝试为旧的 SOAP 服务编写客户端,并希望将 xsd (来自 wsdl)转换为类型和 serializer/deserializer.
对于像我一样倾向于在无知中勇往直前的人,我建议您查看 [[=33=]] (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 t
和 from_xml xml
函数。
不过如上所述,这只是您所能了解的,因为 ppx_driver 框架仍然存在一些突出的问题。
因为有一个 bug in 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))