在Clojure中将java方法用作函数参数
如何在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
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个)和两种调用无限长参数列表的方法。所有这些都接受JavaObject
参数,还返回一个JavaObject
。您可以在中找到IFn
,它们不是一流的,因为在我看来,要么选择的函数不是真正一流的值(使语言更弱),要么对所有jvm方法进行抽象,使它们像真正的函数一样工作(使语言过于复杂)。我也很好奇,了解为什么不能使用Java方法作为函数。我对Java了解不多,但我猜Java方法在Java中不是一流的,所以Clojure将此功能添加到了它自己的函数中,但当您使用Java inter-op时,您实际上是在处理Java方法,因此您无法获得Clojure函数所带来的额外好处。Clojure保持其互操作层尽可能小和简单,方法并不意味着是一流的。