LISP - Simboli
In LISP, un simbolo è un nome che rappresenta oggetti dati e, cosa interessante, è anche un oggetto dati.
Ciò che rende speciali i simboli è che hanno un componente chiamato property list, o plist.
Elenchi di proprietà
LISP consente di assegnare proprietà ai simboli. Ad esempio, diamo un oggetto "persona". Vorremmo che questo oggetto "persona" avesse proprietà come nome, sesso, altezza, peso, indirizzo, professione ecc. Una proprietà è come il nome di un attributo.
Un elenco di proprietà viene implementato come un elenco con un numero pari (possibilmente zero) di elementi. Ciascuna coppia di elementi nell'elenco costituisce una voce; il primo elemento è ilindicator, e il secondo è il value.
Quando viene creato un simbolo, il suo elenco di proprietà è inizialmente vuoto. Le proprietà vengono create utilizzandoget All'interno di una setf modulo.
Ad esempio, le seguenti istruzioni ci consentono di assegnare proprietà titolo, autore ed editore, e rispettivi valori, a un oggetto denominato (simbolo) "libro".
Esempio 1
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(write (setf (get 'books'title) '(Gone with the Wind)))
(terpri)
(write (setf (get 'books 'author) '(Margaret Michel)))
(terpri)
(write (setf (get 'books 'publisher) '(Warner Books)))
Quando esegui il codice, restituisce il seguente risultato:
(GONE WITH THE WIND)
(MARGARET MICHEL)
(WARNER BOOKS)
Diverse funzioni di elenco delle proprietà consentono di assegnare proprietà nonché di recuperare, sostituire o rimuovere le proprietà di un simbolo.
Il getrestituisce l'elenco delle proprietà del simbolo per un dato indicatore. Ha la seguente sintassi:
get symbol indicator &optional default
Il getla funzione cerca l'elenco delle proprietà del simbolo dato per l'indicatore specificato, se trovato restituisce il valore corrispondente; altrimenti viene restituito default (o nil, se non viene specificato un valore predefinito).
Esempio 2
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(setf (get 'books 'title) '(Gone with the Wind))
(setf (get 'books 'author) '(Margaret Micheal))
(setf (get 'books 'publisher) '(Warner Books))
(write (get 'books 'title))
(terpri)
(write (get 'books 'author))
(terpri)
(write (get 'books 'publisher))
Quando esegui il codice, restituisce il seguente risultato:
(GONE WITH THE WIND)
(MARGARET MICHEAL)
(WARNER BOOKS)
Il symbol-plist la funzione ti permette di vedere tutte le proprietà di un simbolo.
Esempio 3
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)
(terpri)
(write (symbol-plist 'annie))
Quando esegui il codice, restituisce il seguente risultato:
(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)
Il remprop funzione rimuove la proprietà specificata da un simbolo.
Esempio 4
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)
(terpri)
(write (symbol-plist 'annie))
(remprop 'annie 'age)
(terpri)
(write (symbol-plist 'annie))
Quando esegui il codice, restituisce il seguente risultato:
(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)
(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT)