LISP - Listes

Les listes étaient la structure de données composite la plus importante et la plus importante du LISP traditionnel. Le LISP commun actuel fournit d'autres structures de données telles que des vecteurs, des tables de hachage, des classes ou des structures.

Les listes sont des listes chaînées uniques. Dans LISP, les listes sont construites comme une chaîne d'une structure d'enregistrement simple nomméecons liés ensemble.

La structure des enregistrements contre

UNE cons est une structure d'enregistrement contenant deux composants appelés car et le cdr.

Les cellules contre ou contre sont des objets sont des paires de valeurs créées à l'aide de la fonction cons.

le consfunction prend deux arguments et retourne une nouvelle cellule cons contenant les deux valeurs. Ces valeurs peuvent être des références à tout type d'objet.

Si la deuxième valeur n'est pas nulle, ou une autre cellule contre, alors les valeurs sont imprimées sous la forme d'une paire en pointillés entre parenthèses.

Les deux valeurs d'une cellule cons sont appelées les car et le cdr. le car permet d'accéder à la première valeur et à la cdr La fonction est utilisée pour accéder à la deuxième valeur.

Exemple

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

(write (cons 1 2))
(terpri)
(write (cons 'a 'b))
(terpri)
(write (cons 1 nil))
(terpri)
(write (cons 1 (cons 2 nil)))
(terpri)
(write (cons 1 (cons 2 (cons 3 nil))))
(terpri)
(write (cons 'a (cons 'b (cons 'c nil))))
(terpri)
(write ( car (cons 'a (cons 'b (cons 'c nil)))))
(terpri)
(write ( cdr (cons 'a (cons 'b (cons 'c nil)))))

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

(1 . 2)
(A . B)
(1)
(1 2)
(1 2 3)
(A B C)
A
(B C)

L'exemple ci-dessus montre comment les structures contre peuvent être utilisées pour créer une seule liste chaînée, par exemple, la liste (ABC) se compose de trois cellules contre liées entre elles par leurs cdr .

Schématiquement, il pourrait être exprimé comme -

Listes dans LISP

Bien que les contre-cellules puissent être utilisées pour créer des listes, la construction d'une liste à partir de consles appels de fonction ne peuvent pas être la meilleure solution. lelist La fonction est plutôt utilisée pour créer des listes dans LISP.

La fonction de liste peut prendre n'importe quel nombre d'arguments et comme il s'agit d'une fonction, elle évalue ses arguments.

le first et restLes fonctions donnent le premier élément et le reste d'une liste. Les exemples suivants illustrent les concepts.

Exemple 1

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

(write (list 1 2))
(terpri)
(write (list 'a 'b))
(terpri)
(write (list 1 nil))
(terpri)
(write (list 1 2 3))
(terpri)
(write (list 'a 'b 'c))
(terpri)
(write (list 3 4 'a (car '(b . c)) (* 4 -2)))
(terpri)
(write (list (list 'a 'b) (list 'c 'd 'e)))

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

(1 2)
(A B)
(1 NIL)
(1 2 3)
(A B C)
(3 4 A B -8)
((A B) (C D E))

Exemple 2

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

(defun my-library (title author rating availability)
   (list :title title :author author :rating rating :availabilty availability)
)

(write (getf (my-library "Hunger Game" "Collins" 9 t) :title))

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

"Hunger Game"

Liste des fonctions de manipulation

Le tableau suivant fournit quelques fonctions de manipulation de liste couramment utilisées.

N ° Sr. Description de la fonction
1

car

Il prend une liste comme argument et renvoie son premier élément.

2

cdr

Il prend une liste comme argument et retourne une liste sans le premier élément

3

cons

Il prend deux arguments, un élément et une liste et renvoie une liste avec l'élément inséré en premier lieu.

4

list

Il prend n'importe quel nombre d'arguments et renvoie une liste avec les arguments en tant qu'éléments membres de la liste.

5

append

Il fusionne deux ou plusieurs listes en une seule.

6

last

Il prend une liste et retourne une liste contenant le dernier élément.

sept

member

Il prend deux arguments dont le second doit être une liste, si le premier argument est membre du second argument, puis il retourne le reste de la liste en commençant par le premier argument.

8

reverse

Il prend une liste et renvoie une liste avec les éléments supérieurs dans l'ordre inverse.

Veuillez noter que toutes les fonctions de séquence sont applicables aux listes.

Exemple 3

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

(write (car '(a b c d e f)))
(terpri)
(write (cdr '(a b c d e f)))
(terpri)
(write (cons 'a '(b c)))
(terpri)
(write (list 'a '(b c) '(e f)))
(terpri)
(write (append '(b c) '(e f) '(p q) '() '(g)))
(terpri)
(write (last '(a b c d (e f))))
(terpri)
(write (reverse '(a b c d (e f))))

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

A
(B C D E F)
(A B C)
(A (B C) (E F))
(B C E F P Q G)
((E F))
((E F) D C B A)

Concaténation des fonctions voiture et cdr

le car et cdr les fonctions et leur combinaison permettent d'extraire tout élément / membre particulier d'une liste.

Cependant, les séquences de fonctions car et cdr pourraient être abrégées en concaténant la lettre a pour car et d pour cdr dans les lettres c et r.

Par exemple, nous pouvons écrire cadadr pour abréger la séquence des appels de fonction - car cdr car cdr.

Ainsi, (cadadr '(a (cd) (efg))) retournera d

Exemple 4

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

(write (cadadr '(a (c d) (e f g))))
(terpri)
(write (caar (list (list 'a 'b) 'c)))   
(terpri)
(write (cadr (list (list 1 2) (list 3 4))))
(terpri)

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

D
A
(3 4)