मैं विस्तार पर काम कर रहा हूँ Grails Clojure प्लगइन में Grails 2.0.0 (और 2.1.0-स्नैपशॉट) और मैं उसे अपडेट करने के लिए चाहते थे Clojure 1.3.0 और जोड़ने clojure.tools.logging ।
Clojure एक के संकलन के दौरान एक अपवाद फेंकता
प्रॉक्सी एक की 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 का प्रॉक्सी और एक ही बात हो गया।
मैं क्लोजर 1.2.0 पर लौट आया और प्रॉक्सी ने फिर से ठीक काम किया।
मैंने 1.4.0 के कई अवतारों की कोशिश की और वे 1.3.0 के समान व्यवहार प्रदर्शित करते हैं। 1.2.1 भी कुछ प्रकार के अपवादों को फेंकता है, लेकिन मैं 1.3.0 हिट करने की कोशिश कर रहा हूं, इसलिए मैंने उसके साथ ज्यादा समय नहीं बिताया।
'जनरल-विधि कार्य करने के लिए अंक स्टैक ट्रेस में से एक के रूप में परिभाषित लेट के रूपों generate-proxy
में core_proxy.clj
।
मैंने println
यह देखने के लिए कि क्या हो रहा था, उसे देखने के लिए एक छोटे से चापाकल को वहाँ चारों ओर जोड़ा । हो सकता है कि यह अगला वक्तव्य मेरे हिस्से पर पाठक की एक बड़ी गलतफहमी को धोखा दे, लेकिन बस उन लोगों println
के संकलन समय व्यवहार को एक तरह से बदल दिया, जिसकी मुझे पूरी उम्मीद नहीं थी। अपवाद स्थान और अपवाद प्रकार पूरी तरह से बदल गया, भले ही सभी क्लोजर परीक्षण mvn package
पास जारी रखने के लिए।
उदाहरण के लिए, बस एक ही println
जीन-विधि को जोड़ने से पहले यह बायटेकोड उत्पन्न करना शुरू कर देता है जिससे क्लोजर फेंक दिया जाता है
ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
( https://gist.github.com/5a7a40929a6c4a104bd5 )
मैंने विभिन्न अन्य त्रुटियों को देखा है, जहां पर मैंने println
(s) रखा है, लेकिन यह सबसे अधिक प्रचलित है।
जाहिर है कि ग्रेल्स और क्लोजर के कुछ पहलू यहां सही ढंग से नहीं लगे हैं, लेकिन मैं कनेक्शन नहीं देख रहा हूं। पहले तो मुझे ASM की असंगति पर संदेह हुआ लेकिन चूंकि क्लोजर का अपना ASM नाम स्थान है, इसलिए मैं यह नहीं देख सकता कि यह मुद्दा है। लेकिन शायद मैं गलत, मैं घूर रहा है कर रहा हूँ clojure.lang.Compiler
, प्रॉक्सी और उत्पन्न-प्रॉक्सी दिनों के लिए अब काम करने के लिए इस प्राप्त करने की कोशिश और मैं काफी आगे बना रही प्रगति क्योंकि मैं भाप समाप्त हो चुकी है बंद कर दिया है :(
मैं लिंक की कमी के लिए माफी मांगता हूं। आप नीचे से कॉपी और पेस्ट कर सकते हैं:
ग्रेल्स क्लोजर - github.com/grails-plugins/grails-clojure
क्लोजर टूल्स लॉगिंग - github.com/clojure/tools.log/blob/master/src/main/clojure/clojure/tools/log.clj लाइन 133 'प्रॉक्सी है