12

clojureには一般的なlispのような強力な「ループ」がありますか?

例えば:

毎回シーケンスから2つの要素を取得します

Common Lisp:

(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))

Clojureでこれを行う方法は?

4

4 に答える 4

14

レバレッジforといくつかの破壊によって、あなたはあなたの特定の例を達成することができます:

(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b))
于 2012-04-05T15:25:50.113 に答える
3

LOOPに似たcl-loopがあり、 clj-iterclj-iterateもあります。これらは両方とも、CommonLispの反復ループ構造に基づいています。

于 2012-04-05T14:31:58.427 に答える
2

Clojureの多目的ループ構造はforです。loopCLに組み込まれている機能ほど多くの機能はありません(Clojureは機能の純粋さを促進するため、特に副作用はありません)。そのため、Clojureを使用するだけで実行できる多くの操作は、 loop「周り」で実行されforます。たとえば、によって生成された要素を合計するには、その前にをfor置きます。apply +要素をペアで歩くには、(sw1nnが示すように)partition 2に入力された入力シーケンスで使用しforます。

于 2012-04-05T18:43:16.293 に答える
1

私はこれをlooprecurそして破壊することで行います。

たとえば、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]]

abはそれぞれシーケンスの最初と2番目の要素であり、次にrest残っているものです。その後、何も残っていない状態になるまで繰り返し回ることrestができます。

于 2016-02-06T00:53:43.403 に答える