Я работаю над расширением плагина Clojure Grails в Grails 2.0.0 (и 2.1.0-SNAPSHOT), и я хотел обновите его до Clojure 1.3.0 и добавьте clojure.tools.logging .
Clojure выдает исключение во время компиляции
прокси из ByteArrayOutputStream
в функции потока журнала clojure.tools.logging
:
ClassCastException: clojure.asm.Type не может быть преобразован в закрытие .lang.IFn
( https://gist.github.com/a6ae681c37091a3d2379 )
Я удалил clojure.tools.logging
и записал урезанный прокси из Object
:
(proxy [java.lang.Object] [] (toString [] «toString прокси») )
, а также выбросило то же исключение ClassCastException
и сообщение.
Я попытался напечатать macroexpand-1 прокси и получил то же самое.
Я вернулся к Clojure 1.2.0, и прокси снова работал нормально.
Я пробовал несколько версий 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 сгенерировал
ClassCastException: clojure.lang.PersistentArrayMap нельзя преобразовать в 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 - это прокси