1

我想使用 clojure 创建一个包含另一个惰性序列的惰性序列。

我已经拥有的数据结构是 map 的惰性序列,它看起来像这样:

({:a 1 :b 1})

现在我想把那个lazy-seq放到另一个中,这样结果就是map的lazy-seq的lazy-seq:

(({:a 1 :b 1}))

有谁知道如何做到这一点?任何帮助,将不胜感激

问候,

4

2 回答 2

1

以下是创建包含地图列表的列表的示例:

=> (list (list {:a 1 :b 1}))
(({:a 1, :b 1}))

它不是懒惰的,但您可以使用lazy-seq宏使两个列表都变得懒惰:

=> (lazy-seq (list (lazy-seq (list {:a 1 :b 1}))))

或与->宏相同的代码:

=> (-> {:a 1 :b 1} list lazy-seq list lazy-seq)

实际上,如果您将此处的列表替换为向量,您将得到相同的结果:

=> (lazy-seq [(lazy-seq [{:a 1 :b 1}])])
(({:a 1, :b 1}))

我不确定您要做什么以及为什么要让两个列表都变得懒惰。因此,如果您需要进一步的帮助,请提供更好的解释。

于 2013-11-15T14:01:44.333 回答
0

一般来说,拥有一个包含许多惰性序列的惰性序列并没有什么特别之处,所以我不明白你真正想要的是什么。

你总是可以的

(map list '({:a 1 :b 1}))   ;; gives (({:a 1, :b 1}))

我们甚至可以验证它是否保持惰性:

(def a
  (concat
   (take 5 (repeat {:a 1 :b 2}))
   (lazy-seq
    (throw (Exception. "too eager")))))

(println (take 5 (map list a))) ;; works fine
(println (take 6 (map list a))) ;; throws an exception
于 2013-11-15T13:58:17.377 回答