rationale

___ qstntxt ___
%Vor%

Warum kann %code% nicht das Ergebnis eines vorherigen Aufrufs von %code% 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 %code% 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 %code% aufzurufen? Es ist schwer zu wissen, wenn Sie %code% von einer Funktion zurückgeben, ob eine andere Funktion woanders %code% 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.

    
___ tag123clojure ___ Clojure ist ein moderner Lisp-Dialekt für die Java Virtual Machine (mit Versionen für CLR und JavaScript). Mehr als nur eine Implementierung von Lisp in Java, bietet Clojure Zugriff auf Klassen und Ökosysteme von Java. ___ qstnhdr ___ Warum kannst du keinen RSeq bekommen? ___ answer37432118 ___

Sie können %code% nicht auf einem Seq aufrufen, da Sie eine Input-Collection mit konstantem Direktzugriff auf Fullfill %code% Konstant-Zeit-Performance-Merkmale benötigen und Seqs nur einen effizienten Zugriff (Iteration) vom Kopf aus ermöglichen runter.

Das Aufrufen von %code% für das Ergebnis von %code% 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 %code% auf einem RSeq aufgerufen wird, würde etwas %code% zurückgegeben werden, was es nicht einfach macht, %code% 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 %code% - was langsamer ist. Wenn Sie können, möchten Sie wahrscheinlich nur einen Verweis auf %code% und %code% behalten, wenn Sie beide benötigen.

    
___ tag123rational ___ hilf uns, dieses Wiki zu bearbeiten ___ tag123sequenz ___ Eine Sequenz ist eine geordnete Liste von Objekten (oder Ereignissen). Wie eine Menge enthält sie Elemente (auch Elemente oder Terme genannt) und die Anzahl der Terme (möglicherweise unendlich) wird als Länge der Sequenz bezeichnet. Im Gegensatz zu einer Menge ist die Reihenfolge wichtig, und genau dieselben Elemente können mehrmals an verschiedenen Positionen in der Sequenz erscheinen. In einer relationalen Datenbank ist eine Sequenz ein Objekt, das zum Generieren eindeutiger Zahlen für einen Primärschlüssel verwendet wird. ___ answer37432449 ___

Weil %code% 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 %code% eine Sequenz mit einem %code% Prädikat:

haben können %Vor%

Warum funktioniert dieser Fallback nicht in %code% (oder %code% ) selbst? Der Grund ist, dass %code% 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: %code%

    
___ tag123reverse ___ Ordnen Sie die Reihenfolge einer Sequenz so an, dass die endgültige Reihenfolge ein Spiegelbild des Originals ist. ___
2
Antworten

Warum kannst du keinen RSeq bekommen?

%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...
25.05.2016, 08:10