sah ich das folgende Beispiel in Video Rich auf Sequenzen http://blip.tv/file/734409 etwa 33-36 Minuten hinein:Auf Leistung von `die Clojure first` Funktion
(first "abcd") => \a
Nun er sagt, dass dies zu (Art erweitert):
(first "abcd") => (first (seq "abcd")) => (first '(\a \b \c \d))
So sieht es aus wie ein O(N)
Betrieb, da die vollständige Kopie der Zeichenfolge gemacht wird. Vor allem, wenn ein String
unveränderlich ist, warum wird es dann kopiert? (Edit: basierend auf einer Antwort, ist es wahrscheinlich nicht; sah einfach so, wenn gedruckt.) Zweitens angenommen first
auf etwas anderes in Java, das veränderbar ist, sagen eine verknüpfte Liste von ganzen Zahlen. Sollte first
auf eine faule Weise handeln (z. B. zuerst eine persistente Sequenz erstellen)? Wäre es nicht sinnvoll, es sofort zu bewerten und zu speichern? Es wäre eine Art Hack, der die nette Abstraktion durchbricht, aber die Arbeit schnell erledigt, denke ich. Wenn Sie (seq "abcd")
anrufen, wissen Sie nicht, wie es verwendet wird. Wenn Sie eine first
auf einer seq
anrufen, wissen Sie, was zu tun ist. Aber wenn Sie first
auf "abcd"
anrufen, denke ich, dass die Durchführung einer hacky und schnell "greifen und speichern", Ansatz ist besser als eine Sequenz und dann rufen Sie first
.
Fehle ich etwas? Hat Rich Hickey einige Schritte ausgelassen?
Lassen Sie mich wissen, wenn ich Fragen habe. Vielen Dank!
Danke, jede weitere Eingabe zum Arbeiten mit veränderbaren Java-Objekten, die in eine Sequenz umgewandelt werden können? –
IIRC, ruft seq eine faule Clojure-Sequenz auf, die von einem Java-Iterator über die Sammlung unterstützt wird. Wenn also die Lazy-Sequenz realisiert wird, muss sie allen Regeln folgen, die Iteratoren betreffen (was das Mutieren des zugrunde liegenden Objekts betrifft). Sobald es jedoch realisiert ist, ist es eine unveränderliche Clojure-Sequenz. – levand
@Hamish - Wenn Sie ein veränderbares Java-Objekt in eine Sequenz umwandeln möchten, müssen Sie entweder eine defensive Kopie mit O (n) -Kosten erstellen oder das Risiko eingehen, dass die zugrunde liegenden Daten geändert werden (was die normalen Erwartungen von Seq. Verletzen würde) Verhalten und vielleicht kleine Fehler verursachen). Der frühere Ansatz (Kopieren) ist wahrscheinlich vorzuziehen, letzterer ist sehr gefährlich, es sei denn, Sie sind sich absolut sicher, dass im falschen Moment nichts geändert wird. – mikera