clojure - 动态计算 gen-class
问题描述
Clojure 的 Java 互操作性很好,但通常在面向对象的 Java API(尤其是需要子类化、注释和状态的 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 类吗?
解决方案
推荐阅读
- razor - 当 ViewBag.Message 不为空但没有临时变量时如何渲染它?
- python - 通过拥有多个列表将数据框转换为字典?
- mysql - 如何使用 My Sql 获取财政年度数据
- php - 如何设置paypal订阅支付系统
- c# - WCF:从 .net Framework 迁移到 .net Core
- excel - 从 Shiny Web 应用程序访问远程服务器文件
- php - 用于将高级搜索字符串转换为关联数组的包?
- javascript - 在 highcharts 中的饼图和条形图之间切换
- javascript - 边框颜色悬停效果问题
- c# - 在本地时区格式化 UTC 时间戳