动态计算gen-class

时间:2018-12-14 00:45:15

标签: clojure

Clojure的Java互操作性很好,但是通常在面向对象的Java API(尤其是需要子类,注释和状态的Java API)和clojure代码之间架桥。为了简化此过程,我考虑过尝试提供一个包装器,以便可以编写如下内容:

(component "Foo"
   (handler "bar"))

并通过将componenthandler实现为宏,我可以返回较丑但正确的内容,例如:

(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类吗?

0 个答案:

没有答案