1

我继承了一些执行以下操作的 Java 代码:

1) 它从 Clojure 接收一个 LazySeq 对象(由许多 PersistentHashMap 对象组成)

2) 然后它将相同的 LazySeq 对象(未更改)传递回 Clojure 脚本,在该脚本中将其转换为字符串并传递回 Java

问题是在步骤 (1) 之后和步骤 (2) 之前的 Java 代码中,我需要修改 LazySeq 中的一些 PersistentHashMap 对象,然后继续执行步骤 (2)。就像是:

LazySeq seq = clojureFunctionReturningLazySeq();

//update the elements of the sequence

String result = clojureFunctionReceivingLazySeq(seq);

我无法修改 Clojure 脚本本身,并且 LazySeq 的更新必须在 Java 代码中进行。我检查了 LazySeq API,但找不到修改(或添加)元素的方法。

谢谢,

克里斯

4

1 回答 1

0

简短的回答:你不能。LazySeq并且PersistentHashMap在 Clojure 中是不可变的。

更长的答案:通常,Clojure 代码对其接收的列表对象的确切类型很少做出假设 - 大多数事情都适用ISeq,如果您不想打扰其他 Clojure 类型,那么实现起来相当简单。

因此,您需要创建一个类,当它通过其 parent 时实现ISeq并返回 transform 。实例化该类并将其传递给。PersistentHashMapLazySeqclojureFunctionReceivingLazySeq(seq)

于 2015-03-18T06:43:43.247 回答