首页 > 解决方案 > 动态计算 gen-class

问题描述

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

标签: clojure

解决方案


推荐阅读