...変更可能なデータを使用する命令型プログラミングは、私の脳に深く入り込みすぎているのかもしれませんが、Clojure でデータのベクトルを構築するためのコードは、冗長で扱いにくく、複雑であることがわかります。もっと良い方法があるはずです!
Ruby では、次のようなコードを記述できます。
results = []
a_collection.each do |x|
x.nested_collection.each do |y|
next if some_condition_holds
results << y
end
end
Clojure では、おそらく次の (恐ろしい) コードのように、再帰関数を使用するよりも良い方法を知りません。
; NEWBIE ALERT! NEWBIE ALERT!
(loop [results []
remaining a_collection]
(if (empty? remaining)
results
(recur
(loop [results results
nested (nested_collection (first remaining))]
(if (empty? nested)
results
(if (some_condition_holds)
(recur results (rest nested))
(recur (conj results (first nested)) (rest nested)))))
(rest remaining))))
変更可能なデータと反復ループがなければ、再帰を使用してコレクションを構築する必要があります。このような再帰関数にはそれぞれ(empty?)
ガード句などが必要です。全体が非常に反復的で、叫びたくなるほどです。
単純なケースでmap
は十分ですが、複数レベルのネストがあり、各レベルで反復をスキップする必要がある条件がある場合を考えています。
Common Lisp では、loop
マクロまたはmapcan
. Clojure には のようなものはありませんmapcan
か?