janestreet の ppx_xml_conv モジュールの簡単な例を探しています。私は (比較的) 新しい ppx のことにはあまり詳しくなく、ソース コードから実際に理解することはできません。最終的に、私は古い SOAP サービスのクライアントを作成しようとしており、(wsdl からの) xsd をタイプおよびシリアライザー/デシリアライザーに変換したいと考えています。
2 に答える
私のように無知に飛びつきがちな人には、[ppx_driver] ( https://github.com/janestreet/ppx_driver ) の readme を参照することをお勧めします。
要約すると、基本的な手順は、最初にドライバーをビルドすることです (-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 フレームワークにはまだいくつかの未解決の問題があるため、これは理解できる範囲です。
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))