2013-11-15 60 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