2013-11-15 61 views
1

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

的数据结构,我AREADY已经是地图的懒惰序列,它看起来像这样:

({:a 1 :b 1}) 

现在我想提出的是懒惰-SEQ成另一个,这样的结果将是一个懒序列的地图lazy-seq:

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

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

问候,

+0

您可以添加几个步骤到您的最终预期输出,我不能完全理解您的要求意义 – tangrammer

+0

你好tangrammer。 Thx为您的答复。我其实不想输出。重点是还有另外一个函数,把一个seq映射作为参数,这就是说(({:a 1:b 1}))。 – Horace

回答

1

下面是创建包含地图列表清单的例子:

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

这不是懒惰,但你可以使用lazy-seq macro:

=> (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})) 

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

+0

Thx Leonid。你说得对,没有必要让这两个列表都懒惰。这是我的推理错误;-) – Horace

0

一般,没有什么特别的具有含许多懒惰序列的一个懒惰-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