如果我在REPL中运行以下代码
(let [f '.startsWith] (f "abab" "a"))
它被评估为" a"而不是' true'。有人可以解释一下这个令人惊讶的结果吗?
实际上,真正的代码,我想做的工作如下。
(defn set-up-bean! [bean functions-and-parameters]
(doseq [[f p] functions-and-parameters]
(f bean p))
(.init bean))
我想要实现的是,使以下两个函数调用做同样的事情。
(set-up-bean! bean [['.setMember "a"]])
和
(do
(.setMember bean "a")
(.init bean))
答案 0 :(得分:6)
一种传统方法是使用匿名函数
(let [f (fn [a b] (.startsWith ^String a ^String b))] (f "abab" "a"))
...因为这可以让你根据需要输入提示参数。您也可以考虑memfn:
(let [f (memfn startsWith String)] (f "abab" "a"))
无论如何 - 点符号是互操作的语法糖,而不是提供真正的可调用函数。