在Clojure中将java方法用作函数参数

在Clojure中将java方法用作函数参数,java,clojure,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 Int

如何在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建议的答案似乎是使用匿名函数作为包装器,这是最好的解决方案)

与Clojure函数不同,Java方法不是设计为一流的。当您在Clojure中使用Java inter-op时,您实际上是在使用Java方法,因此无法获得Clojure函数实现的附加好处。有关更多信息,请参阅下面的评论

作为使用Java方法作为参数的一种变通方法,您可以将它们包装在匿名函数中,如下所示,有效地使它们成为Clojure函数:

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

戴夫,谢谢你,这总比什么都没有好,但我希望还有其他的方法(+1)为什么方法不是Clojure函数?Clojure函数是符合
IFn
接口的Java对象,该接口有一堆
invoke
方法(最多20个)和两种调用无限长参数列表的方法。所有这些都接受Java
Object
参数,还返回一个Java
Object
。您可以在中找到
IFn
,它们不是一流的,因为在我看来,要么选择的函数不是真正一流的值(使语言更弱),要么对所有jvm方法进行抽象,使它们像真正的函数一样工作(使语言过于复杂)。我也很好奇,了解为什么不能使用Java方法作为函数。我对Java了解不多,但我猜Java方法在Java中不是一流的,所以Clojure将此功能添加到了它自己的函数中,但当您使用Java inter-op时,您实际上是在处理Java方法,因此您无法获得Clojure函数所带来的额外好处。Clojure保持其互操作层尽可能小和简单,方法并不意味着是一流的。