Gibt es eine Funktion in clojure, die prüft, ob Daten einen faulen Teil enthalten?Sehen Sie, ob ein Teil der Daten in clojure faul ist
Hintergrund:
Ich bin ein kleiner Server in clojure Gebäude. Jede Verbindung hat einen Status, einen Eingangsstrom und einen Ausgangsstrom.
Der Server liest ein Byte aus einem Eingangsstrom und ruft basierend auf dem Wert eine von mehreren Funktionen auf (mit dem Status und dem Eingangs- und Ausgangsstrom) als Parameter). Die Funktionen können entscheiden, mehr aus dem Eingabestream zu lesen, eine Antwort auf den Ausgabestream zu schreiben und einen Status zurückzugeben. Dieser Teil wird wiederholt.
Dies funktioniert alles gut, solange der Zustand keine faulen Teile enthält. Wenn es im Zustand einen etwas trägen Teil gibt, kann es, wenn es (später während einer anderen Funktion) ausgewertet wird, beginnen, aus dem Eingangsstrom zu lesen und in den Ausgangsstrom zu schreiben.
Also im Grunde möchte ich eine Post-Bedingung für alle diese Funktionen hinzufügen, die besagt, dass kein Teil des zurückgegebenen Zustand möglicherweise faul sein. Gibt es eine Funktion, die nach Lazy-Sequenzen sucht? Ich denke, es wäre leicht zu überprüfen, ob der Zustand selbst eine träge Sequenz ist, aber ich möchte zum Beispiel prüfen, ob der Zustand einen Vektor hat, der eine Hash-Map enthält, deren Werte faul sind.
Doall funktioniert nicht rekursiv leider: '(count (doall [1 2 3 4 (Bereich)])) wird 5, und nicht Stack/Heapoverflow. – Claude
Ah, und im zweiten Teil: Wrapping der Eingangsstrom in einer Lazy-Sequenz ist etwas, was ich dachte, und funktioniert (obwohl Sie Sachen wie Java DataInputStream verlieren).Mit dem Outputstream funktioniert das allerdings nicht, das ist der eine Ort, an dem man eigentlich den Nebeneffekt braucht. – Claude
(count (map doall (filter seq? [1 2 3 4 (Bereich)]))) –