gpt4 book ai didi

clojure - 将 Java 方法作为参数传递

转载 作者:行者123 更新时间:2023-12-02 10:29:01 25 4
gpt4 key购买 nike

假设我们有一个 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: Unable to resolve symbol: foo in this context, compiling...:

但是如果我尝试引用该符号

(f 'foo)

它产生了一个不同但也是预期的错误:

IllegalArgumentException No matching field found: method for class com.dullesopen.srl.FunCall clojure.lang.Reflector.getInstanceField (Reflector.java:271)

该错误是预期的,因为根据特殊形式的文档。 (点)假定第二个参数与字段或方法的名称匹配,因此从 Clojure 的角度来看,它不是实际的符号。

下面的方法解决了问题,但我不喜欢额外的memfn。对我来说,这表明 Java 方法实际上并不是 Clojure 中的第一类对象。

(defn f [method]
(method (new FunCall)))

(f (memfn foo))

所以问题是:有没有办法“指示”特殊形式 . 第二个参数应该以某种方式解析/评估以获得方法名称?或者也许还有另一个类似于点的特殊符号,但第二个参数已解决?

最佳答案

您的理解是正确的,java 方法实际上并不是 clojure 中的一等公民。您不能独立于其类来传递方法。我能想到的最接近的方法是传递了解类和方法的函数,或者使用宏来构建对每个类的方法的调用。如果您不喜欢上面的方法(对我来说看起来非常好)那么这可以直接使用宏来完成,但我个人更喜欢你的方法:

user> (defmacro f [method]
`(. (String. "asdf") ~method))
#'user/f
user> (f hashCode)
3003444

PS:memfn 已被函数字面量语法替换。它很少被使用。

关于clojure - 将 Java 方法作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28638601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com