Я работаю над расширением плагина Grails Clojure в Grails 2.0.0 (и 2.1.0-SNAPSHOT), и я хотел обновить его до 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 из прокси и получил то же самое.
Я вернулся к Clojure 1.2.0 и proxy снова работал нормально.
Я пробовал несколько воплощений 1.4.0, и они демонстрируют то же поведение, что и 1.3.0.1.2.1 также выдает какое-то исключение, но я пытаюсь использовать 1.3.0, поэтому я не трачу на это много времени.
Трассировка стека указывает на функцию 'gen-method, определенную в одном let форм generate-proxy
в core_proxy.clj
.
Я добавил небольшое количество println
, чтобы посмотреть, смогу ли я уловить происходящее.Возможно, это следующее утверждение предаст огромное недоразумение читателя с моей стороны, но простое добавление этих println
изменило поведение времени компиляции так, как я совершенно не ожидал.Расположение и тип исключения полностью изменились, хотя все тесты Clojure в mvn package
продолжают проходить.
Например, просто добавление одного println
в метод gen непосредственно перед началом генерации вызываемого байт-кодаClojure to throw
ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class
(https://gist.github.com/5a7a40929a6c4a104bd5)
Я видел различные другие ошибки в зависимости от того, куда я положил println
(s)) но это является наиболее распространенным.
Очевидно, что некоторые аспекты Grails и Clojure здесь не правильно, но я не вижу связи.Сначала я подозревал несовместимость ASM, но, поскольку Clojure имеет собственное пространство имен ASM, я не вижу в этом проблемы.Но, возможно, я ошибаюсь, я смотрел на clojure.lang.Compiler
, proxy и generate-proxy уже несколько дней, пытаясь заставить это работать, и я в значительной степени остановилсяпродвигаясь вперед, потому что у меня кончились силы: (
Я извиняюсь за отсутствие ссылок. Вы можете скопировать и вставить их ниже:
Grails Clojure - github.com/ grails-plugins / grails-clojure
Регистрация инструментов Clojure - github.com / clojure / tools.logging / blob / master / src / main / clojure / clojure / tools / logging.clj строка 133 является прокси