range
함수로 생성 된 지연 시퀀스를 "생성하고 버리는"이유가 확실하지 않습니다. dotimes
에 의해 수행되는 제한적인 반복은 인라인 증분이고 각 단계와 비교하는 것이 더 효율적이지만, 거기에서 직접 목록 연결을 표현하기 위해 추가 비용을 지불 할 수 있습니다.
일반적인 Lisp 솔루션은 이동하면서 작성한 목록에 새 요소를 추가 한 다음 해당 작성된 목록을 파괴적으로 반전하여 반환 값을 산출합니다. 일정 시간에리스트에 추가 할 수있는 다른 기술은 잘 알려져 있지만, 항상 prepend-then-reverse 접근보다 더 효율적이라는 것은 아닙니다.
작동하는 것 같다
(let [r (transient [])]
(dotimes [i 10]
(conj! r (* i i))) ;; destructive
(persistent! r))
하지만 the documentation on transients 하나는 "conj!
에 사용하지 말아야한다고 경고 :
Clojure에, 당신은 conj!
기능의 파괴적인 행동에 의존, 거기에 도착하는 과도을 사용할 수 있습니다 bash 값은 "—입니다. 즉, 반환 값을 포착하는 대신 파괴적인 동작을 고려해야합니다. 그러므로 그 형식을 다시 작성해야합니다.
위의 r
을 다시 호출하여 conj!
을 호출 할 때마다 얻게되는 새 값을 다시 지정하려면 atom을 사용하여 더 많은 간접 참조를 도입해야합니다.그 시점에서, 우리는 단지 dotimes
과 싸우고 있으며, loop
과 recur
을 사용하여 자신의 양식을 작성하는 것이 좋습니다.
반복 할당 된 것과 동일한 크기로 벡터를 미리 할당 할 수 있으면 좋을 것입니다. 그렇게 할 방법이 보이지 않습니다.
출처
2010-12-27 16:25:59
seh
이 질문에 대한 최신 내용은 무엇입니까? clj-iterate가 최상의 솔루션입니까 아니면 더 좋은 대안이 있습니까? – jcheat