2012-04-05 2 views
11

clojure에는 일반적인 lisp와 같은 강력한 '루프'가 있습니까? 예를 들어매번 시퀀스에서 두 개의 요소를 가져옵니다.

:

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

방법 Clojure의에서이 작업을 수행하려면 :

이 시퀀스에서 두 요소마다

커먼 리스프를 얻을?

+1

클로저에 CL을 구현할 수 있습니다 ... –

+0

"강력한"을 정의하십시오. –

답변

13

:

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

'for'는 루프 구조가 아니고 목록 이해력이 있으므로 결과가 지연 될 수 있습니다. 또한 Common LISP와는 달리 매우 잘 수행하기가 어렵습니다. –

+0

@Marko - 구체적인 예가 있습니까? – sw1nn

+0

이해가 안되나요? 정확히 어떤 것의 예를 들어요? –

3

루프를 닮은 명령어 인 cl-loop있다, 모두 커먼 리스프에 대한 iterate looping construct을 기반으로하는, 또한 및 clj-iterate있다. for을 활용하고 일부 당신이 당신의 구체적인 예를 달성 할 수 destructuring으로

2

Clojure에서의 다목적 루프 구조는 for입니다. CL의 loop (특히 Clojure가 기능적 순도를 권장하므로 부작용이 아닌)과 같은 많은 기능을 가지고 있지 않으므로 loop으로 간단히 수행 할 수있는 많은 작업이 "around"for으로 완료됩니다. 예를 들어 for에 의해 생성 된 요소를 합치려면 apply +을 앞에 놓습니다. 두 요소를 쌍으로 호출하려면 for에 입력 시퀀스에 partition 2을 사용합니다 (sw1nn이 표시하는 것처럼).

1

나는 loop, recur 및 destructuring으로이 작업을 수행합니다.

=> [[1 2] [3 4] [5 6]]

ab 중 제 1 및 제 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])))) 

이 결과로 끝나는 : I 함께 매 2 개 값 기 원한다면 예

, 각각 시퀀스, 그리고 나서 rest은 남은 것입니다. rest에 아무것도 남지 않을 때까지 우리는 반복적으로 반복적으로 돌아갈 수 있습니다.

관련 문제