2012-04-05 6 views
11

clojureには共通のlispのような強力な 'ループ'がありますか?例えば毎回シーケンスから2つの要素を取得する

:Clojureの中でこれを行う方法を

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

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

+1

CLを実装することができます。 –

+0

"強力"を定義してください。 –

答えて

13

forといくつかの非構造を活用することで、あなたの具体的な例を達成することができます

(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b)) 
+0

'for'はループ構造ではなく、リスト内包であり、結果の遅延のseqを生成します。また、Common LISPとは対照的に、これを非常にうまく実行することは難しいです。 –

+0

@Marko - 具体的な例がありますか? – sw1nn

+0

分かりません - 正確な例は? –

2

のClojureの多目的ループ構造はforです。それはCLのloop(特にClojureは機能的な純度を助長するので、副作用はありません)と同じくらい多くの機能を持っていませんので、で簡単にできる操作はforです。たとえば、forによって生成された要素を合計するには、apply +をその前に置きます。 (sw1nnが示すように)forに入力された入力シーケンスにpartition 2を使用します。

1

私はlooprecurでこれを行い、破壊します。

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]]

abは、第一及び第二の要素でありますシーケンスは、それぞれrestは残っているものです。 restに何も残らないうちに繰り返して回ってしまい、やり遂げられます。

関連する問題