Java-взаимодействие Clojure хорошо, но часто связывает между собой объектно-ориентированный Java-API (особенно тот, который требует подклассов, аннотаций и состояния) и код clojure неудобен.Чтобы сделать это проще, у меня была мысль попытаться предоставить оболочку, такую, чтобы я мог написать что-то вроде этого:
(component "Foo"
(handler "bar"))
и, реализовав component
и handler
в качестве макросов, я мог бы вернуть что-то более уродливоено исправить так:
(gen-class
[component-name]
:name ^{Component {}} (str "com.foobar." component-name)
:implements [com.foobar.api.SomeInterface]
:main false
:constructors {[com.foobar.data.SomeData]} []}
...
Однако, хотя кажется, что мой макрос component
расширится до приведенного выше кода, gen-class
представляется специальной формой, которая ищется во время компиляции и анализируется без оценки ее"детские формы".Это означает, что формы, подобные (str "com.foobar." component-name)
, не оцениваются, и сгенерированный класс на самом деле ./(str "com/foobar/" name).class
Можно ли в любом случае создать небольшой DSL для генерации Java-классов, подобных этой?