2017-03-29 1 views
2

Es sieht so aus, als ob clojure library api dem Java-Code aussetzt, erfordert die Verwendung der AOT-Kompilierung (zumindest wenn die exponierte API OO ist). Wenn ich falsch liege, freue ich mich, überarbeitet zu werden. In der Vergangenheit gab es mehrere Probleme mit AOT, so dass man sich darauf verlassen konnte, dass es ein wenig leichtsinnig oder instabil war.Was sind die AOT-Einschränkungen von Clojure?

Wie ist der aktuelle Zustand? Ist es eine sichere Übung?

Würden Sie das verwenden, um eine OO-API für Java-Anwendungen verfügbar zu machen?

Antwort

3

Sie können AOT verwenden, um Bytecode zu erzeugen, der Muster als Java-Bibliothek übergibt. Aber es ist nicht besonders angenehm für Sie oder für die Java-Programmierer, die zu Recht fragen: Wo ist der JavaDoc? Warum verwenden Sie Object anstelle von Generika? Und andere ähnlich unangenehme Fragen.

Stattdessen ist mein bevorzugter Ansatz, den Clojure-Code überhaupt nicht Java-freundlich zu machen. Enthülle es als gewöhnliche Clojure vars, und das ist es. Schreiben Sie dann selbst in dieselbe Bibliothek Java-Code, der die Clojure-basierte API konsumiert und sie in Bezug auf die von Ihnen gewünschten Java-Konstrukte neu packt. Für ein Beispiel siehe meine thrift-gen Bibliothek. Mit Hilfe von Clojure erhalten Sie eine Funktion, die eine Map als Eingabe verwendet und eine Sequenz erzeugt; Wenn Sie es aus Java verwenden, erhalten Sie ein Builder-Muster für die Konfiguration anstelle der Karte, und Sie erhalten eine List<? extends T> als Ausgabe. Kein JavaDoc, weil ich der Meinung bin, dass die Anwendungsdokumentation in der Readme-Datei ausreichend ist, aber wenn ich es ernst meinte, gibt es eine echte .java-Quelldatei, der JavaDoc einfach hinzugefügt werden kann.