저는 clojure로 놀아 왔고 간단한 작은 오디오 플레이어를 만드는 데 사용 해왔습니다. 나는 항상 작동 직후 다시 할 경우compojure 웹 프로젝트에서 스택 오버플로 예외가 발생했습니다.
2010-04-20 15:33:20.963::WARN: Error for /control
java.lang.StackOverflowError
at clojure.lang.RT.seq(RT.java:440)
at clojure.core$seq__4245.invoke(core.clj:105)
at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:440)
at clojure.core$seq__4245.invoke(core.clj:105)
at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:440)
at clojure.core$seq__4245.invoke(core.clj:105)
at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:440)
at clojure.core$seq__4245.invoke(core.clj:105)
at clojure.core$filter__5084$fn__5086.invoke(core.clj:1794)
at clojure.lang.LazySeq.sval(LazySeq.java:42)
at clojure.lang.LazySeq.seq(LazySeq.java:56)
at clojure.lang.RT.seq(RT.java:440)
...
: 이상한 것은 서버에 연결할 때 때로는 이십 중 어쩌면, 나는 다음과 같은 오류를 얻을 것입니다. 그래서 타이밍이나 뭔가와 관련이있는 것 같습니다. 문제의 코드는 다음과 같습니다
(defn add-track [t]
(common/ref-add tracks t))
(defn add-collection [coll]
(doseq [track coll] (add-track track)))
및 콜이 함수에서 추출
(defn ref-add [ref value]
(dosync (ref-set ref (conj @ref value))))
:
(defn tracks-by-album [album]
(sort sort-tracks (filter #(= (:album %) album) @tracks)))
사용
(defn get-album-from-track [track]
(seq/find-first #(= (:album track) (:name %)) @albums))
(defn sort-tracks [track1 track2]
(cond (= (:album track1) (:album track2))
(cond (and (:album-track track1) (:album-track track2))
(< (:album-track track1) (:album-track track2))
:else 0)
:else
(> (:year (get-album-from-track track1)) (:year (get-album-from-track track2)))))
이 더 호출되는 또는 요청에서 직접적으로 덜 나는 안으로 들어간다 :
(when-handle-command cmd params (audio/tracks-by-album decoded-name))
(defn when-handle-command [cmd params data]
(println (str "handling command:" cmd))
....)
나는 로그에서 취급 명령을 얻지 않는다. 그래서 그것은 트랙 - 바이 - 앨범을 할 때 죽어 야한다.
그래서 스택 추적에서 앨범 별 트랙 기능인 것처럼 보입니다. 나는 때때로 그것이 때때로 효과가 있고 때때로 그렇지 않은 이유를 안다. 나는 그것이 트랙에서 볼 수 있듯이 필터 기능을하는 유일한 기능이기 때문에 트랙별로 앨범이라고 말합니다.
모든 소스 코드는 http://code.google.com/p/mucomp/에서 사용할 수 있습니다. 그것은 clojure를 배우기위한 나의 작은 취미 프로젝트이며, 지금까지 버그 (이것은 단지 하나의 버그입니다 :)입니다. 그래서 아직 너무 많은 사람들에게 이야기하고 싶지는 않습니다. :)
"(...) 스택 추적에서 앨범 별 기능으로 보이지만 그 기능은 게시 한 스택 추적의 일부분에 포함되지 않습니다. 더 많은 오류 출력이 있었습니까? 또한 정렬 트랙 및 트랙 별 앨범이 표시되는지 여부를 표시 할 수 있습니까? (또는 모두를 게시하기에 너무 많은 경우 관련성이 가장 높은 항목을 선택할 수도 있습니다.) –
게시물을 더 많은 코드로 업데이트했습니다. 또한 스택 추적은 제가 게시 한 스 니펫처럼 계속됩니다. 슬프게도 더 이상 흥미로운 정보가 없습니다 ;-) –
트랙에 2300 개 요소 (이름, 파일 이름 등의 항목이있는 구조체) 목록에 대한 참조가 추가되어 있습니다. –