2009-06-30 8 views
1

Ich habe eine Funktion, die liest ein Token aus einem Eingabestream, der aufgerufen wird (get-next-Indikator Strom Indikator) und gibt es zurück. Ich versuche es zu benutzen, um eine Karte zu erstellen.Clojure Funktion Lesen von Stream-Sperren

Aber wenn ich es laufe, stürzt es ab. Wenn ich eine der Get-Next-Indikator-Funktion entferne, funktioniert es. Versuchen beide Funktionen den Stream gleichzeitig zu lesen ist dies der Fall. Was verursacht das?


(defn decode-map [ stream ] 
    (loop [result {}] 
    (let [c (char (.read stream))] 
     (if (= c \e) 
     result 
     (recur (assoc result (get-next-indicator stream (int c)) 
          (get-next-indicator stream (int c)))))))) 
+0

Was meinst du mit "verstopft"? Gibt es eine Fehlermeldung? – Svante

+0

keine Fehlermeldung repl loop just sperrt noting wird gedruckt. Wenn ich den zweiten Aufruf von get-next-indicator durch say "e" ersetze, erzeugt es die Map wie erwartet, aber wenn es wie mein Snippet aufgerufen wird. nichts passiert. Kein Fehler, keine Ausnahme. –

+0

Hat Get-Next-Indikator irgendwelche Nebenwirkungen? Posten Sie den Code auch dafür. – Kai

Antwort

1

Nur eine Vermutung, aber Get-Next-Indikator blockieren, wenn es nichts auf dem Strom zu bekommen ist? Du rufst es zweimal hintereinander vor dem Rezidiv auf (und tust danach eine .read, um das Ende zu erkennen). Wenn der Stream während eines der Get-Next-Indicator-Aufrufe keine Bytes mehr hatte, blieb die Funktion hängen und wartete auf genügend Bytes im Stream, um diese Aufrufe zu beenden.