2016-04-11 5 views
2

eine Syntax Erweiterung, die Können OCaml PPXes Erweiterungen zurückgeben, die von anderen PPX-Erweiterungen analysiert werden?

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

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

ich habe eine PPX die

zu (wie etwas) wandelt es sieht aus wie

ich OCaml müssen die% js Syntax Erweiterung anschließend transformieren, welches von js_of_ocaml zur Verfügung gestellt wird.

Wie dem auch sei, die PPX-Erweiterungen tun einen einzigen Durchlauf über die Quelle und wenden sie nicht rekursiv an.

Ist es möglich, dies zu tun? Oder muss ich versuchen, das js_of_ocaml PPX zu importieren und es in meinem eigenen auszuführen? Oder ist die beste Methode, um den Zwischenhändler einfach auszuschneiden und die gleiche Transformation in meinem eigenen Code zu erzeugen?

Bearbeiten - Mehr Info:

Also, es scheint nicht, dass die Reihenfolge der PPXes angewandt wird, ist hier die Frage. Ich erhalte die folgende:

+ 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'.

Ich habe das Gefühl, ich bin Herstellung der falschen AST aber (wieder). Der Code verwendet, um die js%object zu generieren sieht wie folgt aus:

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

Antwort

2

Ja, Sie können es tun, wie Camspotter sagte, aber es wird ein bisschen brüchig sein (Sie müssen sich auf die Reihenfolge der ppx Anwendungen verlassen).

Bitte kopieren Sie nicht js_of_ocamls ppx in Ihre Anwendung (oder versuchen Sie die gleiche Transformation, es ist eine komplizierte). Es wird brechen, wenn wir den ppx aktualisieren.

Ich habe darüber nachgedacht, einige Teile des ppx als eine Bibliothek (insbesondere den Mapper) auszustellen, die Sie dann verwenden könnten. Könntest du den Bug-Tracker von js_of_ocaml kontaktieren?

+0

Fertig - https: // github.com/ocsigen/js_of_ocaml/issues/460 –

+0

So stellt sich heraus, dass das Zeug, das ich brauchte, bereits exportiert wurde - ich musste es einfach in mein Projekt ziehen und jetzt ist alles glücklich! –

1

Ja, Sie eine PPX Kette mit mehreren -ppx <ppx> Optionen für den Compiler erstellen:

ocamlc -ppx a -ppx b input.ml 

input.ml zu PPX geben werden sollen a, dann sollte seine Ausgabe an b gesendet werden, dann wird schließlich die Ausgabe an ocamlc gegeben.

Mit ocamlfind können Sie mehrere PPX-Pakete wie angeben:

ocamlfind ocamlc -package ppx_A,ppx_B input.ml 

mehr als ein PPX Preprozessoren anzuwenden. Die Anwendungsreihenfolge sollte in Abhängigkeit von den Paketabhängigkeiten zwischen ppx_A und ppx_B berechnet werden. Wenn ppx_B Paket von ppx_A abhängt, müssen Sie nicht ppx_A: ocamlfind ocamlc -package ppx_B input.ml automatisch gelten ppx_A vor ppx_B.

+0

Also habe ich einen Blick auf die Bestellung Zeug, und es sieht nicht wie das ist ein Problem: Ich habe die Frage aktualisiert, um dies zu reflektieren –

Verwandte Themen