Ist es möglich, eine destrukturierte Kopf / Schwanz-Trennung von faulen Sequenzen in clojure durchzuführen?

8

Ich sehe einige Beispiele, die zeigen, dass wir eine schöne Kopf / Schwanz-Destrukturierung einer Sequenz in clojure wie folgt erhalten können:

%Vor%

Ich gehe jedoch davon aus, dass dies für Lazy-Sequenzen nicht wie gewünscht funktionieren wird, da dies die Werte in einen Vektor stellt, der nicht faul ist. Ich habe versucht, die Vektorform in eine Listenform zu ändern, und es gab mir verbindliche Fehler, zitiert oder nicht.

Ohne Bindung wie diese scheint es, dass wenn ich eine träge Sequenz habe, in der jedes Element eine rechenintensive Gleichung des vorherigen Elements ist, müsste ich diese Berechnung zweimal durchführen, um den Kopf und den Schwanz als zu erhalten separate Aussagen, oder?

%Vor%

Gibt es einen Weg, oder mache ich irgendwo eine falsche Annahme?

    
Dax Fohl 24.05.2013, 01:18
quelle

2 Antworten

9
%Vor%

xs ist immer noch ein fauler Seq, so dass Sie die Destrukturierung ohne Probleme nutzen können. Dies wird jedoch das erste Element von xs erzwingen. (Destrukturierung verwendet die Vektornotation, aber nicht notwendigerweise Vektoren unter den Deckblättern.)

In Bezug auf Ihre zweite Frage: Lazy Seqs cachen ihre Ergebnisse, also würde Ihre zweite Option auch ohne zusätzliche Neuberechnung funktionieren. Der Kopf wird nur einmal berechnet.

    
mange 24.05.2013, 01:28
quelle
4

Der Bindungsvektor [x & xs] erstellt zur Laufzeit keinen Vektor. Es ist nur die Notation für die Destrukturierung in Kopf & amp; Schwanz.

So funktioniert es in unendlichen Sequenzen:

%Vor%

Die Destrukturierungsform erzeugt in diesem Fall tatsächlich eine träge Sequenz, die Sie wie folgt beobachten können:

%Vor%     
mikera 24.05.2013 02:23
quelle

Tags und Links