dozq ve Clojure için arasındaki fark nedir? Birini diğerini kullanmayı ne zaman tercih edeceğinize dair örnekler nelerdir?dozq ve için Clojure arasındaki fark
cevap
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.
Not doseq
for
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.
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
@johnbakers Değerlendirme kesintiye uğrayana kadar sonsuza dek bloke olacak. Clojure, sonsuz dizileri sonlu dizilerden farklı bir şekilde işlemeye asla kalkışmaz. –
- 1. ASCIIEncoding ve Encoding Arasındaki Fark
- 2. SimpleStringProperty ve StringProperty arasındaki fark
- 3. Gradle ve Maven Arasındaki Fark?
- 4. HttpCookie ve Çerez arasındaki fark?
- 5. Arşivleme ve sıkıştırma arasındaki fark
- 6. javax.sql ve java.sql arasındaki fark?
- 7. Ipa ve xcarchive arasındaki fark
- 8. string.h ve strings.h arasındaki fark
- 9. jsRender ve jsViews arasındaki fark
- 10. İşlem ve TransactionScope Arasındaki Fark
- 11. eylem ve action.async arasındaki fark
- 12. Geckodriver ve marionette arasındaki fark
- 13. IsGenericType ve IsGenericTypeDefinition arasındaki fark
- 14. arasındaki fark
- 15. XeLaTeX ve pdfLaTeX arasındaki fark
- 16. netTcpContextBinding ve netTcpBinding arasındaki fark
- 17. Sürücü ve sağlayıcı arasındaki fark
- 18. typedef arasındaki fark ve tanımlamak
- 19. Python'da {} ve [] arasındaki fark nedir?
- 20. Dize [] ve [dize] arasındaki fark
- 21. Redis ve kafka arasındaki fark
- 22. mapM ve forM arasındaki fark
- 23. NSLog ve DLog arasındaki fark
- 24. UNIX'teki $ @ ve $ * arasındaki fark nedir?
- 25. java.util.Scanner ve java.util.Scanner arasındaki fark. *
- 26. ServiceProcessInstaller ve ServiceInstaller arasındaki fark
- 27. dtrtrs ve dtrsm arasındaki fark
- 28. Kodlama ve harmanlama arasındaki fark?
- 29. autoconf ve autoreconf arasındaki fark
- 30. SCM ve SVN arasındaki fark
Harika cevap. Teşekkürler! –
şimdi çok yan etkileri olan ... nükleer savaş başlığı başlatıyor :) – Marc
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ı. –