假设我们有一个 Java 类:
public class Fun {
public int foo () {
return 1;
}
public int bar () {
return 2;
}
}
下面的代码在 Clojure 中不起作用:
(defn f [method]
(. (new Fun) method))
(f foo)
产生预期的错误(这里没有问题):
CompilerException java.lang.RuntimeException:无法解析符号:在此上下文中的 foo,正在编译...:
但是如果我尝试引用符号
(f 'foo)
它会产生一个不同但也是预期的错误:
IllegalArgumentException 找不到匹配的字段:com.dullesopen.srl.FunCall clojure.lang.Reflector.getInstanceField 类的方法(Reflector.java:271)
该错误是预期的,因为根据特殊形式的文档。(点)第二个参数被假定为匹配字段或方法的名称,因此从 Clojure 的角度来看,它不是一个实际的符号。
下面的方法解决了这个问题,但我不喜欢额外的memfn
. 对我来说,这表明 Java 方法实际上并不是 Clojure 中的第一类对象。
(defn f [method]
(method (new FunCall)))
(f (memfn foo))
所以问题是:有没有办法“指示”.
第二个参数应该以某种方式解析/评估以获得方法名称的特殊形式?或者也许还有另一个类似于 dot 但解决了第二个参数的特殊情况?