我想使用 clojure 创建一个包含另一个惰性序列的惰性序列。
我已经拥有的数据结构是 map 的惰性序列,它看起来像这样:
({:a 1 :b 1})
现在我想把那个lazy-seq放到另一个中,这样结果就是map的lazy-seq的lazy-seq:
(({:a 1 :b 1}))
有谁知道如何做到这一点?任何帮助,将不胜感激
问候,
我想使用 clojure 创建一个包含另一个惰性序列的惰性序列。
我已经拥有的数据结构是 map 的惰性序列,它看起来像这样:
({:a 1 :b 1})
现在我想把那个lazy-seq放到另一个中,这样结果就是map的lazy-seq的lazy-seq:
(({:a 1 :b 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}))
我不确定您要做什么以及为什么要让两个列表都变得懒惰。因此,如果您需要进一步的帮助,请提供更好的解释。
一般来说,拥有一个包含许多惰性序列的惰性序列并没有什么特别之处,所以我不明白你真正想要的是什么。
你总是可以的
(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