私はGrails 2.0.0(および2.1.0-SNAPSHOT)でGrails Clojureプラグインの拡張に取り組んでおり、それをClojure 1.3.0に更新してclojure.tools.loggingを追加したいと考えていました。
Clojure は、in のログストリーム関数のプロキシのコンパイル中に例外をスローし
ます。ByteArrayOutputStream
clojure.tools.logging
ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn
(https://gist.github.com/a6ae681c37091a3d2379)
私は行って、削除してclojure.tools.logging
、次の削除されたプロキシを書きましたObject
:
(proxy [java.lang.Object] [] (toString [] "proxy's toString"))
そして、それも同じClassCastException
メッセージを投げました。
私は、印刷しようとしたmacroexpandは-1のプロキシと同じものを得ました。
Clojure 1.2.0に戻したところ、プロキシは再び正常に機能しました。
1.4.0の多数の化身を試しましたが、それらは1.3.0と同じ動作を示します。1.2.1もある種の例外をスローしますが、1.3.0をヒットしようとしているので、あまり時間をかけませんでした。
いずれかで定義された「GEN-メソッド関数にスタックトレースポイントのletのフォームgenerate-proxy
の中でcore_proxy.clj
。
println
何が起こっているのかを把握できるかどうかを確認するために、の周りに小さなを散りばめました。多分この次のステートメントは私の側の読者の大きな誤解を裏切るでしょうが、それらを単に追加するだけprintln
で、私が完全に予期していなかった方法でコンパイル時の動作を変更しました。のすべてのClojureテストにmvn package
引き続き合格したにもかかわらず、例外の場所と例外の種類が完全に変更されました。
たとえば、println
バイトコードの生成を開始する直前にgenメソッドに単一を追加すると、Clojureがスローされました
ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
(https://gist.github.com/5a7a40929a6c4a104bd5)
println
(s)を配置した場所に応じて他のさまざまなエラーが発生しましたが、これが最も一般的です。
明らかに、GrailsとClojureの一部の側面がここで正しくメッシュ化していませんが、接続が表示されません。最初はASMの非互換性を疑っていましたが、Clojureには独自のASM名前空間があるため、それが問題であることはわかりません。しかし、私は間違っているかもしれません。私は何clojure.lang.Compiler
日もproxyとgenerate-proxyを凝視してこれを機能させようとしており、スチームがなくなったので、前進をほとんど停止しました:(
リンクの欠如をお詫び申し上げます。以下からコピーして貼り付けることができます。
Grails Clojure-github.com/grails-plugins/grails-clojure
Clojureツールのロギング-github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj 133行目は「プロキシ