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)