Clojure的Java互操作性很好,但是通常在面向对象的Java API(尤其是需要子类,注释和状态的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类吗?