[clojure] Clojure에서 doseq와 for의 차이점

Clojure에서 doseq와 for의 차이점은 무엇입니까? 다른 것을 사용하기로 선택한 경우의 몇 가지 예는 무엇입니까?



답변

차이점은 for지연 시퀀스를 만들고 반환하는 동안 doseq부작용을 실행하고 nil을 반환한다는 것 입니다.

user=> (for [x [1 2 3]] (+ x 5))
(6 7 8)
user=> (doseq [x [1 2 3]] (+ x 5))
nil
user=> (doseq [x [1 2 3]] (println x))
1
2
3
nil

다른 시퀀스를 기반으로 새 시퀀스를 작성하려면 for를 사용하십시오. 일부 시퀀스의 요소를 기반으로 부작용 (인쇄, 데이터베이스에 쓰기, 핵탄두 발사 등)을 수행하려면 doseq를 사용하십시오.


답변

또한 게 으르 doseq면서 열망 for합니다. Rayne의 답변에 누락 된 예는 다음과 같습니다.

(for [x [1 2 3]] (println x))

REPL에서 이것은 일반적으로 원하는 것을 수행하지만 기본적으로 우연 for입니다. 비대화 형 환경에서는 아무것도 인쇄되지 않습니다. 결과를 비교하여 실제로 확인할 수 있습니다.

user> (def lazy (for [x [1 2 3]] (println 'lazy x)))
#'user/lazy

user> (def eager (doseq [x [1 2 3]] (println 'eager x)))
eager 1
eager 2
eager 3
#'user/eager

def양식은 생성 된 새 var를 반환하고 여기에 바인딩 된 값을 반환 하기 때문에 REPL이 인쇄 lazy할 항목이 없으며 실현되지 않은 lazy-seq를 참조합니다. 요소가 전혀 계산되지 않았습니다. eager을 참조 nil하고 모든 인쇄가 완료됩니다.


답변