Есть ли примеры использования для модуля OCaml ppx_xml_conv

Я ищу простой пример для модуля ppx_xml_conv от janestreet. Я не очень хорошо знаком с (относительно) новой вещью PPX и не могу понять это из исходного кода. В конечном итоге я пытаюсь написать клиент для старой службы SOAP и хочу превратить xsd (из wsdl) в тип и сериализатор / десериализатор.

2 ответа

Решение

Поскольку в 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))

Для тех из вас, кто, как и я, склонен погружаться в невежество, я бы порекомендовал посмотреть readme для [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 t а также from_xml xml функции.

Как уже отмечалось выше, это все, что вы получите, поскольку у фреймворка ppx_driver есть некоторые нерешенные проблемы.

Другие вопросы по тегам