문제

나는 다음에 Clojure,이 있을 것으로 예상하고 클래스의 비지연 순서 반:

(.getClass (doall (take 3 (repeatedly rand))))

그러나,이것은 여전히 반환 clojure.lang.LazySeq.내 생각에는 doall 지 평가하는 전체 시퀀스,하지만 반환합니다 원래 순서로 그것은 여전히 유용한 메모이 제이션.

그래서 무엇입 관용을 만드는 수단이 금연 시퀀스에서 게으른 하나는?

도움이 되었습니까?

해결책

위해서는 doall 당신이 필요로하는 모든 것입니다.단지 때문에 서열은 유형 LazySeq 의미하지 않은 보류 중인 평가입니다.Lazy 리스트는 시퀀스입 캐시 그들의 결과,그래서 당신이해야 할 모든 것을 걸으 seq 면(으로 위해서는 doall 않)하기 위해서 힘든고,따라서 그것을 렌더링 비니다.seq 가 힘이 전체 컬렉션을 평가합니다.

다른 팁

이것은 어느 정도 질문의 분류. 게으른 순서는 단지 하나의 유형 순서 으로 목록은,벡터 또는 지도입니다.그래서 대답은 물론이"그것은 유형에 따라 달라집의 비 게으른 순서 당신을 얻을:
을 선택:

  • 전 lazy(완전 평가)게으른 순서 (doall ... )
  • 목록을 순차적으로 액세스 (apply list (my-lazy-seq)) OR (into () ...)
  • 벡터한 이후 랜덤 액세스 (vec (my-lazy-seq))
  • 지도나 설정이 있는 경우 몇 가지 특별한 목적입니다.

할 수 있는 어떤 유형의 시퀀스는 대부분의 스위트의 필요합니다.

이 풍부한 사람이 모르는 것 같은 그의 clojure 고가 절대적으로 오른쪽.
Buth 이 코드 조각을 사용하여를 들면,유용한 보완하는 이 질문:

=> (realized? (take 3 (repeatedly rand))) 
false
=> (realized? (doall (take 3 (repeatedly rand)))) 
true

실로 유형 변경되지 않았지만 실현

나는 비틀거에 이 이 블로그 게시물에 대 doall 되지 않을 재귀적입니다.는 내가 발견한 첫 번째 코멘트에 게시했습니다.의 라인을 따라 뭔가:

(use 'closure.walk)
(postwalk identity nested-lazy-thing)

이에 유용한 단위 테스트하고 싶력 평가의 일부는 중첩의 응용 프로그램 map 을 강제로는 오류 상태입니다.

(.getClass (into '() (take 3 (repeatedly rand))))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top