LISP - Sequenze

La sequenza è un tipo di dati astratto in LISP. I vettori e gli elenchi sono i due sottotipi concreti di questo tipo di dati. Tutte le funzionalità definite sul tipo di dati di sequenza vengono effettivamente applicate su tutti i vettori e tipi di lista.

In questa sezione, discuteremo delle funzioni più comunemente usate sulle sequenze.

Prima di iniziare con vari modi di manipolare le sequenze (cioè vettori ed elenchi), diamo uno sguardo all'elenco di tutte le funzioni disponibili.

Creazione di una sequenza

La funzione make-sequence consente di creare una sequenza di qualsiasi tipo. La sintassi per questa funzione è:

make-sequence sqtype sqsize &key :initial-element

Crea una sequenza di tipo sqtype e di lunghezza sqsize.

Facoltativamente, puoi specificare un valore utilizzando l' argomento : initial-element , quindi ciascuno degli elementi verrà inizializzato su questo valore.

Ad esempio, crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente al suo interno.

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

Quando esegui il codice, restituisce il seguente risultato:

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

Funzioni generiche sulle sequenze

Sr.No. Descrizione della funzione
1

elt

Consente l'accesso a singoli elementi tramite un indice intero.

2

length

Restituisce la lunghezza di una sequenza.

3

subseq

Restituisce una sottosequenza estraendo la sottosequenza a partire da un particolare indice e continuando fino a un particolare indice finale o alla fine della sequenza.

4

copy-seq

Restituisce una sequenza che contiene gli stessi elementi del suo argomento.

5

fill

Viene utilizzato per impostare più elementi di una sequenza su un singolo valore.

6

replace

Richiede due sequenze e la prima sequenza di argomenti viene modificata in modo distruttivo copiandovi gli elementi successivi dalla seconda sequenza di argomenti.

7

count

Prende un elemento e una sequenza e restituisce il numero di volte in cui l'elemento appare nella sequenza.

8

reverse

Restituisce una sequenza contenente gli stessi elementi dell'argomento ma in ordine inverso.

9

nreverse

Restituisce la stessa sequenza contenente gli stessi elementi della sequenza ma in ordine inverso.

10

concatenate

Crea una nuova sequenza contenente la concatenazione di un numero qualsiasi di sequenze.

11

position

Prende un elemento e una sequenza e restituisce l'indice dell'elemento nella sequenza o nullo.

12

find

Ci vuole un oggetto e una sequenza. Trova l'elemento nella sequenza e lo restituisce, se non lo trova restituisce zero.

13

sort

Accetta una sequenza e un predicato a due argomenti e restituisce una versione ordinata della sequenza.

14

merge

Richiede due sequenze e un predicato e restituisce una sequenza prodotta dalla fusione delle due sequenze, in base al predicato.

15

map

Accetta una funzione con n argomenti e n sequenze e restituisce una nuova sequenza contenente il risultato dell'applicazione della funzione agli elementi successivi delle sequenze.

16

some

Prende un predicato come argomento e itera sulla sequenza di argomenti e restituisce il primo valore non NIL restituito dal predicato o restituisce false se il predicato non è mai soddisfatto.

17

every

Prende un predicato come argomento e itera sulla sequenza di argomenti, termina, restituendo falso, non appena il predicato fallisce. Se il predicato è sempre soddisfatto, restituisce vero.

18

notany

Prende un predicato come argomento e ripete la sequenza di argomenti e restituisce false non appena il predicato è soddisfatto o vero se non lo è mai.

19

notevery

Accetta un predicato come argomento e ripete la sequenza di argomenti e restituisce true non appena il predicato fallisce o false se il predicato è sempre soddisfatto.

20

reduce

Mappa su una singola sequenza, applicando una funzione a due argomenti prima ai primi due elementi della sequenza e poi al valore restituito dalla funzione e ai successivi elementi della sequenza.

21

search

Cerca una sequenza per individuare uno o più elementi che soddisfano un test.

22

remove

Prende un elemento e una sequenza e restituisce la sequenza con le istanze dell'elemento rimosse.

23

delete

Questo prende anche un elemento e una sequenza e restituisce una sequenza dello stesso tipo della sequenza di argomenti che ha gli stessi elementi tranne l'elemento.

24

substitute

Prende un nuovo elemento, un elemento esistente e una sequenza e restituisce una sequenza con istanze dell'elemento esistente sostituite con il nuovo elemento.

25

nsubstitute

Prende un nuovo elemento, un elemento esistente e una sequenza e restituisce la stessa sequenza con istanze dell'elemento esistente sostituite con il nuovo elemento.

26

mismatch

Richiede due sequenze e restituisce l'indice della prima coppia di elementi non corrispondenti.

Argomenti delle parole chiave della funzione sequenza standard

Discussione Senso Valore predefinito
:test È una funzione a due argomenti utilizzata per confrontare l'elemento (o il valore estratto da: funzione chiave) con l'elemento. EQL
:chiave Funzione con un argomento per estrarre il valore della chiave dall'effettivo elemento della sequenza. NIL significa usa l'elemento così com'è. NULLA
:inizio Indice iniziale (compreso) della sottosequenza. 0
:fine Indice finale (esclusivo) della sottosequenza. NIL indica la fine della sequenza. NULLA
: dalla fine Se vero, la sequenza verrà percorsa in ordine inverso, dalla fine all'inizio. NULLA
:contare Numero che indica il numero di elementi da rimuovere o sostituire o NIL per indicare tutti (solo RIMUOVI e SOSTITUISCI). NULLA

Abbiamo appena discusso di varie funzioni e parole chiave che vengono usate come argomenti in queste funzioni che lavorano sulle sequenze. Nelle prossime sezioni vedremo come utilizzare queste funzioni utilizzando esempi.

Trovare la lunghezza e l'elemento

Il length la funzione restituisce la lunghezza di una sequenza e il elt consente di accedere ai singoli elementi utilizzando un indice intero.

Esempio

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente al suo interno.

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

Quando esegui il codice, restituisce il seguente risultato:

5
D

Modifica delle sequenze

Alcune funzioni di sequenza consentono di iterare attraverso la sequenza ed eseguire alcune operazioni come la ricerca, la rimozione, il conteggio o il filtraggio di elementi specifici senza scrivere loop espliciti.

Il seguente esempio lo dimostra:

Esempio 1

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente al suo interno.

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

Quando esegui il codice, restituisce il seguente risultato:

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

Esempio 2

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente al suo interno.

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

Quando esegui il codice, restituisce il seguente risultato:

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

Ordinamento e unione di sequenze

Le funzioni di ordinamento accettano una sequenza e un predicato a due argomenti e restituiscono una versione ordinata della sequenza.

Esempio 1

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente al suo interno.

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

Quando esegui il codice, restituisce il seguente risultato:

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

Esempio 2

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente al suo interno.

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

Quando esegui il codice, restituisce il seguente risultato:

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

Predicati di sequenza

Le funzioni every, some, notany e notevery sono chiamate predicati di sequenza.

Queste funzioni eseguono l'iterazione su sequenze e testano il predicato booleano.

Tutte queste funzioni accettano un predicato come primo argomento e gli argomenti rimanenti sono sequenze.

Esempio

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente al suo interno.

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

Quando esegui il codice, restituisce il seguente risultato:

T
T
NIL
NIL
T

Sequenze di mappatura

Abbiamo già discusso le funzioni di mappatura. Allo stesso modo ilmap funzione consente di applicare una funzione agli elementi successivi di una o più sequenze.

Il map funzione accetta una funzione con n argomenti e n sequenze e restituisce una nuova sequenza dopo aver applicato la funzione agli elementi successivi delle sequenze.

Esempio

Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente al suo interno.

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

Quando esegui il codice, restituisce il seguente risultato:

#(6 15 16 40)