[Informatik-Seminar WS2004/05] [Inhalt] [Zurück] [Weiter]


2. Scheme, ein LISP Dialekt

In diesem Kapitel wird der Einfluss durch LISP auf die Sprache Scheme erläutert. Dabei geht es um die grundlegenden Eigenschaften. Die genaue Semantik und Syntax von Scheme wird in den folgenden Kapiteln erläutert.

Hier werden nur die Elemente der Sprachen erklärt, die für eine funktionale Programmierung notwendig sind. Scheme ermöglicht z.B. auch das erneute Zuweisen eines Wertes an eine Variable mittels set!. Dies widerspricht den Grundsätzen der funktionalen Programmierung.

2.1 Entstehung von LISP und Scheme

2.2 Der Einfluss durch LISP: Alles ist eine Liste

2.3 Eine einfache Darstellung der Syntax

2.4 Auswertungsregeln

2.1 Entstehung von LISP und Scheme

2.2 Der Einfluss durch LISP: Alles ist eine Liste

LISP ist eine Sprache, die als einzige Datenstruktur die Liste verwendet. Sowohl der Programmcode, als auch die Daten, werden in Form von Listen dargestellt.

Ein Scheme Programm besteht also nur aus Listen. Hier schon mal zwei  Beispiele: Eine Liste wird durch zwei Klammern und dessen Inhalt dargestellt. Dies ist eine Liste mit vier Elementen.

(1 2 3 4)

Ein Funktionsaufruf ist ebenfalls eine Liste. Das erste Element ist der Funktionsname, die restlichen Elemente sind die Argumente.

(func arg1 arg2 arg3)

Eine Funktion, die die Fakultät einer Zahl errechnet, sieht so aus: Man erkennt hier, dass die Darstellung in Form von Listen, die wiederum Listen enthalten, ausreichend ist.

(define fak
  (lambda (x)
    (if (= x 0)
      1
      (* x (fak (- x 1))))))

2.3 Eine einfache Darstellung der Syntax

In Scheme (und LISP) sind alle Programme und Daten Ausdrücke. Dabei gibt es zwei Arten von Ausdrücken: Atomare (einfache) und Kombinierte (z.B. Listen). Atomare Ausdrücke sind z.B. Nummern oder Strings. Diese stehen jeweils für einen Wert. Kombinierte Typen sind z.B. Listen oder Vektoren.

Die vereinfachte Syntax von Scheme lässt sich so beschreiben:

expression          -> simpledatum | compounddata
simpledatum         -> number | string | identifier | character | boolean
compounddata        -> '('expression-sequence')'
expression-sequence -> expression expression-sequence | expression

2.4 Auswertungsregeln

Weil Programme Beschreibungen von Ausdrücken sind, muss es Regeln geben nach denen das Programm ausgewertet wird. Dabei befolgt Scheme diese drei Regeln:

  1. Konstante Daten, wie Zahlen und Strings, werten sich selbst aus.
  2. Variablen werden in der Symbol-Tabelle gesucht und durch den entsprechenden Wert ersetzt.
  3. Eine Liste muss als erstes immer einen Bezeichner für eine Funktion enthalten. Diese Funktion wird bei der Auswertung auf die folgenden Ausdrücke angewendet.

Aus diesen Regeln ergibt sich, dass alle Ausdrücke als Präfix geschrieben werden müssen. Weiterhin wird deutlich, dass der Bezeichner für eine Funktion klar von dem Aufruf der Funktion getrennt sein muss. Eine Funktion kann also auch Argument oder Ergebnis sein.

Die folgende Grafik stellt die drei Auswertungsregeln in einem Flussdiagram dar:

Beispiele für verschiedene Ausdrücke und deren Werte:

42 => 42

"Hallo" => Hallo

(1 2) => Fehler, weil 1 keine Funktion ist

(quote (1 2)) => (1 2)

(+ 4 5) => 9

(* (+ 1 2) 3 ) => (* 3 3) => 9

+ => #<primitive:+>


[Informatik-Seminar WS2004/05] [Inhalt] [Zurück] [Weiter] [Seitenanfang]