Grundlagen der funktionsorientierten Programmierung mit SCHEME/Listen

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SchemeJS</language>
== Die Datenstruktur Liste ==

Mathematische Ausdrücke werden in Scheme als ''Listen'' dargestellt. Sie werden nach der Eingabe sofort evaluiert.

<run id="4c834e089b933">
(- (* 2.5 3) 0.5)
</run>

In Listen sollen nun Daten (auch mit verschiedenen Datentypen) verwaltet werden.
Dazu muss ihre Evaluation unterdrückt werden:

<run id="4c834e089ba79">
("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27)
</run>

<run id="4c834e089bbbb">
'("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27)
</run>

'''Merke:'''

Listen bilden eine ''universelle Datenstruktur'', mit der Daten gleicher oder unterschiedlicher Datentypen in einer ''definierten Reihenfolge'' verwaltet werden.<br />
Eine Liste kann leer sein. Leere Listen evaluieren zu sich selbst.<br />
Listen können ebenfalls Elemente von (verschachtelten) Listen sein.

'''Beispiele:'''

<table>
<tr>
<td><run id="4c834e089bcfd">'()</run></td>
<td><run id="4c834e089be42">'(a b 1 2.34 "Informatik")</run></td>
<td><run id="4c834e089bf87">'(a b (c d (e) f g) h i j k)</run></td>
</tr>
</table>

== Listenoperationen ==

Zur Verwaltung und Auswertung von Daten in dieser Datenstruktur sind geeignete Prozeduren notwendig:

<table border="1" cellspacing="1" cellpadding="4">
<tr>
<th width="100">&nbsp;</th>
<th width="100">Syntax</th>
<th width="680">Beispiele</th>
</tr>
<tr>
<th align="left" valign="top">Operator</th>
<td valign="top"><tt>append</tt></td>
<td><run id="4c834e089c0cd">(append '(0 1 2 3) '(4 5 6 7))</run></td>
</tr>
<tr>
<th align="left" valign="top">Prädikate</th>
<td valign="top"><tt>list?<br />null?</tt></td>
<td><run id="4c834e089c213">(list? '(a b 1 2.34 "Informatik"))</run><br /><run id="4c834e089c355">(null? '())</run></td>
</tr>
<tr>
<th align="left" valign="top">Konstruktoren</th>
<td valign="top"><tt>list<br />cons</tt></td>
<td><run id="4c834e089c497">(list 'a 'b 1 2.34 "Informatik")</run><br /><run id="4c834e089c5e2">(cons "Mustermann" '("Max" 02708 "Loebau"))</run></td>
</tr>
<tr>
<th align="left" valign="top">Selektoren</th>
<td valign="top"><tt>car, cdr</tt> <sup>1)</sup><br />
                 <tt>cadr, cddr<br />caddr, cdddr<br />...</tt></td>
<td><run id="4c834e089c72b">(car '("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27))</run><br />
    <run id="4c834e089c876">(cdr '("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27))</run><br />
    <run id="505eb29db532b"> (cadr '("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27))</run></td>
</tr>
<tr>
<th align="left" valign="top">Sonderform</th>
<td valign="top"><tt>quote</tt></td>
<td><run id="4c834e089c9da">(quote ("Mustermann" "Max" 02708 "Loebau" "Zittauer Str." 27))</run></td>
</tr>
</table>

<sup>1)</sup> Die Sprachelemente <tt>car</tt> und <tt>cdr</tt> (sprich: "kudder") gehen auf frühe ''Lisp''-Implementationen zurück und bedeuten:<br />
* <tt>car</tt> ... <b>c</b>ontents of <b>a</b>ddress part of <b>r</b>egister,
* <tt>cdr</tt> ... <b>c</b>ontents of <b>d</b>ecrement part of <b>r</b>egister.

== Paare ==

Ein ''Paar'' ist die spezielle Repräsentation einer ''zweielementigen'' Liste.
Auf diese Datenstruktur sind ebenfalls Listenoperationen anwendbar:

<table>
<tr>
<td><run id="4c834e089cb22">(cons 'a 'b)</run></td>
<td><run id="4c834e089cc74">(car '(a . b))</run></td>
<td><run id="4c834e089cdbe">(cdr '(a . b))</run></td>
<td><run id="4c834e089cf0e">(pair? '(a . b))</run></td>
</tr>
</table>

'''Beachte:'''

<table>
<tr>
<td><run id="4c834e089d05e">(list? '(a . b))</run></td>
<td><run id="4c834e089d1af">(pair? '(a b))</run></td>
</tr>
</table>

== Aufgaben ==

Lösen Sie die nachfolgenden Aufgaben zunächst auf einem Blatt Papier.<br />
Überprüfen Sie dann ausgewählte Lösungen in dem jeweiligen Interaktionsfenster.

<ol>
<li>Geben Sie an:
<pre>
(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)
</pre>

<run id="4c83537c2e9a0">(cons 'a '())</run> 
</li>
<li>Geben Sie für den Zugriff auf die nachfolgenden Listen die erforderliche Syntax an. Ermitteln Sie:
<pre>
... 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 #\!))
</pre>

<run id="4c83537c2eaff">(... '(+ 1 2 3 4 5))</run>
</li>
<li>Gegeben sei die Definition des folgenden Datensatzes:

<code id="4c835c3c114f3">
(define datensatz 
  '("Lehmann" "Heinz" "02708" "Loebau" ("Bautzener Platz" 31) ("03585" 123456)))
</code>

Definieren Sie geeignete Variablen, so dass folgende Abfragen möglich werden:
<pre>
name       --> "Lehmann"

vorname    --> "Heinz"

plz        --> "02708"

ort        --> "Löbau"

strasse    --> "Bautzener Platz"

hausnummer --> 31

vorwahl    --> "03585"

telefon    --> 123456
</pre>

<code id="4c835c3c11623">(define name ...)</code>
<run id="4c835c3c1170d">name</run>
</li>
</ol>