Fachkonzept: Listen
Listen stellen einen wichtigen Datentyp dar, mit welchem mehrere Daten gleichzeitig verarbeitet werden können.
Eine nicht-leere Liste besteht aus einer leeren Liste, an welche nacheinander beliebig viele neue Elemente angefügt wurden.
Das zuletzt angefügte Element bildet das First-Element (ebenfalls geläufig: Head), die restlichen Elemente bilden den Rest (Tail) der Liste. Der Rest ist somit wiederum eine Liste.
Die Erzeugung von Listen in Racket wird, gemäß unsere Definition, durch das Anfügen von Elementen an eine leere-Liste
umgesetzt. Die hierzu genutzte Funktion cons
setzt genau dies um, indem ein neues First-Element
angefügt wird und die restliche Liste als Rest deklariert wird:
(cons elem-n (... (cons elem-3 (cons elem-2 (cons elem-1 empty)))))
Die Erzeugung der Liste (0, 1, 2, 3) würde schematisch wie folgt ablaufen:
Neben der Erstellung einer Liste mittelscons
, bietet Racket die Funktion list
an,
welche die Erstellung einer Liste für uns übernimmt:
(list elem-n ... elem-1)
Funktionen auf Listen
Signaturen:
Racket bietet bereits native einige Funktionen an, die Listen verarbeiten.
Um die Übergabe- und Rückgabedaten der Funktionen zu beschreiben, nutzen wir in den Signaturen
%a
und list-of
.
-
%a
dient als Platzhalter für einen beliebigen Datentyp. In der Praxis könnten die verwendeten Daten also beispielsweisenatural
,real
,string
,boolean
oder aber jeder andere Datentyp sein. -
list-of
gibt den Datentyp Liste an. Eine Liste ist immer von einem Datentyp%a
.
Gängige Funktionen:
Um das First-Element einer Liste zu erhalten nutzen wir die Funktion first
.
Um den Rest zu erhalten, die Funktion rest
. Die Signaturen sind wie folgt:
-
first
:((list-of %a) -> %a)
-
rest
:((list-of %a) -> (list-of %a))
Um Listen in Racket zu erweitern, verwendet man entweder cons
, was ein neues First-Element anfügt. oder
append
, welches mehrere Listen miteinander verknüpft. Die Signaturen sind wie folgt:
-
cons
:(a% (list-of %a) -> (list-of %a))
-
append
:
Nutzen wir die Funktion nur zur Verknüpfung zweier Listen, so können wir die Signatur((list-of %a) (list-of %a) -> (list-of %a))
annehmen.
In der Praxis kann die Funktion jedoch eine beliebige Anzahl an Listen miteinander verknüpfen, die reale Signatur lautet daher:((list-of %a) ... -> (list-of %a))
Genau wie append
kann auch list
eine beliebige Anzahl an Übergabedaten erhalten,
die Signatur lautet daher wie folgt:
-
list
:(%a ... -> (list-of %a))
Quellen
- [1]: Listenerstellung Racket - Urheber: DOJ - Lizenz: inf-schule.de