LISP - Listen
Listen waren die wichtigste und wichtigste zusammengesetzte Datenstruktur im traditionellen LISP. Das heutige Common LISP bietet andere Datenstrukturen wie Vektor, Hash-Tabelle, Klassen oder Strukturen.
Listen sind einzelne verknüpfte Listen. In LISP werden Listen als Kette einer einfachen Datensatzstruktur mit dem Namen erstelltcons miteinander verbunden.
Die Nachteile Datensatzstruktur
EIN cons ist eine Datensatzstruktur, die zwei Komponenten enthält, die als car und die cdr.
Nachteile Zellen oder Nachteile sind Objekte sind Wertepaare, die mit der Funktion erstellt werden cons.
Das consDie Funktion akzeptiert zwei Argumente und gibt eine neue Cons-Zelle zurück, die die beiden Werte enthält. Diese Werte können Verweise auf jede Art von Objekt sein.
Wenn der zweite Wert nicht Null oder eine andere Nachteilezelle ist, werden die Werte als gepunktetes Paar gedruckt, das in Klammern eingeschlossen ist.
Die beiden Werte in einer Cons-Zelle werden als bezeichnet car und die cdr. Das car Funktion wird verwendet, um auf den ersten Wert und die zuzugreifen cdr Funktion wird verwendet, um auf den zweiten Wert zuzugreifen.
Beispiel
Erstellen Sie eine neue Quellcodedatei mit dem Namen main.lisp und geben Sie den folgenden Code ein.
(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)))))
Wenn Sie den Code ausführen, wird das folgende Ergebnis zurückgegeben:
(1 . 2)
(A . B)
(1)
(1 2)
(1 2 3)
(A B C)
A
(B C)
Das obige Beispiel zeigt, wie die Nachteile-Strukturen verwendet werden können, um eine einzelne verknüpfte Liste zu erstellen, z. B. besteht die Liste (ABC) aus drei Nachteile-Zellen, die durch ihre CDR miteinander verbunden sind .
Diagrammatisch könnte es ausgedrückt werden als -
Listen in LISP
Obwohl Cons-Zellen zum Erstellen von Listen verwendet werden können, wird eine Liste aus verschachtelten Listen erstellt consFunktionsaufrufe können nicht die beste Lösung sein. Daslist Die Funktion wird eher zum Erstellen von Listen in LISP verwendet.
Die Listenfunktion kann eine beliebige Anzahl von Argumenten annehmen und wertet als Argument ihre Argumente aus.
Das first und restFunktionen geben das erste Element und den Rest einer Liste an. Die folgenden Beispiele veranschaulichen die Konzepte.
Beispiel 1
Erstellen Sie eine neue Quellcodedatei mit dem Namen main.lisp und geben Sie den folgenden Code ein.
(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)))
Wenn Sie den Code ausführen, wird das folgende Ergebnis zurückgegeben:
(1 2)
(A B)
(1 NIL)
(1 2 3)
(A B C)
(3 4 A B -8)
((A B) (C D E))
Beispiel 2
Erstellen Sie eine neue Quellcodedatei mit dem Namen main.lisp und geben Sie den folgenden Code ein.
(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))
Wenn Sie den Code ausführen, wird das folgende Ergebnis zurückgegeben:
"Hunger Game"
Listenmanipulationsfunktionen
Die folgende Tabelle enthält einige häufig verwendete Funktionen zur Listenbearbeitung.
Sr.Nr. | Bedienungsanleitung |
---|---|
1 | car Es nimmt eine Liste als Argument und gibt das erste Element zurück. |
2 | cdr Es nimmt eine Liste als Argument und gibt eine Liste ohne das erste Element zurück |
3 | cons Es werden zwei Argumente verwendet, ein Element und eine Liste, und es wird eine Liste zurückgegeben, in der das Element an erster Stelle eingefügt wird. |
4 | list Es akzeptiert eine beliebige Anzahl von Argumenten und gibt eine Liste mit den Argumenten als Elementelemente der Liste zurück. |
5 | append Es werden zwei oder mehr Listen zu einer zusammengeführt. |
6 | last Es nimmt eine Liste und gibt eine Liste zurück, die das letzte Element enthält. |
7 | member Es werden zwei Argumente benötigt, von denen das zweite eine Liste sein muss, wenn das erste Argument Mitglied des zweiten Arguments ist, und dann wird der Rest der Liste beginnend mit dem ersten Argument zurückgegeben. |
8 | reverse Es nimmt eine Liste und gibt eine Liste mit den obersten Elementen in umgekehrter Reihenfolge zurück. |
Bitte beachten Sie, dass alle Sequenzfunktionen auf Listen anwendbar sind.
Beispiel 3
Erstellen Sie eine neue Quellcodedatei mit dem Namen main.lisp und geben Sie den folgenden Code ein.
(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))))
Wenn Sie den Code ausführen, wird das folgende Ergebnis zurückgegeben:
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)
Verkettung von Auto- und CDR-Funktionen
Das car und cdr Funktionen und ihre Kombination ermöglichen das Extrahieren eines bestimmten Elements / Mitglieds einer Liste.
Sequenzen von Auto- und CDR-Funktionen könnten jedoch durch Verketten des Buchstabens a für Auto und d für CDR innerhalb der Buchstaben c und r abgekürzt werden.
Zum Beispiel können wir cadadr schreiben, um die Reihenfolge der Funktionsaufrufe abzukürzen - car cdr car cdr.
Somit gibt (cadadr '(a (cd) (efg))) d zurück
Beispiel 4
Erstellen Sie eine neue Quellcodedatei mit dem Namen main.lisp und geben Sie den folgenden Code ein.
(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)
Wenn Sie den Code ausführen, wird das folgende Ergebnis zurückgegeben:
D
A
(3 4)