clojureには一般的なlispのような強力な「ループ」がありますか?
例えば:
毎回シーケンスから2つの要素を取得します
Common Lisp:
(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))
Clojureでこれを行う方法は?
clojureには一般的なlispのような強力な「ループ」がありますか?
例えば:
毎回シーケンスから2つの要素を取得します
Common Lisp:
(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))
Clojureでこれを行う方法は?
レバレッジfor
といくつかの破壊によって、あなたはあなたの特定の例を達成することができます:
(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b))
LOOPに似たcl-loopがあり、 clj-iterとclj-iterateもあります。これらは両方とも、CommonLispの反復ループ構造に基づいています。
Clojureの多目的ループ構造はfor
です。loop
CLに組み込まれている機能ほど多くの機能はありません(Clojureは機能の純粋さを促進するため、特に副作用はありません)。そのため、Clojureを使用するだけで実行できる多くの操作は、 loop
「周り」で実行されfor
ます。たとえば、によって生成された要素を合計するには、その前にをfor
置きます。apply +
要素をペアで歩くには、(sw1nnが示すように)partition 2
に入力された入力シーケンスで使用しfor
ます。
私はこれをloop
、recur
そして破壊することで行います。
たとえば、2つの値ごとにグループ化する場合は次のようになります。
(loop [[a b & rest] [1 2 3 4 5 6]
result []]
(if (empty? rest)
(conj result [a b])
(recur rest (conj result [a b]))))
結果は次のようになります。
=> [[1 2] [3 4] [5 6]]
a
とb
はそれぞれシーケンスの最初と2番目の要素であり、次にrest
残っているものです。その後、何も残っていない状態になるまで繰り返し回ることrest
ができます。