在Clojure中使用java方法作为函数参数

时间:2014-04-16 19:26:50

标签: java clojure

如何在Clojure中使用java方法作为函数参数?

例如,我想制作一个函数组合:

user> (Integer. (str \9))
9
user> ((comp Integer. str) \9)
CompilerException java.lang.ClassNotFoundException: Integer., compiling:(NO_SOURCE_PATH:1:2) 

这不起作用。

memfn也无济于事:

user> (map (comp (memfn  Integer.) str) "891")
IllegalArgumentException No matching method found: Integer. for class java.lang.String  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)

有什么想法吗?

相关问题(虽然没有给出正确答案):

(注意:似乎是dave建议的答案,使用匿名函数作为包装器,是最好的解决方案)

1 个答案:

答案 0 :(得分:4)

与Clojure函数不同,Java方法并非设计为第一类。当您在Clojure中使用Java inter-op时,您实际上正在使用Java方法,因此您无法获得为Clojure函数实现的额外好处。有关详细信息,请参阅以下评论。

作为使用Java方法作为参数的解决方法,您可以将它们包装在匿名函数中,就像这样,有效地使它们成为Clojure函数:

((comp #(Integer. %) str) \9)