Я працюю над розширенням плагіна 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 є «проксі