답변:
차이점은 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
하고 모든 인쇄가 완료됩니다.