clojureには共通のlispのような強力な 'ループ'がありますか?例えば毎回シーケンスから2つの要素を取得する
:Clojureの中でこれを行う方法を
(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))
:
は
Common Lispのシーケンスから毎回2つの要素を取得しますか?
clojureには共通のlispのような強力な 'ループ'がありますか?例えば毎回シーケンスから2つの要素を取得する
:Clojureの中でこれを行う方法を
(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))
:
は
Common Lispのシーケンスから毎回2つの要素を取得しますか?
for
といくつかの非構造を活用することで、あなたの具体的な例を達成することができます
(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b))
'for'はループ構造ではなく、リスト内包であり、結果の遅延のseqを生成します。また、Common LISPとは対照的に、これを非常にうまく実行することは難しいです。 –
@Marko - 具体的な例がありますか? – sw1nn
分かりません - 正確な例は? –
LOOPのworkalikeである、cl-loopあり、そして両方のCommon Lispのためのiterate looping constructに基づいている、またとclj-iterateがあります。
のClojureの多目的ループ構造はfor
です。それはCLのloop
(特にClojureは機能的な純度を助長するので、副作用はありません)と同じくらい多くの機能を持っていませんので、で簡単にできる操作はfor
です。たとえば、for
によって生成された要素を合計するには、apply +
をその前に置きます。 (sw1nnが示すように)for
に入力された入力シーケンスにpartition 2
を使用します。
私はloop
とrecur
でこれを行い、破壊します。
Iがグループしたい場合、例えば、各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
は、第一及び第二の要素でありますシーケンスは、それぞれrest
は残っているものです。 rest
に何も残らないうちに繰り返して回ってしまい、やり遂げられます。
CLを実装することができます。 –
"強力"を定義してください。 –