Eine Art funktionale Programmier-Neuling-Frage hier:
Ich habe die Transkripte einiger von Rich Hickeys Vorträgen gelesen, und in einigen seiner bekannteren empfiehlt er, Warteschlangen als Alternative zum gegenseitigen Aufruf von Funktionen zu verwenden. (ZB in Design, Komposition und Leistung und in Simple Made Easy .)
Ich verstehe das in vielerlei Hinsicht nicht ganz:
Spricht er davon, Daten in eine Warteschlange zu stellen und sie dann von jeder Funktion verwenden zu lassen? Anstelle von Funktion A, die Funktion B aufruft, um ihre eigene Berechnung durchzuführen, muss Funktion B ihre Ausgabe in eine Warteschlange stellen und dann Funktion A darauf zugreifen lassen. Oder sprechen wir alternativ davon, Funktionen in eine Warteschlange zu stellen und sie dann sukzessive auf Daten anzuwenden (sicherlich nicht, da dies eine massive Mutation beinhalten würde, oder? Und auch die Multiplikation von Warteschlangen für Funktionen mit mehreren Aritäten oder wie Bäume oder ähnliches? )
Wie macht das die Sache einfacher? Meine Intuition wäre, dass diese Strategie mehr Komplexität schaffen würde, weil die Warteschlange eine Art Zustand wäre, und dann müssen Sie sich Sorgen machen, "was ist, wenn sich eine andere Funktion einschleicht und einige Daten in die Warteschlange stellt?"
Eine Antwort auf eine Implementierungsfrage zu SO legt nahe, dass die Idee eine Reihe verschiedener Warteschlangen erstellt. Jede Funktion stellt ihre Ausgabe in eine eigene Warteschlange (??). Das verwirrt mich aber auch, denn wenn Sie eine Funktion einmal ausführen, warum braucht sie dann eine Warteschlange für ihre Ausgabe, wenn Sie diese Ausgabe einfach nehmen und einen Namen als (var, atom, entry in a big) darauf setzen könnten Hash-Tabelle, was auch immer). Wenn eine Funktion dagegen mehrmals ausgeführt wird und Sie ihre Ausgabe in eine Warteschlange stellen, haben Sie sich selbst wieder den Status zugefügt, und Sie müssen sich Gedanken über die Reihenfolge machen, in der alles aufgerufen wird. Downstream-Funktionen werden weniger rein. usw.
Offensichtlich verstehe ich den Punkt hier nicht. Kann jemand etwas erklären?
Job
Objekt, verschieben ihn in eine Warteschlange und lassen einen oder mehrere Arbeitsthreads an dieser Warteschlange arbeiten. Der Job
schickt dann Job
nach Abschluss weitere s in die Warteschlange. Rückgabewerte werden in diesem Konzept durch Rückrufe ersetzt. Es ist ein Albtraum, Fehler zu beheben und zu überprüfen, da Ihnen ein Aufrufstapel fehlt, und aus demselben Grund effizient und flexibel.