2012-08-30 19 views
5

nasıl oluşturabilirim:Ben bu beklendiği gibi çalıştığını Running tembel-seq vektör

(defn long-seq-vec [n] 
    (lazy-seq (into 
      (vector (list n {:somekey (* n 2)})) 
      (long-seq-vec (+ n 1))))) 
(take 3 (long-seq-vec 3)) 

Bu bana bir yığın veriyor:

(defn long-seq [n] 
    (lazy-seq (cons 
      (list n {:somekey (* n 2)}) 
      (long-seq (+ n 1))))) 
(take 3 (long-seq 3)) 
; => ((3 {:somekey 6}) (4 {:somekey 8}) (5 {:somekey 10})) 

Ancak bir vektör ile aynı şeyi yapmak istiyorum taşma. Niye ya?

cevap

8

ana nedeni vektörler yavaş değildir - yani into arama iştahla yığın taşmasına long-seq-vec ve sonuçlar ürettiği özyinelemeli dizileri kullanır. Bunun bir sonucu olarak, sonsuz bir vektör oluşturmak mümkün değildir (genelde, eğer tembel veya döngüsel ise sonsuz bir veri yapısı yaratabilirsiniz). İlk örnekte çalışır çünkü cons, tembel bir dizinin önüne geçerken tembel davrandığı için oldukça mutlu olduğundan, dizi sonsuz olabilir.

(defn long-seq-vec [n] 
    (for [x (iterate inc n)] 
    (vector x {:somekey (* x 2)}))) 

I:

(defn long-seq-vec [n] 
    (lazy-seq (cons 
       (vector n {:somekey (* n 2)}) 
       (long-seq-vec (+ n 1))))) 

(take 3 (long-seq-vec 3)) 

=> ([3 {:somekey 6}] [4 {:somekey 8}] [5 {:somekey 10}]) 

Veya alternatif olarak

, sen kendi içinde tembel for kullanabilirsiniz:

aslında ben gibi bir şey öneririm vektörlerin sonsuz dizisi istiyorum varsayarsak Bu, lazy-seq/cons klişeden kaçınıyor, yinelemeden kaçınıyor ve işlevin ne ifade ettiğini biraz daha net gösteriyor ... isterseniz biraz daha "bildirim". map'u da benzer şekilde kullanabilirsiniz.

İlgili konular