2016-04-11 60 views
2

給定一個語法擴展,看起來像這樣OCaml PPXes是否可以返回要由其他PPX擴展解析的擴展?

let a = [%jsx div className="hello"] 

我已經得到了它轉換爲(像)

let a = ReactJS.create_element "div" ~props:(object%js val className = "hello" end) 

我需要的OCaml隨後轉變%JS語法擴展一個PPX,它由js_of_ocaml提供。

但是,從外觀上看,PPX擴展的東西在源代碼上做了一個遍歷,並且不會遞歸應用它。

它可以這樣做嗎?或者我需要嘗試導入js_of_ocaml PPX並在我自己的內部運行它?或者是在我自己的代碼中簡單地刪除中間人併產生相同轉換的最佳方法?

編輯 - 更多信息:

因此,它不會出現被應用PPXes的順序是這裏的問題。我得到如下:

+ ocamlfind ocamlc -c -package reactjs,reactjs_ppx,react,js_of_ocaml,js_of_ocaml.ppx -o tutorial.cmo tutorial.ml File "tutorial.ml", line 3, characters 14-99: Uninterpreted extension 'js'.

我有一種感覺,我雖然(再次)產生錯誤的AST。 用於生成js%object的代碼如下所示:

Exp.extension ({txt="js"; loc=loc}, PStr [ Str.eval ( Exp.object_ ( Cstr.mk (Pat.any()) fields ) ) ] )

回答

2

是的,您可以像camlspotter說的那樣做,但會變得脆弱(您需要依賴ppx應用程序的順序)。

請不要將js_of_ocaml的ppx複製到您的應用程序中(或嘗試進行相同的轉換,這是一個複雜的過程)。如果我們更新ppx,它會中斷。

我一直在考慮將ppx的某些部分作爲一個庫(特別是mapper)公開,然後您可以使用它。您可以聯繫js_of_ocaml錯誤跟蹤器嗎?

+0

完成 - https:// github。com/ocsigen/js_of_ocaml/issues/460 –

+0

所以事實證明,我需要的東西已經導出 - 我只需要把它放到我的項目中,現在一切都很開心! –

1

是的,你可以創建具有多-ppx <ppx>選項編譯一個PPX鏈:

ocamlc -ppx a -ppx b input.ml 

input.ml應該傳遞給PPX a,那麼它的輸出應該發送到b,最後輸出給ocamlc

隨着ocamlfind,你可以像指定多個PPX包:

ocamlfind ocamlc -package ppx_A,ppx_B input.ml 

申請不止一個PPX預處理器。應根據ppx_Appx_B之間的軟件包依賴性計算應用程序的順序。如果ppx_B包依賴於ppx_A,則無需提及ppx_Aocamlfind ocamlc -package ppx_B input.ml自動在ppx_B之前應用ppx_A

+0

所以我偷看了訂購的東西,它看起來不是這個問題:我已經更新了這個問題,以反映這個問題 –