Ben uzanan üzerinde çalışıyorum Grails Clojure eklentisi içinde Grails 2.0.0 (ve 2.1.0-SNAPSHOT) ve ben bunu güncellemek istedim Clojure 1.3.0 ve eklemek clojure.tools.logging .
Clojure bir derleme sırasında bir özel durum atar
vekaleten a ByteArrayOutputStream
içinde clojure.tools.logging
bireyin günlük akışı fonksiyonu:
ClassCastException: clojure.asm.Type cannot be cast to clojure.lang.IFn
( https://gist.github.com/a6ae681c37091a3d2379 )
Gittim ve kaldırılır clojure.tools.logging
ve tam olmayan bir yazdı vekil arasında Object
:
(proxy [java.lang.Object] [] (toString [] "proxy's toString"))
ve aynı şeyi ClassCastException
ve mesajı da attı .
Bir yazdırmaya çalıştı macroexpand-1 arasında vekaleten ve aynı şey var.
Clojure 1.2.0'a geri döndüm ve proxy tekrar iyi çalıştı.
1.4.0'ın bir dizi enkarnasyonunu denedim ve 1.3.0 ile aynı davranışı sergiliyorlar. 1.2.1 de bir çeşit istisna atıyor ama 1.3.0'a ulaşmaya çalışıyorum bu yüzden bununla fazla zaman harcamadım.
'Jeneratör yöntem fonksiyonuna yığın izleme noktaları birinde tanımlanan let biçimleri generate-proxy
de core_proxy.clj
.
println
Neler olduğunu anlayıp anlayamayacağımı görmek için oraya küçük bir parça ekledim . Belki bir sonraki ifade, okuyucunun benim açımdan büyük bir yanlış anlaşılmasına ihanet eder, ancak bunların eklenmesi println
, derleme zamanı davranışını hiç beklemediğim bir şekilde değiştirdi. Tüm Clojure testleri mvn package
geçmeye devam etmesine rağmen istisna konumu ve istisna türü tamamen değişti .
Örneğin, println
bayt kodu oluşturmaya başlamadan hemen önce gen yöntemine bir tek eklemek Clojure'un
ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
( https://gist.github.com/5a7a40929a6c4a104bd5 )
Nereye koyduğuma bağlı olarak başka çeşitli hatalar da gördüm, println
ancak bu en yaygın olanı.
Açıkçası, Grails ve Clojure'un bazı yönleri burada doğru şekilde birbirine geçmiyor, ancak bağlantıyı görmüyorum. İlk başta ASM uyumsuzluğundan şüphelendim ama Clojure'un kendi ASM ad alanı olduğundan, sorunun bu olduğunu göremiyorum. Ama belki yanılıyorum, günlerdir clojure.lang.Compiler
, vekil ve proxy oluşturmaya bakıyordum ve şimdi bunu çalıştırmaya çalışıyorum ve ileriye doğru ilerlemeyi bıraktım çünkü buharım tükendi :(
Bağlantı eksikliği için özür dilerim. Aşağıdan kopyalayıp yapıştırabilirsiniz:
Grails Clojure - github.com/grails-plugins/grails-clojure
Clojure Tools Logging - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj satır 133 'proxy'dir