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)