对于任何Clojure变量,您将使用Clojure.var()来获取其引用,然后在其上调用invoke()。对于类似消息的文本,您可以使用Clojure.read()从字符串中读取Clojure数据,或者使用构造函数如hash-map。with-open是一个宏,但在这种情况下,它基本上是在模仿Java中的try-with-resources能做到的,所以您实际上不需要它。->将需要展开,或者您可以将更多的代码放入一个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");
}
public 对象 getConnection(int 端口) {
return connect.invoke(portKW, 端口);
}
public 对象 getClient(对象 conn, int 超时) {
return client.invoke(conn, 超时);
}
public 对象 send(对象 client, 对象 message) {
对象 result = message.invoke(client, message);
return doall.invoke(result);
}
```
然后
```
try (对象 conn = getConnection(59258)) {
对象 client = getClient(conn, 1000);
对象 result = send(client, Map.of(opKW, "eval", codeKW, "(time (reduce + (range 1e6)))"));
// result here is a map, do what you want with it
}
```