Die Dokumentation hat mich nicht weiser gemacht:
Diese Funktion gibt den in der Wertezelle des Symbols gespeicherten Wert zurück. Hier wird der aktuelle (dynamische) Wert der Variablen gespeichert. Wenn die Variable keine lokale Bindung hat, ist dies einfach ihr globaler Wert. Wenn die Variable ungültig ist, wird ein ungültiger Variablenfehler gemeldet.
Was ist der Sinn des Symbolwertes? Wo und wann muss ich es benutzen?
Antworten:
Sie benötigen es, wenn Sie im Elisp-Code den Wert eines Symbols erhalten möchten, d. H. Den Wert, wenn Sie es als Variable betrachten.
Beachten Sie, dass ein Elisp-Symbol mehrere Merkmale aufweist:
symbol-name
gibt)symbol-value
gibt)symbol-function
gibt)symbol-plist
gibt)Stellen Sie sich ein Symbol als Objekt mit verschiedenen Attributen vor.
quelle
symbol-value
immer die dynamische Bindung für das Symbol zurückgegeben wird. Auf diese Weise können Sie keine lexikalischen Werte erhalten.C-h i g
(elisp) Symbol Components
RET
Dokumentation zu diesen verschiedenen Symbolzellen / -komponenten.(setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v)))
. Aber ja, das ist , was es sagt auf (elisp)Lexical Binding
: „ Funktionen wiesymbol-value
,boundp'
undset'
nur abrufen oder einer Variablen dynamisch ändern Bindung (dh der Inhalt seines Symbols Wert Zelle) “. Es wird jedoch nichts darüber gesagtSymbol Components
.(Doh, @Drew hat bereits einige der folgenden Punkte angesprochen. Hier sind jedoch einige zusätzliche Details.)
Wie in der Handbuchseite zu Symbolkomponenten erläutert, enthält jedes Symbol vier Komponenten (Zellen): seine Drucknamenszelle, seine Wertezelle, seine Funktionsdefinition und seine Eigenschaftsliste. Entweder die Wertzelle oder die Funktionszelle ist ungültig, und die Eigenschaftsliste ist möglicherweise null.
Wie das Handbuch auch betont:
Deshalb können Sie zum Beispiel haben:
quelle
Hier ist ein historischer Hinweis (ich bin noch nicht geboren, als die beschriebenen Ereignisse stattfanden, also korrigiert mich vielleicht jemand, der mehr über mich weiß. All dies ist auf das Lesen alter Artikel und einiger Bücher zurückzuführen).
Nachdem auf den Haftungsausschluss verzichtet wurde, scheint es, als sei "symbolisch" in den Tagen von Fortran vs Lisp eine Art Modewort gewesen, wie es "objektorientiert" heute ist. Das heißt, Programme wurden in der Regel nur als riesige mathematische Formeln betrachtet, bei denen die Zahlen irgendwann eingefügt werden und die Platzhalter für Zahlen unerheblich sind. Alle in einem Programm enthaltenen symbolischen Informationen würden verschwinden, sobald dieses Programm entweder ausgeführt, kompiliert oder interpretiert wird. Die Neuheit von Lisp war, dass Symbole in einem Programm bestehen bleiben konnten, selbst nachdem es ausgeführt, kompiliert oder interpretiert wurde. Dies inspirierte eine Terminologie wie "symbolische Algebra" (wie bei der Manipulation algebraischer Formeln auf Papier / Tafel anstatt durch direkte Berechnung). Um dies (und andere symbolische Dinge) zu unterstützen, sollten Symbole mit einem Namen und einigen Eigenschaften versehen werden. Aus nicht-symbolischer Sicht könnte man sagen, dass "Symbole nur benannte Zeiger" sind, und obwohl dies nicht der Fall ist, sind sie eher Zeiger auf Strukturen, aber aus praktischen Gründen sind Symbole Bezeichner der Linken Seite eines Variablen-Wert-Paares. Dies macht es auch möglich zu sehen
symbol-value
Funktion als Zeiger-Dereferenzierung in nicht-symbolischen Sprachen.Moderne Lisps unterscheiden sich darin, wie viele Werte einem Symbol zugeordnet werden können. (Angenommen, Sie hatten eine nicht-symbolische Sprache mit mehreren Speicherstapeln / -haufen. Sie könnten sich eine Situation vorstellen, in der der gleiche Zeiger eine Bedeutung hat, wenn er im Kontext verschiedener Stapel interpretiert wird.) Haufen). So haben Lisp2-Sprachen (Emacs Lisp ist eine solche Sprache) einen separaten Speicher für Funktionen und Variablen. Deshalb gibt es auch einen
symbol-function
, der "einen Zeiger dereferenziert, der auf einen Funktionsspeicher verweist". Schema hat diesen speziellen Speicher nicht und Clojure AFAIK hat weder das nochsymbol-plist
.quelle
Kleine Demo:
quelle