Clojure修改LazySeq

时间:2014-01-17 18:49:27

标签: clojure lazy-sequences

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

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

2)然后它将相同的LazySeq对象(未更改)传递回Clojure脚本,在该脚本中将其转换为String并传递回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,但是找不到修改(或添加)元素的方法。

谢谢,

克里斯

1 个答案:

答案 0 :(得分:0)

简答:你做不到。 LazySeq是不可改变的。

更长的回答:一般来说,Clojure代码对它所接收的列表对象的确切类型做了很少的假设 - 大部分内容都适用于PersistentHashMap,如果你不想打扰它与其他Clojure类型相比,实现起来相当简单。

因此,您需要创建一个实现ISeq的类,并在其父ISeq运行时返回已转换的PersistentHashMap。实例化该类并将其传递给LazySeq