Listen

Aus ProgrammingWiki
Archivierte Version vom 2011-01-10T19:03:42+00:00. Aktuelle Version

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"))<br><eval id="4c834e089c355">(null? '())</eval></eval>
Konstruktoren list
cons
<eval id="4c834e089c497">(list 'a 'b 1 2.34 "Informatik")<br><eval id="4c834e089c5e2">(cons "Mustermann" '("Max" 02708 "Loebau"))</eval></eval>
Selektoren car, cdr 1)
                cadr, cddr
caddr, cdddr
...
<eval id="4c834e089c72b">(car '("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27))<br> <pre> <eval id="4c834e089c876">(cdr '("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27))</eval></pre></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.

  1. 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>

  2. 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>

  3. 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>