LISP - Symboles

Dans LISP, un symbole est un nom qui représente des objets de données et, fait intéressant, c'est aussi un objet de données.

Ce qui rend les symboles spéciaux, c'est qu'ils ont un composant appelé le property list, ou plist.

Listes de propriétés

LISP vous permet d'attribuer des propriétés aux symboles. Par exemple, ayons un objet «personne». Nous aimerions que cet objet «personne» ait des propriétés telles que le nom, le sexe, la taille, le poids, l'adresse, la profession, etc. Une propriété est comme un nom d'attribut.

Une liste de propriétés est implémentée sous la forme d'une liste avec un nombre pair (éventuellement zéro) d'éléments. Chaque paire d'éléments de la liste constitue une entrée; le premier élément est leindicator, et le second est le value.

Lorsqu'un symbole est créé, sa liste de propriétés est initialement vide. Les propriétés sont créées en utilisantget dans un setf forme.

Par exemple, les instructions suivantes nous permettent d'attribuer le titre de propriétés, l'auteur et l'éditeur, ainsi que les valeurs respectives, à un objet nommé (symbole) «livre».

Exemple 1

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

(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)))

Lorsque vous exécutez le code, il renvoie le résultat suivant -

(GONE WITH THE WIND)
(MARGARET MICHEL)
(WARNER BOOKS)

Diverses fonctions de liste de propriétés vous permettent d'attribuer des propriétés ainsi que de récupérer, remplacer ou supprimer les propriétés d'un symbole.

le getLa fonction renvoie la liste des propriétés du symbole pour un indicateur donné. Il a la syntaxe suivante -

get symbol indicator &optional default

le getla fonction recherche la liste des propriétés du symbole donné pour l'indicateur spécifié, si elle est trouvée, elle renvoie la valeur correspondante; sinon, la valeur par défaut est renvoyée (ou nil, si aucune valeur par défaut n'est spécifiée).

Exemple 2

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

(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))

Lorsque vous exécutez le code, il renvoie le résultat suivant -

(GONE WITH THE WIND)
(MARGARET MICHEAL)
(WARNER BOOKS)

le symbol-plist La fonction vous permet de voir toutes les propriétés d'un symbole.

Exemple 3

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

(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))

Lorsque vous exécutez le code, il renvoie le résultat suivant -

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)

le remprop La fonction supprime la propriété spécifiée d'un symbole.

Exemple 4

Créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

(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))

Lorsque vous exécutez le code, il renvoie le résultat suivant -

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)
(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT)