5

を使用してJavaからClojureをコンパイルすることは正当clojure.lang.Compiler.compileですか?

clojure.lang.Compiler.load私たちの Java アプリケーションは、マクロを含む .clj ソースを使用して Clojure オブジェクトのインスタンスを作成していましたproxy。ここで、これらのオブジェクトをgen-classではなくを使用して AOT コンパイルしたいと考えていますproxy。これは、.class ファイルを移動できるようにするためであり、後でオブジェクトをインスタンス化します。

これまでに私が管理した最善のclojure.lang.Compiler.compile方法は、ローダーのクラスファイル (「my/domain/lib__init.class」) を作成するよう説得したことです。しかし、付随する .class ファイル (名前空間 (“my/domain/lib$fnname__1234.class”) 内の関数ごとに 1 つ) と、それぞれの .class ファイルのスタブ クラス ファイルを取得できなかったようですgen-classこれは、 http://clojure.org/compilationにある非常に単純な最初の例を使用したサンドボックスにあります。compile-pathを正しく設定し、クラスパス内の何かに設定したと思いましたが、まだ問題があるかもしれません。

いずれにせよ、実際のアプリケーションは RCP (Eclipse) ベースです。これはおそらく、OSGI クラスローダのクラスパスに関して理解する必要があることを意味します。clojure.lang.Compiler.compileそれまでの間、直接使用することが有効なアプローチであるかどうか疑問に思っていますか?

編集:これで、すべての .class ファイルを生成できるようになりましたが、ドキュメント化されていないさまざまな初期化が必要でした。これは、メソッド onclojure.lang.Compilerが内部的なものであることを示唆しています。*compile-path* を適切に設定し、*compile-files* を true に設定する必要がありました。

RT.var("clojure.core", "*compile-files*").bindRoot(true);
4

2 に答える 2

2

関数を使用してみてくださいclojure.core/compile。また、lein がどのようにパラメーターを処理してaot コンパイル:aotを行うかを確認することもできます。

于 2013-05-30T04:39:44.617 に答える
1

Here is an example of driving the Clojure compiler directly from Java.

        String clojureScript = "(ns user) (def hello (fn [] \"Hello world\"))";
        String notionalScriptFileName="hello.clj";
        String outputDirectory="/my/output/dir";

        Var compilePath = RT.var("clojure.core", "*compile-path*");            
        Var compileFiles = RT.var("clojure.core", "*compile-files*");

        Var.pushThreadBindings(RT.map(compilePath, outputDirectory, compileFiles, Boolean.TRUE));                        
        Compiler.compile(new StringReader(clojureScript), notionalScriptFileName, notionalScriptFileName);
        Var.popThreadBindings();

I've tested this with Clojure 1.4.0... your mileage may vary with other versions.

As the API stands you need to provide a "notional" file name. This only seems to be used to generate the .class file names. The class files it generates are written to the outputDirectory.

于 2013-09-27T14:43:38.153 に答える