我在Clojure中构建DSL时遇到了问题。这是我从其他所有问题中分离出来的具体问题。
假设我们有一个简单的宏:
user> (defmacro m1 [x] `'~x)
#'user/m1
它只是返回提供的字面量 用户>(m1 toUpperCase) toUpperCase 如果我们调用对象的Java方法,一切都按预期工作。
user> (. "a" toUpperCase)
"A"
但是,如果我们用返回方法名称的宏调用替换方法名称。
user> (. "a" (m1 toUpperCase))
; Evaluation aborted.
Unable to resolve symbol: toUpperCase in this context
我想使用一些具有像 a().b().c() 这样流畅接口的 Java 库。 在 Clojure 中,这对应为:
(.. obj method1 method2 method3....etc)
我想创建宏来替换这个链中的某些部分,所以我的代码应该是这样的:
(.. obj method1 macro1)
这句话的英译中文是:“这应该扩展到”。
(.. obj method1 method2 method3)
"definline也没有帮助。我也尝试了那个。"