2011-01-18 17 views

cevap

141

Fark, for'un bir tembel sekans oluşturması ve doseq'un yan etkileri yürütürken döndürmesi ve nil değerini döndürmesidir.

user=> (for [x [1 2 3]] (+ x 5)) 
(6 7 8) 
user=> (doseq [x [1 2 3]] (+ x 5)) 
nil 
user=> (doseq [x [1 2 3]] (println x)) 
1 
2 
3 
nil 

Diğer dizilere göre yeni bir sıra oluşturmak istiyorsanız, için kullanın. Eğer bazı sekansların elemanlarına dayanarak yan etkiler yapmak (baskı yapmak, bir veritabanına yazmak, nükleer savaş başlığını başlatmak, vb.) Istiyorsanız, doseq kullanın.

+0

Harika cevap. Teşekkürler! –

+9

şimdi çok yan etkileri olan ... nükleer savaş başlığı başlatıyor :) – Marc

+4

Teşekkürler! "Uzun zamandır" saçlarımı, "niye" ile çekiyordum ki, nükleer savaş başlıklarımı, eşya listemde asla ateşlemiyordu. "doseq" emin yaptı. –

51

Not doseqfor tembel olduğunu da unutmayın. Rayne yanıtında eksik örnekte, bu ne istersen yap genelde, ama bu temelde bir tesadüf, REPL At

(for [x [1 2 3]] (println x)) 

geçerli: REPL printlns gerçekleşmesi neden for tarafından üretilen tembel diziyi zorlar. Etkileşimli olmayan bir ortamda, hiçbir şey basılmaz. def formu yeni oluşturulan /var,...vb değil kendisine bağlı olduğu değer verdiği için Sen REPL yazdırmak için bir şey yok,

user> (def lazy (for [x [1 2 3]] (println 'lazy x))) 
#'user/lazy 

user> (def eager (doseq [x [1 2 3]] (println 'eager x))) 
eager 1 
eager 2 
eager 3 
#'user/eager 

sonuçlarını karşılaştırarak eylem bu görebilirsiniz ve lazy sevk edecektir Gerçekleşmemiş bir tembel-sıraya: onun hiçbir unsuru hiç hesaplanmamıştır. eager, nil'a atıfta bulunacak ve tüm baskısı yapılacaktır.

+0

Doz, sonsuz tembel dizinin değerlendirmesini nasıl ele alır? kötü bir fikir? sadece istekli veya tembel olan sonlu sekanslarda mı çağırsın? – johnbakers

+0

@johnbakers Değerlendirme kesintiye uğrayana kadar sonsuza dek bloke olacak. Clojure, sonsuz dizileri sonlu dizilerden farklı bir şekilde işlemeye asla kalkışmaz. –