Я працюю над розширенням плагіна Grails Clojure у Grails 2.0.0 (та 2.1.0-SNAPSHOT), і хотів оновити його до Clojure 1.3.0 та додати Clojure.tools.logging .
Clojure кидає виняток при компіляції
проксі з ByteArrayOutputStream
в clojure.tools.logging
функції входу потоку «S:
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-method, визначену в одній із пускових форм 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
( -ла ), але це є найбільш поширеним.
Очевидно, що деякі аспекти Грааля і Клуджура тут неправильно пов'язані, але я не бачу зв'язку. Спочатку я підозрював несумісність ASM, але оскільки у Clojure є власний простір імен ASM, я не можу побачити, що це проблема. Але , може бути , я помиляюся, я дивився на clojure.lang.Compiler
, проксі і згенерувати проксі в протягом декількох днів тепер намагається отримати цю роботу , і я в значній мірі перестав робити вперед прогрес , тому що я видихатися :(
Прошу вибачення за відсутність посилань. Ви можете скопіювати та вставити знизу:
Grails Clojure - github.com/grails-plugins/grails-clojure
Clojure Інструменти Logging - github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj лінія 133 є «проксі