2015-11-06 38 views
2

我正在尋找janestreet的ppx_xml_conv模塊的簡單示例。我對(相對)新的ppx事物並不熟悉,也無法從源代碼中真正理解它。最終,我試圖爲舊的SOAP服務編寫客戶端,並且想將xsd(從wsdl)轉換爲類型和序列化器/反序列化器。是否有OCaml ppx_xml_conv模塊的任何使用示例

+2

我要發佈一個答案,但無法得到它的工作我自己。我[報道](https://github.com/janestreet/ppx_xml_conv/issues/1)。同時,請注意Jane Street的所有ppx _ * _ conv軟件包的工作方式都是相似的。由於ppx_sexp_conv是最常用的,所以google'ing會導致更多結果。 [ppx_variants_conv](https://github.com/janestreet/ppx_variants_conv)有一個自述文件,舉例說明。 –

+0

這正是我所需要的。我現在也可以得到「錯誤:未綁定的模塊字段」。我在github上看到了問題(和響應),所以我可能會等到ppx_driver框架更穩定一些。 –

回答

3

由於有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)) 
+0

太棒了,這非常有幫助。謝謝。 –

3

對於那些像我一樣無知的人,我會建議查看[ppx_driver]的自述文件(https://github.com/janestreet/ppx_driver)。

雖則總結,基本procecure是,先建一個驅動器(更換-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框架仍然有一些未解決的問題。

+1

您不必生成可執行文件並單獨調用它。有一種方法讓編譯器在內部執行此操作。我會舉一個例子。 –

相關問題