评论 by alexmiller
对于任何 Clojure 变量,您将使用 Clojure.var() 获取对其的引用,然后在其上调用()。对于如消息这样的字面量,您可以使用 Clojure.read() 从字符串中读取 Clojure 数据,或者使用构造函数,如 hash-map。with-open 是一个宏,但在这种情况下,它基本上是在复制您可以用 try-with-resources 在 Java 中做到的事情,所以您实际上不需要它。-> 需要展开,或者您可以将更多的代码放到一个 Clojure 函数中并直接调用它。
```
我没有编译这段代码,但您将得到类似以下代码的代码
private static final IFn require = Clojure.var("clojure.core", "require");
private static final IFn doall = Clojure.var("clojure.core", "doall");
private static final Object portKW = Clojure.read(":port");
private static final Object opKW = Clojure.read(":op");
private static final Object codeKW = Clojure.read(":code");
private static final IFn connect;
private static final IFn client;
private static final IFn message;
static {
require.invoke(Clojure.read("nrepl.core"));
connect = Clojure.var("nrepl.core", "connect");
client = Clojure.var("nrepl.core", "client");
}
message = Clojure.var("nrepl.core", "message");
返回 connect.invoke(portKW, port);
}
public Object getClient(Object conn, int timeout) {
返回 client.invoke(conn, timeout);
}
public Object send(Object client, Object message) {
Object result = message.invoke(client, message);
返回 doall.invoke(result);
}
```
然后
```
try (Object conn = getConnection(59258)) {
Object client = getClient(conn, 1000);
Object result = send(client, Map.of(opKW, "eval", codeKW, "(time (reduce + (range 1e6)))"));
// result 这里是一个 map,你可以根据自己的需求进行操作
}
```