Clojureでのdoseqとforの違いは何ですか? 1つを他のものに重ねて使用する場合の例は何ですか?Clojureでのdoseqとforの差
答えて
違いは、for
はレイジーシーケンスを作成し、それを返しますが、doseq
は副作用を実行するものであり、nilを返します。
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
他のシーケンスに基づいて新しいシーケンスを作成する場合は、forを使用します。いくつかのシーケンスの要素に基づいて副作用(印刷、データベースへの書き込み、核弾頭の起動など)をしたい場合は、doseqを使います。
または熱心ですが、for
は遅延しています。レインの答えに欠けている例は、REPLで
(for [x [1 2 3]] (println x))
あり、これは一般的に、あなたがやりたいだろうが、それは基本的には偶然の一致だ:REPLはprintlnsが起こることを引き起こして、for
によって生成怠惰なシーケンスを強制します。非対話環境では、何も印刷されません。 def
フォームが新しい作成var、およびないそれにバインドされている値を返しますので、あなたは、REPLを印刷するための何もない、
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
の結果を比較することによって、この動作を確認することができ、かつlazy
が参照されます実現されていないlazy-seq:その要素はまったく計算されていません。 eager
はnil
を参照し、そのすべての印刷が完了しています。
doseqは無限レイジーシーケンスの評価をどのように扱いますか?悪いアイデア?それを熱意か怠惰の有限シーケンスでしか呼び出せませんか? – johnbakers
@johnbakers評価が中断されるまで永遠にブロックされます。 Clojureは有限シーケンスとは異なる方法で無限シーケンスを処理することはありません。 –
- 1. 使用doseq /無限配列のClojureで
- 2. clojureでforeach(doseq)を実装しています
- 3. Clojure:現在のレコードとSQLのレコードとの時差
- 4. DSL for Clojure画像合成
- 5. FWPDの吸血鬼データ解析プログラム、Clojure for the BraveとTrue
- 6. トークンとClojureの
- 7. JLabelのアイコンClojureの上でまだのClojureとmiglayout
- 8. 空のマップにあるdoseqのassoc文字列
- 9. のClojure:ブレイブと真のためにはClojureで
- 10. のClojureの喜びでClojureの
- 11. Clojureのカウントリソース使用(REPLで、Clojureの1.7.0)
- 12. ClojureとClojureによる再帰と勇気のための
- 13. clojureでnested forを使用する方法
- 14. 値の差とタイムスタンプの差が理想的でないSQLテーブルとの差
- 15. forループを使った時差効果
- 16. 桁のClojureで
- 17. Clojureでのイントロスペクション
- 18. ClojureでのLetとBindingの比較
- 19. ClojureクラスからのClojure ISeq
- 20. Clojureのは、やると再発形式のClojureに
- 21. JavaからClojureを呼び出すときのスコープClojureのスコープ
- 22. clojureとscala interop
- 23. ClojureとWebSocket
- 24. Clojureフィンガーツリーとflexvec
- 25. Clojureのマップと等価性
- 26. RejectedExecutionExceptionとClojureの並行性
- 27. レース条件とClojureのアトム
- 28. Clojureの仕様とレコードコンストラクタ
- 29. Clojure - '(アポストロフィ)と `(バックティック)の違い
- 30. java interopとclojureのマクロ
偉大な答え。ありがとう! –
これは多くの副作用です...核弾頭を起動する:) – Marc
ありがとう!私は私の(長く消えた)髪の毛を "for"で引っ張ってきたので、私の核弾頭は決して私のアイテムのリストには射しませんでした。 "doseq"は確かにしました。 –