2016-04-11 13 views
2

は、私はその後、%JS構文拡張を変換するためのOCamlを必要と私は(のようなもの)に変換PPXを持ってこのOCaml PPXは他のPPX拡張機能で解析される拡張機能を返すことができますか?

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

のように見える構文拡張

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

を考えますこれはjs_of_ocamlによって提供されます。

しかし、見た目では、PPX拡張機能はソースを1回通過し、再帰的に適用しません。

そうすることは可能ですか?または、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の一部をライブラリ(特にマッパー)として公開することを検討していました。あなたは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_Aと言う必要はありません。ocamlfind ocamlc -package ppx_B input.mlppx_Bの前にppx_Aを自動的に適用します。

+0

私は注文書に覗いてみましたが、それは問題のようには見えません。これを反映するように質問を更新しました。 –

関連する問題