clojure에는 일반적인 lisp와 같은 강력한 '루프'가 있습니까? 예를 들어매번 시퀀스에서 두 개의 요소를 가져옵니다.
:
(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))
방법 Clojure의에서이 작업을 수행하려면 :
이 시퀀스에서 두 요소마다
커먼 리스프를 얻을?
clojure에는 일반적인 lisp와 같은 강력한 '루프'가 있습니까? 예를 들어매번 시퀀스에서 두 개의 요소를 가져옵니다.
:
(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b))
방법 Clojure의에서이 작업을 수행하려면 :
이 시퀀스에서 두 요소마다
커먼 리스프를 얻을?
:
(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b))
'for'는 루프 구조가 아니고 목록 이해력이 있으므로 결과가 지연 될 수 있습니다. 또한 Common LISP와는 달리 매우 잘 수행하기가 어렵습니다. –
@Marko - 구체적인 예가 있습니까? – sw1nn
이해가 안되나요? 정확히 어떤 것의 예를 들어요? –
루프를 닮은 명령어 인 cl-loop있다, 모두 커먼 리스프에 대한 iterate looping construct을 기반으로하는, 또한 및 clj-iterate있다. for
을 활용하고 일부 당신이 당신의 구체적인 예를 달성 할 수 destructuring으로
Clojure에서의 다목적 루프 구조는 for
입니다. CL의 loop
(특히 Clojure가 기능적 순도를 권장하므로 부작용이 아닌)과 같은 많은 기능을 가지고 있지 않으므로 loop
으로 간단히 수행 할 수있는 많은 작업이 "around"for
으로 완료됩니다. 예를 들어 for
에 의해 생성 된 요소를 합치려면 apply +
을 앞에 놓습니다. 두 요소를 쌍으로 호출하려면 for
에 입력 시퀀스에 partition 2
을 사용합니다 (sw1nn이 표시하는 것처럼).
나는 loop
, recur
및 destructuring으로이 작업을 수행합니다.
=> [[1 2] [3 4] [5 6]]
a
및 b
중 제 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
에 아무것도 남지 않을 때까지 우리는 반복적으로 반복적으로 돌아갈 수 있습니다.
클로저에 CL을 구현할 수 있습니다 ... –
"강력한"을 정의하십시오. –