Les docs ne m'ont pas rendu plus sage:
Cette fonction renvoie la valeur stockée dans la cellule de valeur du symbole. C'est là que la valeur actuelle (dynamique) de la variable est stockée. Si la variable n'a pas de liaison locale, il s'agit simplement de sa valeur globale. Si la variable est nulle, une erreur de variable vide est signalée.
À quoi sert la valeur du symbole? Où et quand dois-je l'utiliser?
Réponses:
Vous en avez besoin lorsque, dans le code Elisp, vous souhaitez obtenir la valeur d'un symbole, c'est-à-dire sa valeur lorsqu'elle est considérée comme une variable.
Gardez à l'esprit qu'un symbole Elisp a plusieurs caractéristiques / fonctionnalités:
symbol-name
donne)symbol-value
donne)symbol-function
donne)symbol-plist
donne)Considérez un symbole comme un objet, avec différents attributs.
la source
symbol-value
renvoie toujours la liaison dynamique pour le symbole. Vous ne pouvez pas obtenir des valeurs lexicales de cette façon.C-h i g
(elisp) Symbol Components
RET
documentation sur ces différentes cellules / composants de symboles.(setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v)))
. Mais oui, c'est ce qu'il dit dans (elisp)Lexical Binding
: " fonctionne commesymbol-value
,boundp'
etset'
ne récupère ou modifie que la liaison dynamique d'une variable (c'est-à-dire le contenu de la cellule de valeur de son symbole) ". Cependant, rien n'est dit à ce sujet surSymbol Components
.(Doh, @Drew a déjà mis en place certains des éléments suivants. Quoi qu'il en soit, voici quelques détails supplémentaires.)
Comme l'explique la page de manuel sur les composants des symboles , chaque symbole comprend quatre composants (cellules): sa cellule de nom d'impression, sa cellule de valeur, sa définition de fonction et sa liste de propriétés. La cellule de valeur ou la cellule de fonction peut être nulle et la liste des propriétés peut être nulle.
Comme le souligne également le manuel:
C'est pourquoi vous pouvez avoir, par exemple:
la source
Voici un peu de référence historique (je ne suis pas encore né lorsque les événements décrits ont eu lieu, alors peut-être que quelqu'un de plus compétent me corrigera. Tout cela vient de la lecture de vieux articles et de certains livres).
Ayant renoncé à la clause de non-responsabilité, il semble qu'à l'époque de Fortran vs Lisp, «symbolique» était une sorte de mot à la mode comme «orienté objet» l'est aujourd'hui. C'est-à-dire que les programmes étaient généralement considérés comme de simples formules mathématiques énormes où les nombres seront éventuellement connectés et les espaces réservés pour les nombres étaient sans importance. Toutes les informations symboliques contenues dans un programme disparaîtraient dès que ce programme serait exécuté, compilé ou interprété. La nouveauté de Lisp était qu'elle permettait aux symboles de persister dans un programme même après son exécution, sa compilation ou son interprétation. Cela a inspiré une terminologie comme «algèbre symbolique» (comme dans la manipulation des formules algébriques comme sur papier / tableau noir plutôt que par calcul direct). Afin de soutenir cela (et d'autres choses symboliques), les symboles devaient être dotés d'un nom et de certaines propriétés. D'un point de vue non symbolique, on pourrait dire que "les symboles ne sont que des pointeurs nommés", et bien que ce ne soit pas vrai, ils sont plutôt des pointeurs vers des structures, mais à des fins pratiques, les symboles sont des désignateurs de gauche côté d'une paire à valeur variable. Cela permet également de voir
symbol-value
fonctionnent comme un déréférencement de pointeur dans des langages non symboliques.Les lisps modernes varient en ce que les valeurs peuvent être associées à un symbole (supposons que vous ayez un langage non symbolique avec plusieurs piles / tas de mémoire, vous pouvez imaginer une situation où le même pointeur a un sens lorsqu'il est interprété dans le contexte de différentes piles / tas). Ainsi, les langages Lisp2 (Emacs Lisp étant l'un de ces langages) ont un stockage séparé pour les fonctions et les variables, c'est pourquoi il y a aussi un
symbol-function
, qui "déréférence un pointeur pointant vers un stockage de fonction". Scheme n'a pas ce stockage spécial et Clojure AFAIK, n'a ni ça ni çasymbol-plist
.la source
Petite démo:
la source