Динамически вычислительный ген-класс - PullRequest
0 голосов
/ 14 декабря 2018

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-классов, подобных этой?

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