Ich wollte einen Clojure-Vektor in einem Atom, um einen statusbehafteten FIFO zu modellieren (Push bis zum Ende, Pop von Anfang an).Clojure Atome konvertieren Vektoren in Listen?
versucht(def stack (atom []))
dann push
wie folgt:
(swap! stack #(conj % 1))
(swap! stack #(conj % 2))
[1 2]
erwarten aber
(2 1)
Keine große Sache bekommen, es bedeutet nur, dass ich umkehren müssen (O (n)) der Wert von das Atom (persistente Liste), um die Elemente in der Reihenfolge zu erhalten, als ich sie geschoben habe (z. B. einen Strom von imperativen Befehlen an eine virtuelle Maschine der Reihe nach). Trotzdem war es eine Überraschung.
Gibt es einen clojure.core FIFO, den ich in ein Atom packen kann? Ich dachte an priority-map
, aber es scheint übertrieben. Die Beispiele für swap!
auf clojuredocs.org verwenden Listen oder Karten, nicht ganz was ich wollte. Ich habe viele Beispiele gefunden, indem ich "FIFO Clojure" gegoogelt habe, aber einige sind ein bisschen reich, z. B. clojure.core.cache (kartenartig und nicht vektorartig); Ringpuffer von amalloy (externe Abhängigkeit). Auf der Suche nach etwas wirklich Kleinem und Einfachem. Ich habe in den automatischen Vorschlägen von StackOverflow keine Antwort gefunden.
Sie haben Recht. Untersuchung. –
Der Kontext war eine Reihe von wiederholten Tests von Pushing und Popping. Sieht so aus, als wenn ich das letzte Element von einem Vektorstapel lösche, bleibt dem Atom eine leere Liste und kein leerer Vektor übrig. Nachfolgende Pushs conj auf die Liste und nicht ein Vektor. Die Behebung ist einfach in meiner Pop-Funktion --- zurück in einen leeren Vektor, wenn der letzte Pop den Stapel leert. –
Nein, '(pop [1])' ist '[]'. Das ist nicht dein Problem. Wenn Sie "Rest" oder "Seq" nennen, könnte das eine Liste ergeben. – amalloy