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

Igo*_*bin 4 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) 
Run Code Online (Sandbox Code Playgroud)

那是行不通的。

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)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

相关问题(但没有给出问题的正确答案):

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

Dav*_*ood 7

与 Clojure 函数不同,Java 方法并不是被设计为一流的。当您在 Clojure 中使用 Java 互操作时,您实际上是在使用 Java 方法,因此您无法获得为 Clojure 函数实现的额外好处。欲了解更多信息,请参阅下面的评论。

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

((comp #(Integer. %) str) \9)
Run Code Online (Sandbox Code Playgroud)

  • 为什么 Clojure 方法不是函数?Clojure 函数是符合“IFn”接口的 Java“对象”,该接口具有一堆最多 20 个所有参数的“调用”方法,以及几种调用无限长参数列表的方法。所有这些都接受 Java `Object` 参数并返回一个 Java `Object`。您可以在 https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java 找到 `IFn` (2认同)
  • 确切地。Clojure 保持其互操作层尽可能小和简单,并且方法并不意味着是一流的。 (2认同)