질문에 대해 자세히 설명해주세요. println
은 기본값으로 표준 출력에 바인드 된 *out*
스트림에서만 부작용이 있습니다.
map
과 같은 기능에서 인쇄 및 일부 값을 반환 할 수 있습니다 (예 : map
).
user> (defn print-and-inc [n]
(do
(println "called with n= " n)
(inc n)))
#'user/print-and-inc
do
시퀀스의 각 식을 실행하고,이 경우에, 마지막의 (inc n)
를 결과를 반환한다. 당신은 vector
user> (def foo (map print-and-inc [1 2 3 4 5]))
#'user/foo
user>
user> foo
called with n= 1
called with n= 2
called with n= 3
called with n= 4
called with n= 5
(2 3 4 5 6)
user>
user> foo
(2 3 4 5 6)
int
의 이상 print-and-inc
의 매핑으로 지금 foo
정의하고 인쇄 foo
가 호출 처음에만 발생하기 때문에 당신이 map
의 lazyness를 참조하십시오. 그러나 이제 foo
은 초기 컬렉션의 증가 된 값인 결과를 보유합니다.
참고 :이 코드로/추적 정보를 정기적으로 로그인하는 데 사용할 수 있지만 다른 사람에 의해 지적 된 내용뿐만 아니라, REPL 내 게으름을 실험하는 것은주의 tools.logging
따라서 (map println [1 2 3]) 결과는 첫 번째 실행 후에 캐시됩니다. 캐시 된 결과는 시퀀스 자체가 아니지만 seqal 개체입니다. 내 이해가 맞습니까? –
결과는 시퀀스'[1 2 3]'의 모든 요소에'println'을 적용한 결과를 포함하는'seqable '입니다. 하지만'println'은'nil'을 리턴하므로'map'에 의해 반환 된'seqable'은'(nil nil nil)'입니다. –