Cosa fa `valore-simbolo`?


13

I documenti non mi hanno reso più saggio:

Questa funzione restituisce il valore memorizzato nella cella del valore del simbolo. Qui è dove viene memorizzato il valore corrente (dinamico) della variabile. Se la variabile non ha alcun legame locale, questo è semplicemente il suo valore globale. Se la variabile è nulla, viene segnalato un errore variabile vuoto.

Qual è il punto del valore-simbolo? Dove e quando devo usarlo?


3
Grazie per aver cercato di trovare la risposta chiedendo Emacs. Questo è l'approccio giusto: chiedi prima a Emacs e poi chiedi qui tutto ciò che non è ancora chiaro, facendoci sapere nella tua domanda cosa hai già provato. Complimenti!
Estratto il

Risposte:


13

Ne hai bisogno quando, nel codice Elisp, vuoi ottenere il valore di un simbolo, cioè il suo valore se considerato come una variabile.

Tieni presente che un simbolo Elisp ha diverse caratteristiche / caratteristiche:

  • Ha un nome (quale funzione symbol-namefornisce)
  • Potrebbe avere un valore, se considerato come una variabile (che symbol-valuefornisce)
  • Potrebbe nominare una funzione, se considerata come una funzione (che symbol-functiondà)
  • Ha un elenco di proprietà (che symbol-plistfornisce)

Pensa a un simbolo come a un oggetto, con vari attributi.


1
Si noti inoltre che (come indica la documentazione) symbol-valuerestituisce sempre l' associazione dinamica per il simbolo. Non è possibile ottenere valori lessicali in questo modo.
phils,

2
Consultare anche la C-h i g (elisp) Symbol Components RETdocumentazione su queste varie celle / componenti di simboli.
phils,

@phils: Hm, mi chiedo: (setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v))). Ma sì, questo è ciò che dice in (elisp) Lexical Binding: " funziona come symbol-value, boundp'e set'recupera o modifica solo il legame dinamico di una variabile (cioè il contenuto della cella del valore del suo simbolo) ". Tuttavia, non si dice nulla al riguardo Symbol Components.
Drew

10

(Doh, @Drew ha già inserito alcuni dei seguenti. Comunque, ecco alcuni dettagli aggiuntivi.)

Come spiega la pagina del manuale sui componenti dei simboli , ci sono quattro componenti (celle) per ciascun simbolo: la sua cella del nome di stampa, la sua cella del valore, la sua definizione della funzione e il suo elenco di proprietà. La cella del valore o la cella della funzione potrebbero essere nulle e l'elenco delle proprietà potrebbe essere nullo.

Come indica anche il manuale:

Poiché ogni simbolo ha celle di valori e funzioni separate, i nomi delle variabili e i nomi delle funzioni non sono in conflitto.

Ecco perché puoi avere, ad esempio:

(setq test "kittens")
(defun test ()
  (message "puppies"))
(symbol-value 'test)    ; => "kittens"
(symbol-function 'test) ; => (lambda nil (message "puppies"))

1
Ah, il fatto che sia un valore anziché una funzione ha reso molto più facile la comprensione. Grazie.
The Unfun Cat

8

Ecco un po 'di riferimento storico (non sono ancora nato quando si sono verificati gli eventi descritti, quindi forse qualcuno più esperto mi correggerà. Tutto questo deriva dalla lettura di vecchi articoli e alcuni libri).

Avendo rinunciato al disclaimer, sembra che ai tempi di Fortran vs Lisp "simbolico" fosse una specie di parola d'ordine come oggi "orientato agli oggetti". Vale a dire che i programmi erano generalmente visti come enormi formule matematiche in cui i numeri alla fine sarebbero stati collegati e i segnaposto per i numeri erano irrilevanti. Tutte le informazioni simboliche contenute in un programma svanirebbero non appena quel programma veniva eseguito, compilato o interpretato. La novità di Lisp è che ha permesso ai simboli di persistere in un programma anche dopo che è stato eseguito, compilato o interpretato. Ciò ha ispirato una terminologia come "algebra simbolica" (come nella manipolazione di formule algebriche come su carta / lavagna piuttosto che mediante calcoli diretti). Per supportare questo (e altre cose simboliche) i simboli dovevano essere dotati di un nome e di alcune proprietà. Da un punto di vista non simbolico, si potrebbe dire che "i simboli sono solo denominati puntatori", e sebbene ciò non sia vero, semmai sono più puntatori a strutture, ma per scopi pratici, i simboli sono designatori della sinistra lato della mano di una coppia di valore variabile. Questo rende anche possibile vederesymbol-value funzione di dereferenziazione di puntatori in linguaggi non simbolici.

I Lisp moderni variano in quanto quanti valori possono essere associati a un simbolo (supponiamo che tu abbia un linguaggio non simbolico con più stack / heap di memoria, potresti immaginare una situazione in cui lo stesso puntatore ha significato quando interpretato nel contesto di diversi stack / cumuli). Quindi, le lingue Lisp2 (Emacs Lisp essendo una di queste lingue) hanno una memoria separata per funzioni e variabili, ecco perché c'è anche una symbol-function, che "dereferenzia un puntatore che punta a una memoria di funzioni". Scheme non ha questo spazio di archiviazione speciale e Clojure AFAIK, né quello né quello symbol-plist.


7

Piccola demo:

(setq v1 10)
;;10
v1
;;10
(setq v2 'v1)
;;v1
v2
;;v1
(symbol-value v2)
;;10 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.