LISP - Séquences

La séquence est un type de données abstrait dans LISP. Les vecteurs et les listes sont les deux sous-types concrets de ce type de données. Toutes les fonctionnalités définies sur le type de données séquence sont en fait appliquées sur tous les vecteurs et types de liste.

Dans cette section, nous aborderons les fonctions les plus couramment utilisées sur les séquences.

Avant de commencer sur différentes manières de manipuler des séquences (c'est-à-dire des vecteurs et des listes), examinons la liste de toutes les fonctions disponibles.

Créer une séquence

La fonction make-sequence vous permet de créer une séquence de n'importe quel type. La syntaxe de cette fonction est -

make-sequence sqtype sqsize &key :initial-element

Il crée une séquence de type sqtype et de longueur sqsize.

Vous pouvez éventuellement spécifier une valeur en utilisant l' argument: élément-initial , puis chacun des éléments sera initialisé à cette valeur.

Par exemple, créez un nouveau fichier de code source nommé main.lisp et tapez le code suivant dedans.

(write (make-sequence '(vector float) 
   10 
   :initial-element 1.0))

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

#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)

Fonctions génériques sur les séquences

N ° Sr. Description de la fonction
1

elt

Il permet d'accéder à des éléments individuels via un index entier.

2

length

Il renvoie la longueur d'une séquence.

3

subseq

Il retourne une sous-séquence en extrayant la sous-séquence commençant à un index particulier et continuant jusqu'à un index de fin particulier ou à la fin de la séquence.

4

copy-seq

Il renvoie une séquence contenant les mêmes éléments que son argument.

5

fill

Il est utilisé pour définir plusieurs éléments d'une séquence sur une seule valeur.

6

replace

Il prend deux séquences et la première séquence d'arguments est modifiée de manière destructive en y copiant des éléments successifs à partir de la deuxième séquence d'arguments.

sept

count

Il prend un élément et une séquence et renvoie le nombre de fois où l'élément apparaît dans la séquence.

8

reverse

Il renvoie une séquence contenant les mêmes éléments de l'argument mais dans l'ordre inverse.

9

nreverse

Il renvoie la même séquence contenant les mêmes éléments que la séquence mais dans l'ordre inverse.

dix

concatenate

Il crée une nouvelle séquence contenant la concaténation d'un nombre quelconque de séquences.

11

position

Il prend un élément et une séquence et retourne l'index de l'élément dans la séquence ou nil.

12

find

Il faut un élément et une séquence. Il trouve l'élément dans la séquence et le renvoie, s'il n'est pas trouvé, il renvoie nil.

13

sort

Il prend une séquence et un prédicat à deux arguments et renvoie une version triée de la séquence.

14

merge

Il prend deux séquences et un prédicat et renvoie une séquence produite en fusionnant les deux séquences, selon le prédicat.

15

map

Il prend une fonction à n arguments et n séquences et renvoie une nouvelle séquence contenant le résultat de l'application de la fonction aux éléments suivants des séquences.

16

some

Il prend un prédicat comme argument et itère sur la séquence d'arguments, et retourne la première valeur non NIL renvoyée par le prédicat ou renvoie false si le prédicat n'est jamais satisfait.

17

every

Il prend un prédicat comme argument et itère sur la séquence d'arguments, il se termine, retournant false, dès que le prédicat échoue. Si le prédicat est toujours satisfait, il renvoie vrai.

18

notany

Il prend un prédicat comme argument et itère sur la séquence d'arguments, et retourne false dès que le prédicat est satisfait ou vrai s'il ne l'est jamais.

19

notevery

Il prend un prédicat comme argument et itère sur la séquence d'arguments, et retourne true dès que le prédicat échoue ou false si le prédicat est toujours satisfait.

20

reduce

Il mappe sur une seule séquence, appliquant d'abord une fonction à deux arguments aux deux premiers éléments de la séquence, puis à la valeur renvoyée par la fonction et les éléments suivants de la séquence.

21

search

Il recherche une séquence pour localiser un ou plusieurs éléments satisfaisant à un test.

22

remove

Il prend un élément et une séquence et renvoie la séquence avec les instances d'élément supprimées.

23

delete

Cela prend également un élément et une séquence et retourne une séquence du même type que la séquence d'arguments qui a les mêmes éléments à l'exception de l'élément.

24

substitute

Il prend un nouvel élément, un élément existant et une séquence et renvoie une séquence avec des instances de l'élément existant remplacées par le nouvel élément.

25

nsubstitute

Il prend un nouvel élément, un élément existant et une séquence et renvoie la même séquence avec des instances de l'élément existant remplacées par le nouvel élément.

26

mismatch

Il prend deux séquences et renvoie l'index de la première paire d'éléments non concordants.

Arguments de mot-clé de fonction de séquence standard

Argument Sens Valeur par défaut
:tester Il s'agit d'une fonction à deux arguments utilisée pour comparer l'élément (ou la valeur extraite par: fonction clé) à l'élément. EQL
:clé Fonction à un argument pour extraire la valeur de clé de l'élément de séquence réel. NIL signifie utiliser l'élément tel quel. NÉANT
:début Index de départ (inclus) de la sous-séquence. 0
:fin Index de fin (exclusif) de la sous-séquence. NIL indique la fin de la séquence. NÉANT
: à partir de la fin Si vrai, la séquence sera parcourue dans l'ordre inverse, de la fin au début. NÉANT
:compter Numéro indiquant le nombre d'éléments à supprimer ou à remplacer ou NIL pour tout indiquer (REMOVE et SUBSTITUTE uniquement). NÉANT

Nous venons de discuter de diverses fonctions et mots-clés qui sont utilisés comme arguments dans ces fonctions travaillant sur des séquences. Dans les sections suivantes, nous verrons comment utiliser ces fonctions à l'aide d'exemples.

Recherche de la longueur et de l'élément

le length renvoie la longueur d'une séquence et la elt La fonction vous permet d'accéder à des éléments individuels à l'aide d'un index entier.

Exemple

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

(setq x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))

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

5
D

Modifier des séquences

Certaines fonctions de séquence permettent d'itérer dans la séquence et d'effectuer certaines opérations telles que la recherche, la suppression, le comptage ou le filtrage d'éléments spécifiques sans écrire de boucles explicites.

L'exemple suivant illustre ceci -

Exemple 1

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

(write (count 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (substitute 10 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (find 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (position 5 '(1 5 6 7 8 9 2 7 3 4 5)))

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

2
(1 6 7 8 9 2 7 3 4)
(1 6 7 8 9 2 7 3 4)
(1 5 6 10 8 9 2 10 3 4 5)
7
1

Exemple 2

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

(write (delete-if #'oddp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5) :count 1 :from-end t))
(terpri)
(setq x (vector 'a 'b 'c 'd 'e 'f 'g))
(fill x 'p :start 1 :end 4)
(write x)

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

(6 8 2 4)
(1 5 7 9 7 3 5)
(1 5 6 7 8 9 2 7 3 5)
#(A P P P E F G)

Tri et fusion de séquences

Les fonctions de tri prennent une séquence et un prédicat à deux arguments et renvoient une version triée de la séquence.

Exemple 1

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

(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'<))
(terpri)
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'>))
(terpri)

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

(1 2 3 3 4 4 5 6 7 8 9)
(9 8 7 6 5 4 4 3 3 2 1)

Exemple 2

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

(write (merge 'vector #(1 3 5) #(2 4 6) #'<))
(terpri)
(write (merge 'list #(1 3 5) #(2 4 6) #'<))
(terpri)

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

#(1 2 3 4 5 6)
(1 2 3 4 5 6)

Prédicats de séquence

Les fonctions every, some, notany et notevery sont appelées les prédicats de séquence.

Ces fonctions itèrent sur des séquences et testent le prédicat booléen.

Toutes ces fonctions prennent un prédicat comme premier argument et les arguments restants sont des séquences.

Exemple

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

(write (every #'evenp #(2 4 6 8 10)))
(terpri)
(write (some #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (every #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (notany #'evenp #(2 4 6 8 10)))
(terpri)
(write (notevery #'evenp #(2 4 6 8 10 13 14)))
(terpri)

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

T
T
NIL
NIL
T

Cartographie des séquences

Nous avons déjà discuté des fonctions de mappage. De même lemap fonction vous permet d'appliquer une fonction aux éléments suivants d'une ou plusieurs séquences.

le map function prend une fonction à n arguments et n séquences et renvoie une nouvelle séquence après avoir appliqué la fonction aux éléments suivants des séquences.

Exemple

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

(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))

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

#(6 15 16 40)