我正在尋找janestreet的ppx_xml_conv模塊的簡單示例。我對(相對)新的ppx事物並不熟悉,也無法從源代碼中真正理解它。最終,我試圖爲舊的SOAP服務編寫客戶端,並且想將xsd(從wsdl)轉換爲類型和序列化器/反序列化器。是否有OCaml ppx_xml_conv模塊的任何使用示例
回答
由於有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))
太棒了,這非常有幫助。謝謝。 –
對於那些像我一樣無知的人,我會建議查看[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 t
和from_xml xml
功能。
如上所述,儘管你會得到,因爲ppx_driver框架仍然有一些未解決的問題。
您不必生成可執行文件並單獨調用它。有一種方法讓編譯器在內部執行此操作。我會舉一個例子。 –
- 1. 是否有使用django的i18n的任何幫助模塊?
- 2. 是否有任何StackExchange.Redis示例項目
- 3. 是否有任何HessianKit示例項目?
- 4. 是否有任何使用IUPnPRegistrar.RegisterDevice的源代碼示例?
- 5. 如何使用twitter-text-1.5.0.js是否有任何示例?
- 6. 是否有任何示例如何使用Matrix Toolkit Java(MTJ)?
- 7. 在java中是否有任何Webcam集成的示例示例
- 8. 是否有任何python內置模塊使用線程?
- 9. 在Couchbase PhoneGap中使用REST API是否有任何示例
- 10. 產品網格網站是否有任何示例模板?
- 11. 動態實例化OCaml中的模塊
- 12. OCaml:如何在Windows中使用模塊
- 13. 如何從Java中分析使用Grok ..是否有任何可用的示例。?
- 14. 與使用makefile模塊(Ocaml)的問題
- 15. 使用參數化模塊的OCaml
- 16. 是否有任何帶有錄音示例代碼的ASP.NET?
- 17. 是否有任何有關Spanned和Spannable文本的示例
- 18. OCaml Websocket示例
- 19. 是否有任何Python模塊可用於[{},{} ...]比較?
- 20. 是否有任何如何使用maven-jar-plugin的例子?
- 21. 是否有任何Twitter演示示例在twitter上使用OAuth發佈照片?
- 22. 是否有任何使用PyObjC編寫的iOS應用程序示例?
- 23. 是否有使用Mylyn的wikitext的任何Java的例子嗎?
- 24. 是否有任何關於Perl的統計模塊的評論?
- 25. 是否有任何Perl模塊來替換舊的鏡像模塊?
- 26. Qt Commercial是否有任何模塊LGPL版本不是
- 27. 是否有任何使用HTML5/XHTML中的角色屬性的網站示例?
- 28. 是否有使用delphi的亞馬遜產品API的任何示例?
- 29. Coq循環模塊使用示例
- 30. 是否有用C編寫的python模塊的fini例程?
我要發佈一個答案,但無法得到它的工作我自己。我[報道](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)有一個自述文件,舉例說明。 –
這正是我所需要的。我現在也可以得到「錯誤:未綁定的模塊字段」。我在github上看到了問題(和響應),所以我可能會等到ppx_driver框架更穩定一些。 –