【问题标题】:Clojure modify LazySeqClojure 修改 LazySeq
【发布时间】:2014-01-17 18:49:27
【问题描述】:

我继承了一些执行以下操作的 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,但找不到修改(或添加)元素的方法。

谢谢,

克里斯

【问题讨论】:

  • 你可以把它当作一个可迭代的集合。
  • LazySeq 和 PersistentHashMap 都是不可变的——本质上,您需要做的是根据您传递的内容构建一个新序列。在 Java 中完成这项工作将是一项不小的工作。
  • @Alex 这很简单,例如把它变成一个ArrayList(ArrayList构造函数接受一个Collection),随意变异ArrayList,并返回ArrayList,假设接收Clojure代码只需要一个Collection。
  • @A.Webb True,您可以类似地使用 HashMap 的复制构造函数来改变序列中的映射。但是很多惯用的 Clojure 代码如果在它期望持久映射的地方接收到原始映射,就会中断;在不了解 Clojure 代码的情况下,我不想做出任何此类假设。
  • @Alex 对。我更多地考虑改变集合而不是集合的内容。或者,使用clojure.lang.RT 来完成这项工作。

标签: clojure lazy-sequences


【解决方案1】:

简答:你不能。 Clojure 中的 LazySeqPersistentHashMap 是不可变的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多