Clojure 1.2.1 / 1.3 / 1.4 'прокси, сгенерированный в Grails 2.0.0, не работает.1.2.0 в порядке - PullRequest
103 голосов
/ 01 февраля 2012

Я работаю над расширением плагина 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 является прокси

1 Ответ

4 голосов
/ 21 ноября 2012

Я нашел проблему с именем CLJ-944 на clojure.org .Там вы можете найти исправление для ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Class проблемы

Проблема:

в том, что компилятор вводит неправильное приведение к clojure.lang.PersistentHashMap.В этом случае его, вероятно, следует привести к clojure.lang.Associative, наивысшему общему интерфейсу с методом .containsKey.

Patch 1 - 0001-Fix-for-CLJ-944.patch

Патч 2 - 0002-Fix-for-CLJ-944.patch

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...