Listen
Inhaltsverzeichnis |
Die Datenstruktur Liste
Mathematische Ausdrücke werden in Scheme als Listen dargestellt. Sie werden nach der Eingabe sofort evaluiert.
<eval id="4c834e089b933"> (- (* 2.5 3) 1/2) </eval>
In Listen sollen nun Daten (auch mit verschiedenen Datentypen) verwaltet werden. Dazu muss ihre Evaluation unterdrückt werden:
<eval id="4c834e089ba79"> ("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27) </eval>
<eval id="4c834e089bbbb"> '("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27) </eval>
Merke:
Listen bilden eine universelle Datenstruktur, mit der Daten gleicher oder unterschiedlicher Datentypen in einer definierten Reihenfolge verwaltet werden.
Eine Liste kann leer sein. Leere Listen evaluieren zu sich selbst.
Listen können ebenfalls Elemente von (verschachtelten) Listen sein.
Beispiele:
| <eval id="4c834e089bcfd">'()</eval> | <eval id="4c834e089be42">'(a b 1 2.34 "Informatik")</eval> | <eval id="4c834e089bf87">'(a b (c d (e) f g) h i j k)</eval> |
Listenoperationen
Zur Verwaltung und Auswertung von Daten in dieser Datenstruktur sind geeignete Prozeduren notwendig:
| Syntax | Beispiele | |
|---|---|---|
| Operator | append | <eval id="4c834e089c0cd">(append '(0 1 2 3) '(4 5 6 7))</eval> |
| Prädikate | list? null? |
<eval id="4c834e089c213">(list? '(a b 1 2.34 "Informatik"))</eval> <eval id="4c834e089c355">(null? '())</eval> |
| Konstruktoren | list cons |
<eval id="4c834e089c497">(list 'a 'b 1 2.34 "Informatik")</eval> <eval id="4c834e089c5e2">(cons "Mustermann" '("Max" 02708 "Loebau"))</eval> |
| Selektoren | car, cdr 1)cadr, cddr | <eval id="4c834e089c72b">(car '("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27))</eval> <eval id="4c834e089c876">(cdr '("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27))</eval> |
| Sonderform | quote | <eval id="4c834e089c9da">(quote ("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27))</eval> |
1) Die Sprachelemente car und cdr (sprich: "kudder") gehen auf frühe Lisp-Implementationen zurück und bedeuten:
- car ... contents of address part of register,
- cdr ... contents of decrement part of register.
Paare
Ein Paar ist die spezielle Repräsentation einer zweielementigen Liste. Auf diese Datenstruktur sind ebenfalls Listenoperationen anwendbar:
| <eval id="4c834e089cb22">(cons 'a 'b)</eval> | <eval id="4c834e089cc74">(car '(a . b))</eval> | <eval id="4c834e089cdbe">(cdr '(a . b))</eval> | <eval id="4c834e089cf0e">(pair? '(a . b))</eval> |
Beachte:
| <eval id="4c834e089d05e">(list? '(a . b))</eval> | <eval id="4c834e089d1af">(pair? '(a b))</eval> |
Aufgaben
Lösen Sie die nachfolgenden Aufgaben zunächst auf einem Blatt Papier.
Überprüfen Sie dann ausgewählte Lösungen in dem jeweiligen Interaktionsfenster.
- Geben Sie an:
(cons 'a '()) (cons '(a) '(b c d)) (cons "a" '(b c)) (cons 'a 3) (cons '(a b) 'c) (car '(a b c)) (car '((a) b c d)) (car '()) (cdr '((a) b c d)) (cdr '(1 . 2)) (cdr '()) (list? '(a b c)) (list? '()) (pair? (list 'a 'b)) (list? x)<eval id="4c83537c2e9a0">(cons 'a '())</eval>
- Geben Sie für den Zugriff auf die nachfolgenden Listen die erforderliche Syntax an. Ermitteln Sie:
... die Zahl 1 in (+ 1 2 3 4 5) ... die Zahl 5 in (+ 1 2 3 4 5) ... das Symbol für die Addition in (* 3 (+ 8 9)) ... die Zahl 9 in (* 3 (+ 8 9)) ... das Ausrufezeichen in (string-append "Hallo " (string #\O #\t #\t #\o #\!))<eval id="4c83537c2eaff">(... '(+ 1 2 3 4 5))</eval>
- Gegeben sei die Definition des folgenden Datensatzes:
Definieren Sie geeignete Variablen, so dass folgende Abfragen möglich werden:
name --> "Lehmann" vorname --> "Heinz" plz --> "02708" ort --> "Löbau" strasse --> "Bautzener Platz" hausnummer --> 31 vorwahl --> "03585" telefon --> 123456<eval id="4c835c3c1170d">name</eval>