Warum kannst du keinen RSeq bekommen?

8
%Vor%

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.

    
Ben Kovitz 25.05.2016, 08:10
quelle

2 Antworten

4

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.

    
Joost Diepenmaat 25.05.2016, 08:50
quelle
3

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:

haben können %Vor%

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])))

    
leetwinski 25.05.2016 09:06
quelle