LISP - Elenchi
Gli elenchi erano stati la struttura di dati composita più importante e primaria nel LISP tradizionale. Il Common LISP di oggi fornisce altre strutture di dati come vettore, tabella hash, classi o strutture.
Gli elenchi sono elenchi singoli collegati. In LISP, gli elenchi sono costruiti come una catena di una semplice struttura di record denominatacons collegati insieme.
I contro Record Structure
UN cons è una struttura di record contenente due componenti denominati car e il cdr.
Le celle contro o contro sono oggetti sono coppie di valori che vengono creati utilizzando la funzione cons.
Il consla funzione accetta due argomenti e restituisce una nuova cella contro contenente i due valori. Questi valori possono essere riferimenti a qualsiasi tipo di oggetto.
Se il secondo valore non è nullo o un'altra cella contro, i valori vengono stampati come una coppia punteggiata racchiusa tra parentesi.
I due valori in una cella contro sono chiamati car e il cdr. Il car viene utilizzata per accedere al primo valore e al file cdr viene utilizzata per accedere al secondo valore.
Esempio
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(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)))))
Quando esegui il codice, restituisce il seguente risultato:
(1 . 2)
(A . B)
(1)
(1 2)
(1 2 3)
(A B C)
A
(B C)
L'esempio sopra mostra come le strutture contro potrebbero essere utilizzate per creare un singolo elenco collegato, ad esempio, l'elenco (ABC) è costituito da tre celle contro collegate tra loro dai loro CDR .
Diagrammaticamente, potrebbe essere espresso come -
Elenchi in LISP
Sebbene le celle contro possano essere utilizzate per creare elenchi, tuttavia, costruendo un elenco da nidificato consle chiamate di funzione non possono essere la soluzione migliore. Illist è piuttosto usata per creare liste in LISP.
La funzione lista può accettare un numero qualsiasi di argomenti e poiché è una funzione, valuta i suoi argomenti.
Il first e restle funzioni danno il primo elemento e la parte restante di una lista. I seguenti esempi dimostrano i concetti.
Esempio 1
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(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)))
Quando esegui il codice, restituisce il seguente risultato:
(1 2)
(A B)
(1 NIL)
(1 2 3)
(A B C)
(3 4 A B -8)
((A B) (C D E))
Esempio 2
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(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))
Quando esegui il codice, restituisce il seguente risultato:
"Hunger Game"
Elenca le funzioni di manipolazione
La tabella seguente fornisce alcune funzioni di manipolazione degli elenchi di uso comune.
Sr.No. | Descrizione della funzione |
---|---|
1 | car Accetta una lista come argomento e restituisce il suo primo elemento. |
2 | cdr Accetta una lista come argomento e restituisce una lista senza il primo elemento |
3 | cons Prende due argomenti, un elemento e una lista e restituisce una lista con l'elemento inserito al primo posto. |
4 | list Accetta un numero qualsiasi di argomenti e restituisce un elenco con gli argomenti come elementi membri dell'elenco. |
5 | append Unisce due o più elenchi in uno. |
6 | last Prende un elenco e restituisce un elenco contenente l'ultimo elemento. |
7 | member Richiede due argomenti di cui il secondo deve essere un elenco, se il primo argomento è un membro del secondo argomento, quindi restituisce il resto dell'elenco a partire dal primo argomento. |
8 | reverse Prende un elenco e restituisce un elenco con gli elementi in alto in ordine inverso. |
Si noti che tutte le funzioni di sequenza sono applicabili agli elenchi.
Esempio 3
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(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))))
Quando esegui il codice, restituisce il seguente risultato:
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)
Concatenazione di funzioni auto e cdr
Il car e cdr funzioni e la loro combinazione consente di estrarre qualsiasi elemento / membro particolare di una lista.
Tuttavia, le sequenze di funzioni car e cdr potrebbero essere abbreviate concatenando la lettera a per car e d per cdr all'interno delle lettere c e r.
Ad esempio possiamo scrivere cadadr per abbreviare la sequenza delle chiamate di funzione: car cdr car cdr.
Quindi, (cadadr '(a (cd) (efg))) restituirà d
Esempio 4
Crea un nuovo file di codice sorgente denominato main.lisp e digita il codice seguente.
(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)
Quando esegui il codice, restituisce il seguente risultato:
D
A
(3 4)