Grundlagen der funktionsorientierten Programmierung mit SCHEME/Datentypen

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
''Datentypen'' beschreiben den ''Wertebereich'' von Daten.<br />
Damit wird festgelegt, welche speziellen Operationen mit den Daten ausgeführt werden können.<br />

== Ausgewählte Datentypen in Scheme ==

<code id="4c76c650210dd" hidden>(require-extension (srfi 13))</code>

<table border="1" cellspacing="1" cellpadding="4">
<tr>
<th>&nbsp;</th>
<th>Zahlen</th>
<th>Zeichen</th>
<th>Zeichenketten</th>
<th>Wahrheitswerte</th>
</tr>
<tr>
<th align="left" valign="top">Beispiele</th>
<td valign="top"><tt>12<br />-0.25<br />3e-04<br />2/3</tt></td>
<td valign="top"><tt>#\a #\B<br />#\+<br />#\space<br />#\tab<br />#\newline</tt></td>
<td valign="top"><tt>"Informatik"<br />"Heute ist ein schoener Tag"<br />"12.03"<br />"(+ 1.5 2.3)"</tt></td>
<td valign="top"><tt>#t<br />#f</tt></td>
</tr>
<tr>
<th align="left" valign="top">Operatoren</th>
<td valign="top"><tt>+, -, *, /<br />expt<br />abs, sqr, sqrt<br />sin, cos, tan<br />asin, acos, atan</tt></td>
<td valign="top">&nbsp;</td>
<td valign="top"><tt>string-append<br />string-length</tt></td>
<td valign="top"><tt>not, and, or</tt></td>
</tr>
<tr>
<th align="left" valign="top">Prädikate</th>
<td valign="top"><tt>number?</tt></td>
<td valign="top"><tt>char?<br />char=?<br />char<?</tt></td>
<td valign="top"><tt>string?<br />string=?<br />string<?</tt></td>
<td valign="top">&nbsp;</td>
</tr>
<tr>
<th align="left" valign="top">Konstruktoren</th>
<td valign="top">&nbsp;</td>
<td valign="top">&nbsp;</td>
<td valign="top"><tt>string</tt></td>
<td valign="top">&nbsp;</td>
</tr>
<tr>
<th align="left" valign="top">Selektoren</th>
<td valign="top">&nbsp;</td>
<td valign="top">&nbsp;</td>
<td valign="top"><tt>string-ref<br />substring</tt></td>
<td valign="top">&nbsp;</td>
</tr>
<tr>
<th align="left" valign="top">Anwendungen</th>
<td valign="top">
<eval id="4c76c0a04fb1c">(+ 2/3 4/5)</eval>
<eval id="4c76cc4792ae6">(expt -3 4)</eval>
</td>
<td valign="top">
<eval id="4c913ce3b4af8">(char? #\B)</eval>
<eval id="4c913ce3b4c59">(char<? #\k #\b)</eval>
</td>
<td valign="top">
<eval id="4ca256b632e13">(string #\D #\u)</eval>
<eval id="4ca256b632f7e">(substring "Kurs" 1 3)</eval>
</td>
<td valign="top">
<eval id="4c836d2799ac7">(< 4 1)</eval>
<eval id="4c836d2799c1e">(>= 4 1)</eval>
</td>
</tr>
</table>

Zusätzlich gibt es Operatoren zur ''Konvertierung'' zwischen Daten unterschiedlicher Datentypen:

<eval id="4c76c2ae86ced">
(string->list "Informatik")
</eval>

<eval id="4c76c2ae86e1c">
(number->string 12.34)
</eval>

<eval id="4c76c2ae86f43">
(string->number "2/3")
</eval>

== Symbole ==

Mit der ''Quotierung'' kann die Evaluation von Ausdrücken unterdrückt werden:

<table>
<tr>
<td><eval id="4c82acbf5b4a0">hallo</eval></td>
<td><eval id="4c82acbf5b609">'hallo</eval></td>
</tr>
</table>

Damit wird zusätzlich die Definition eines Datentyps ''Symbol'' sinnvoll.<br />
Symbole sind nichtnumerische und nichtstrukturierte (d.h. atomare) Ausdrücke, deren Evaluation mit <tt>quote</tt> unterdrückt wird.

'''Beispiele:'''

<table>
<tr>
<td><eval id="4c82acbf5b767">'x</eval></td>
<td><eval id="4c82acbf5b8c3">'11er</eval></td>
<td><eval id="4c82acbf5ba21">'|der Unterricht|</eval></td>
<td><eval id="4c82acbf5bb81">(quote Informatik)</eval></td>
</tr>
</table>

<table border="1" cellspacing="1" cellpadding="4">
<tr>
<th width="100">&nbsp;</th>
<th width="100">Syntax</th>
<th width="480">Beispiele</th>
</tr>
<tr>
<th align="left" valign="top">Prädikat</th>
<td valign="top"><tt>symbol?</tt></td>
<td><eval id="4c82acbf5bce5">(symbol? 'pi)</eval><br /><eval id="4c82acbf5be46">(symbol? '1)</eval></td>
</tr>
<tr>
<th align="left" valign="top">Konvertierungen</th>
<td valign="top"><tt>symbol->string<br />string->symbol</tt></td>
<td><eval id="4c82acbf5bfa7">(symbol->string 'name)</eval><br /><eval id="4c82acbf5c103">(string->symbol "12")</eval></td>
</tr>
</table>

Wir wissen bereits aus der [[Grundlagen der funktionsorientierten Programmierung mit SCHEME/Einführung in die Kommunikation mit Scheme|Einführung in die Kommunikation mit Scheme]]:<br />
Mit <tt>define</tt> kann man an ein Symbol einen Wert binden.
Symbole, an die Werte gebunden sind, heißen ''Variablen''.

<eval id="4c82acbf5c260">
(define 11er "Wahlgrundkurs Informatik")
11er
</eval>

== Aufgaben ==

<ol>
<li>
Testen Sie die oben angegebenen Beispiele ausführlich.
</li>
<li>
Nachfolgend ist eine Prozedur zur universellen Datentypprüfung (''universal datacheck'') implementiert.<br />
Untersuchen Sie damit weitere Datentypen und -strukturen.

<code id="4c76cc4792989">
(define udc
  (lambda (struktur)
    (cond
      [(number? struktur) "Datentyp ZAHL!"]
      [(char? struktur) "Datentyp ZEICHEN!"]
      [(string? struktur) "Datentyp ZEICHENKETTE!"]
      [(symbol? struktur) "Datentyp SYMBOL!"]
      [(list? struktur) "Datenstruktur LISTE!"]
      [(pair? struktur) "Datenstruktur PAAR!"]
      [(procedure? struktur) "Datenstruktur PROZEDUR!"]      
      [else
       "Undefinierter Datentyp!"])))
</code>

<eval id="4c76cc479300d">
(udc sqrt)
</eval>
</li>
</ol>