2010-04-30 7 views
1

저는 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를 배우기위한 나의 작은 취미 프로젝트이며, 지금까지 버그 (이것은 단지 하나의 버그입니다 :)입니다. 그래서 아직 너무 많은 사람들에게 이야기하고 싶지는 않습니다. :)

+1

"(...) 스택 추적에서 앨범 별 기능으로 보이지만 그 기능은 게시 한 스택 추적의 일부분에 포함되지 않습니다. 더 많은 오류 출력이 있었습니까? 또한 정렬 트랙 및 트랙 별 앨범이 표시되는지 여부를 표시 할 수 있습니까? (또는 모두를 게시하기에 너무 많은 경우 관련성이 가장 높은 항목을 선택할 수도 있습니다.) –

+0

게시물을 더 많은 코드로 업데이트했습니다. 또한 스택 추적은 제가 게시 한 스 니펫처럼 계속됩니다. 슬프게도 더 이상 흥미로운 정보가 없습니다 ;-) –

+0

트랙에 2300 개 요소 (이름, 파일 이름 등의 항목이있는 구조체) 목록에 대한 참조가 추가되어 있습니다. –

답변

1

나는 clojure 메일 링리스트. 그리고 그 대답은 필터가 게으른 seq를 리턴하고, 그것들을 연결하면 어느 시점에서 스택 오버 플로우로 끝날 것입니다. 하나는 doall을 사용하여 시퀀스의 생성을 강제 할 수 있습니다.

관련 문제