Clojure 尝试将java成员函数作为变量传递

Clojure 尝试将java成员函数作为变量传递,clojure,Clojure,如果我在REPL中运行以下代码 (让[f'.startsWith](f“abab”“a”)) 它的计算结果为“a”,而不是“true”。有人能给我解释一下这个令人惊讶的结果吗 实际上,真正的代码,我想做的工作如下 (defn设置bean![bean函数和参数] (doseq[[f p]函数和参数] (f)(p) (.initbean)) 我想要实现的是,让下面两个函数调用做相同的事情 (设置bean!bean[['.setMember“a”]] 及 (做什么 (.setmemberbean

如果我在REPL中运行以下代码

(让[f'.startsWith](f“abab”“a”))
它的计算结果为“a”,而不是“true”。有人能给我解释一下这个令人惊讶的结果吗

实际上,真正的代码,我想做的工作如下

(defn设置bean![bean函数和参数]
(doseq[[f p]函数和参数]
(f)(p)
(.initbean))
我想要实现的是,让下面两个函数调用做相同的事情

(设置bean!bean[['.setMember“a”]]

(做什么
(.setmemberbean“a”)
(.initbean))

一种传统方法是使用匿名函数

(let [f (fn [a b] (.startsWith ^String a ^String b))] (f "abab" "a"))
…因为这样可以根据需要键入提示参数。你也可以考虑:


无论如何——点符号是互操作的语法糖,而不是提供真正的可调用函数。

谢谢您的回复!当我运行
(让[f(memfn startsWith)](f“abab”“a”)
时,我得到了以下错误。ArityException传递给以下对象的参数数目错误(2):user/eval908/f--910 clojure.lang.AFn.throwArity(AFn.java:429)是--带有
memfn
的原始示例缺少参数。请查看当前的编辑,这些编辑是经过复制和粘贴测试的。更准确地说,
(.startsWith…
(.startsWith…
)的语法糖,
(…)
是一种特殊形式,而不是函数。不能将特殊形式存储在变量中并从那里“调用”它,就像不能将宏存储在变量中并“调用”它一样。一个特殊的表单告诉编译器“在这里生成一些特殊的代码,而不是函数调用的普通代码”。
(let [f (memfn startsWith String)] (f "abab" "a"))