Warum kann rseq
nicht das Ergebnis eines vorherigen Aufrufs von rseq
akzeptieren?
Ich habe im Docstring gelesen, dass das Argument (eigentlich "kann" sein) ein Vektor oder eine sortierte Karte sein muss, und das obige zeigt, dass es kein RSeq
sein kann, also weiß ich das schon. Was ich wissen möchte: Gibt es einen guten Grund für diese Einschränkung? Ist es nur ein Versehen, oder bietet diese Einschränkung einen wichtigen Vorteil?
Gibt es dafür auch einen praktischen Workaround, außer niemals rseq
aufzurufen? Es ist schwer zu wissen, wenn Sie RSeq
von einer Funktion zurückgeben, ob eine andere Funktion woanders rseq
aufrufen könnte.
Ich frage, weil es frustrierend ist zu sehen, dass mein Code Ausnahmen aus diesem überraschenden Grund wirft s . Wenn ich wüsste, warum dies sinnvoll ist, würde ich diese und ähnliche Fehler wahrscheinlich weniger machen.
Sie können rseq
nicht auf einem Seq aufrufen, da Sie eine Input-Collection mit konstantem Direktzugriff auf Fullfill rseq
Konstant-Zeit-Performance-Merkmale benötigen und Seqs nur einen effizienten Zugriff (Iteration) vom Kopf aus ermöglichen runter.
Das Aufrufen von rseq
für das Ergebnis von rseq
kann nicht speziell für die Rückgabe der ursprünglichen Sammlung ausgeführt werden, da die ursprüngliche Auflistung nie eine seq ist. Und wenn rseq
auf einem RSeq aufgerufen wird, würde etwas (seq coll)
zurückgegeben werden, was es nicht einfach macht, (rseq (drop x (rseq coll)))
zu unterstützen. Es ist wahrscheinlich diese Art von Komplikationen, die die Sprachimplementierer davon abhalten, überhaupt "rekursives" rseq zu unterstützen.
Wenn Sie eine allgemeine Umkehrfunktion benötigen, verwenden Sie reverse
- was langsamer ist. Wenn Sie können, möchten Sie wahrscheinlich nur einen Verweis auf (seq coll)
und (rseq coll)
behalten, wenn Sie beide benötigen.
Weil rseq
nur für die speziellen reversiblen Sequenzen funktioniert. Aber das Ergebnis seiner Anwendung ist ein gewöhnlicher Seq. Sie können immer überprüfen, ob Sie rseq
eine Sequenz mit einem reversible?
Prädikat:
Warum funktioniert dieser Fallback nicht in rseq
(oder reverse
) selbst? Der Grund ist, dass rseq
die Vorhersagbarkeit der Ausführungszeit garantieren sollte, denke ich.
Wenn Sie die Sammlung später wirklich rückgängig machen müssen, behalten Sie sie besser als Vektor bei: (rseq (vec (rseq [1 2 3])))