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です。loopCLに組み込まれている機能ほど多くの機能はありません(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ができます。