Saya sedang mengembangkan plugin Grails Clojure di Grails 2.0.0 (dan 2.1.0-SNAPSHOT) dan saya ingin memperbaruinya ke Clojure 1.3.0 dan menambahkan clojure.tools.logging .
Clojure melempar pengecualian selama kompilasi dari
proksi dari ByteArrayOutputStream
dalam clojure.tools.logging
fungsi log-aliran 's:
ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn
( https://gist.github.com/a6ae681c37091a3d2379 )
Saya pergi dan menghapus clojure.tools.logging
dan menulis proxy yang dilucuti dari Object
:
(proxy [java.lang.Object] [] (toString [] "proxy's toString"))
dan itu juga ClassCastException
menyampaikan pesan dan pesan yang sama .
Saya mencoba mencetak macroexpand-1 dari proxy dan mendapatkan hal yang sama.
Saya kembali ke Clojure 1.2.0 dan proxy berfungsi dengan baik lagi.
Saya mencoba sejumlah inkarnasi 1.4.0 dan mereka menunjukkan perilaku yang sama dengan 1.3.0. 1.2.1 juga memberikan semacam pengecualian tetapi saya mencoba untuk mencapai 1.3.0 jadi saya tidak menghabiskan banyak waktu dengan itu.
Jejak tumpukan menunjuk ke fungsi 'gen-method yang didefinisikan di salah satu bentuk biarkangenerate-proxy
masuk core_proxy.clj
.
Saya menambahkan sedikit println
di sekitar sana untuk melihat apakah saya bisa menangkap apa yang terjadi. Mungkin pernyataan berikut ini akan mengkhianati kesalahpahaman besar pembaca di pihak saya, tetapi menambahkannya saja telah println
mengubah perilaku waktu kompilasi dengan cara yang sama sekali tidak saya duga. Lokasi pengecualian dan jenis pengecualian benar-benar berubah, meskipun semua pengujian Clojure mvn package
terus berhasil.
Misalnya, hanya menambahkan satu println
ke gen-method tepat sebelum ia mulai menghasilkan bytecode menyebabkan Clojure terlempar
ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
( https://gist.github.com/5a7a40929a6c4a104bd5 )
Saya telah melihat berbagai kesalahan lain tergantung di mana saya meletakkannya, println
tetapi ini yang paling umum.
Jelas beberapa aspek dari Grails dan Clojure tidak terhubung dengan benar di sini, tapi saya tidak melihat hubungannya. Awalnya saya curiga ASM tidak kompatibel, tetapi karena Clojure memiliki namespace ASM sendiri, saya tidak dapat melihat masalahnya. Tetapi mungkin saya salah, saya telah menatap clojure.lang.Compiler
, proxy dan menghasilkan-proxy selama berhari-hari sekarang mencoba untuk membuat ini bekerja dan saya sudah cukup banyak berhenti membuat kemajuan karena saya kehabisan tenaga :(
Saya minta maaf atas kurangnya tautan. Anda dapat menyalin dan menempel dari bawah:
Grails Clojure - github.com/grails-plugins/grails-clojure
Pencatatan Alat Clojure - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj baris 133 adalah 'proxy