Könnte core.async seine Funktionen in Bezug auf Sequenzen implementiert haben?

8

Rich Hickey's Strange Loop-Wandler-Präsentation sagt uns, dass es zwei Implementierungen von map gibt in Clojure 1.6, eine für Sequenzen in clojure.core und eine für Kanäle in core.async .

Nun wissen wir, dass wir in 1.7 Transducer haben, für die eine foldr ( reduce ) Funktion von Funktionen höherer Ordnung wie map und filter zurückgegeben wird, wenn eine Funktion, aber keine Sammlung gegeben wird.

Was ich versuche zu artikulieren und zu scheitern, ist der Grund, warum core.async functions keine Sequenz zurückgeben können oder Seq -like sind. Ich habe das Gefühl, dass die "Schnittstellen" (Protokolle) unterschiedlich sind, aber ich kann nicht sehen, wie.

Sicher, wenn Sie das erste Objekt von einem Kanal nehmen, dann können Sie dies so darstellen, als ob Sie das erste Objekt von einer Sequenz entfernen würden?

Meine Frage ist: Könnte core.async seine Funktionen in Bezug auf Sequenzen implementiert haben?

    
hawkeye 30.10.2014, 12:23
quelle

1 Antwort

8

Ja, in gewissem Sinne hätten sie auch sein können. Wenn du Blöcke ignorierst (für den Moment lass es uns tun), dann ist wirklich nichts falsch mit etwas wie dem folgenden:

%Vor%

Beachten Sie aber hier den <!! Aufruf. Dies wird "Take-Blocking" genannt: Innerhalb dieser Funktion gibt es einige Versprechen und Sperren, die dazu führen, dass der aktuell ausführende Thread anhält, bis ein Wert auf dem Kanal verfügbar ist. Das würde also gut funktionieren, wenn es Ihnen nichts ausmacht, einen Java-Thread zu haben, der nichts tut.

Die Idee hinter go blocks besteht darin, logische Prozesse viel billiger zu machen; Um dies zu erreichen, überschreibt der go-Block den Blockkörper in eine Reihe von Callbacks, die an den Kanal angehängt sind, so dass intern ein Aufruf von <! in einem go-Block in etwa so aussieht (take! c k) wo k ist ein Callback zum Rest des Go-Blocks.

Wenn wir jetzt echte Fortsetzungen haben oder wenn die JVM leichte Threads unterstützt, dann könnten wir Go-Blöcke und Blockade-Takes kombinieren. Dies beinhaltet jedoch entweder tiefgreifendes Bytecode-Umschreiben (wie das Pulsar / Quasar-Projekt) oder eine nicht standardisierte JVM-Funktion. Diese beiden Optionen wurden bei der Erstellung von core.async zugunsten der viel einfacheren Implementierung (und hoffentlich viel einfacher zu begründen) der lokalen Go-Block-Transformation ausgeschlossen.

    
Timothy Baldridge 30.10.2014, 15:21
quelle