clojure:创建一个包含另一个lazy-seq的lazy-seq

时间:2013-11-15 13:14:01

标签: clojure lazy-sequences

我想使用clojure创建一个包含另一个lazy-seq的lazy-seq。

我所拥有的数据结构是一个lazy-seq的map,它看起来像这样:

({:a 1 :b 1})

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

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

有谁知道怎么做?任何帮助将不胜感激

此致

2 个答案:

答案 0 :(得分: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}))

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

答案 1 :(得分:0)

一般来说,懒惰seq包含许多lazy-seq并没有什么特别之处,所以我不明白你究竟是在追求什么。

你总能做到

(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