2016-07-01 21 views
0

Ich denke, die Antwort ist nein, da das Ergebnis vonVerwendet Emacs einen globalen String-Cache?

(eq "a" "a") 

ist nil. Bedeutet das also, dass es schneller wäre, ein einzelnes konstantes Symbol zu erzeugen, das eine Zeichenkette und ein Byte enthält, um alles mit dem Symbol anstatt der eigentlichen Zeichenkette zu kompilieren? Ich bin mir nicht sicher, wie ich das richtig testen soll.

+0

Wt Teil Ihrer Frage: Ja, es ist schneller, Symbole zu vergleichen (mit 'eq') als Strings (einschließlich der Strings, die Symbole benennen). – Drew

+1

Ja, es ist falsch. Strings sind teuer in Emacs Lisp. Symbole und Puffer sind nicht teuer. Und wenn Sie möchten, können Sie Ihre eigenen Obrarays erstellen, die in Wirklichkeit Symbolsätze und Namensräume sind. – Drew

Antwort

1

Die elisp Leser erstellt ein neues Objekt, wenn es ein String-Literal liest.

Der Leser konvertiert (eq "a" "a") in eine Liste von drei Objekten für die nachfolgende Auswertung: das interne Symbol eq und zwei String-Objekte.

Die beiden String-Objekte sind equal und string-equal, weil sie äquivalente Werte haben; aber sie sind verschiedene Objekte, also sind sie nicht .

+0

Das Lesegerät konvertiert (einmal) den von Ihnen geschriebenen Text in Lisp-Objekte, die (wiederholt) ausgewertet werden können. Der Text, den Sie schreiben, wird nicht direkt ausgewertet, und es gibt Regeln, die regeln, was der Leser produziert - z. String-Literale werden als unabhängige Objekte gelesen, während gleiche Zahlen als dasselbe Objekt gelesen werden - was Konsequenzen für die Evaluierungsphase hat. Ohne den Unterschied zwischen den Phasen Lesen und Evaluieren zu verstehen, können bestimmte Aspekte des Lispelns sehr verwirrend sein. (http://emacs.stackexchange.com/q/20535 ist ein gutes Beispiel.) – phils

+0

Mit dem Vorbehalt, dass ich kein Experte für Byte-Kompilierung bin, soweit ich es verstehe, geht der Byte-kompilierte Code immer noch durch Der gleiche Lesevorgang, bei dem nicht kompilierter Code (oder mindestens * a * Lesevorgang) durchlaufen wird. Die kompilierte Form ist sicherlich effizienter während der Ausführung, aber wenn ihr Verhalten nicht mit der unkompilierten Form übereinstimmt, wäre das ein riesiges Problem, also glaube ich nicht, dass es so grau ist, wie Sie vielleicht denken. – phils