在clojure中将java方法名称作为函数arg

Nic*_*ton 4 macros function clojure

所有,

我想创建一个函数,它接受表示java方法的符号并将其应用于某个对象:

(user=> (defn f [m] (. "foo" (m)))
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,我得到的结果与我的预期有很大不同

user=> (f 'getClass)
java.lang.IllegalArgumentException: No matching method found: m for class java.lang.String (NO_SOURCE_FILE:0)
Run Code Online (Sandbox Code Playgroud)

2个问题:

1>为什么符号m被称为'.'的第二个arg.函数而不是绑定到m的值?

2>我将如何实际做我想做的事情?

Bri*_*per 12

它不起作用,因为它.是一种特殊的形式,并有特殊的评估规则.普通函数调用评估它们的参数,但.不评估method-name参数.

要使其工作,请使用eval或将您的功能更改为宏.

user=> (defmacro foo [o m] `(. ~o ~m))
#'user/foo
user=> (foo 123 toString)
"123"
user=> (defn bar [o m] (eval `(. ~o ~m)))
#'user/bar
user=> (bar 123 'toString)
"123"
Run Code Online (Sandbox Code Playgroud)

使用eval不建议一般.