Die Programmiersprache Scheme ist ein LISP-Dialekt. Es unterstützt sowohl funktionale als auch imperative Programmierung. Scheme liegt das Prinzip zugrunde, dass eine Programmiersprache nicht dadurch beschreibungsmächtig wird, dass man Feature über Feature häuft, sondern dadurch, dass man unnötige Einschränkungen entfernt. Z.B. gibt es im Scheme-Standard keine Hilfsmittel zur objektorientierten Programmierung, es ist aber dank Makros und λ-Ausdrücken sehr einfach, sich solche in der Sprache zu programmieren: Scheme ist eine programmierbare Programmiersprache, die von der Programmiererin bei Bedarf sehr flexibel erweitert werden kann.
Entwickelt wurde Scheme am Massachusetts Institute of Technology, wo auch die formale Spezifikation zur Verfügung steht, der so genannte Revised Report.
Sprachelemente
Kommentare
Kommentare werden durch ein Semikolon (;) eingeleitet.
Notation
Scheme verwendet die Präfixnotation. Beispielsweise schreibt man nicht (10 - 8) sondern (- 10 8).
Variablen
Variablen werden durch define, let und einigen anderen Anweisungen definiert, wobei durch eine Definition mit define globale Variablen entstehen (define darf nicht in Prozeduren verwendet werden).
(define var wert)
Variablen, die durch let definiert werden, sind nur innerhalb dieses Befehls gültig.
(let ([var1 wert1] [var2 wert2]) ... ; var1 und var2 sind nur innerhalb von let gültig ... )
Prozeduren
Prozeduren gehören zu den wichtigsten Sprachelementen von Scheme. In der Regel erstellt man sie mit dem lambda-Befehl. Prozeduren können durch define einer Variable zugeteilt werden.
Beispiel: Eine Prozedur mit zwei Argumenten
(define test (lambda (arg1 arg2) ... ))
Der lambda-Befehl kann auch weggelassen werden:
(define (test arg1 arg2) ...)
Aufgerufen wird diese Prozedur wie folgt:
(test wert1 wert2)
Prozeduren müssen generell mit zwei Klammern eingeschlossen werden. Der Rückgabewert wird durch die letzte gültige Anweisung bestimmt. Beachtlich dabei ist, dass Scheme automatisch den geeignetsten Datentyp wählt.
Man unterscheidet zwei Arten von Prozeduren: Diejenigen, die durch den Programmierer erstellt werden, und jene, die bereits vordefiniert sind (set!, car, cdr, +, -, *, /). Diese vordefinierten Prozeduren können neu definiert werden, wie folgendes Beispiel zeigt:
(define + (lambda (x y) (- x y)))
+ würde jetzt nicht addieren, sondern subtrahieren.
Listen
Listen werden in Scheme-Programmen relativ häufig gebraucht. Eine leere Liste wird mit '() gebildet. Durch cons kann eine Liste erweitert werden. Das ' gibt Scheme an, dass der nachfolgende Ausdruck nicht interpretiert werden soll, sondern dass eine Liste dargestellt wird.
Beispiel:
(cons 5 '())
(cons 1 (cons 2 (cons 3 (cons 4 '()))))
Dies kann wie folgt abgekürzt werden :
(list 1 2 3 4)
Listen in Scheme sind mit binären Bäumen vergleichbar. Die rechte Seite wird mit car dargestellt, die linke Seite mit cdr (sprich: „cudder“). Durch die Anwendung mit car erhält man für gewöhnlich einen Wert; cdr enthält einen Zeiger auf das nächste Element oder auf die leere Liste.
Beispiel:
(car '(1 2 3 4)) ;ergibt als Ausgabe: 1
(cdr '(1 2 3 4)) ;ergibt als Ausgabe: (2 3 4)
Datentypen
Weitere Datentypen neben Listen sind unter anderem:
- integer (ganze Zahlen)
- rational (Brüche
- real (Kommazahlen)
- complex (komplexe Zahlen)
- symbol
- string (Zeichenkette)
- port
Wahr und falsch werden durch #t und #f dargestellt, wobei Scheme jedoch nur #f als wirklich falsch interpretiert würde; alles andere – auch leere Listen – gelten als wahr.
Bedingungen
If:
If wertet einen Befehl oder einen Wert aus, und führt je nach Ergebnis (#t oder #f) eine entsprechende Anweisung aus.
(if (= wert #t) (display "Der Wert ist wahr") (display "Der Wert ist falsch"))
Cond:
Mit Cond ist es möglich mehrere Fälle abzufangen. Trifft keiner dieser Fälle ein, so wird eine else-Behandlung für alle sonstigen Möglichkeiten eingeleitet.
(cond ((= wert 1) (display "Der Wert ist 1")) ((= wert 2) (display "Der Wert ist 2")) (else (display "Der Wert ist weder 1 noch 2)))
Darüber hinaus gibt es noch when und case als weitere Möglichkeit, um mit Bedingungen zu arbeiten.
Schleifen
Schleifen werden in Scheme für gewöhnlich durch eine Rekursion erreicht. Ein häufiges gezeigtes Beispiel, um dies zu demonstrieren, ist die Berechnung der Fakultät.
(define fak (lambda (x) (if (= x 0) 1 (* x (fak (- x 1))))))
Beispiele
Scheme-Quellcode kann in folgenden Wikipedia-Artikeln gefunden werden:
Hallo Welt, Türme von Hanoi, ...
Literatur
- Abelson, Sussman: Structure and Interpretation of Computer Programs, McGraw-Hill, ISBN 0070004226
- Abelson, Sussman: Struktur und Interpretation von Computerprogrammen, Springer-Verlag, ISBN 3540423427
- Klaeren, Sperber: Vom Problem zum Programm, Teubner, ISBN 3-519-22242-6
- Friedman, Felleisen: The Little Schemer, The MIT Press, ISBN 0-262-56099-2
- Friedman, Felleisen: The Seasoned Schemer, The MIT Press, ISBN 0-262-56100-X
Weblinks
- schemers.org
- Scheme Requests for Implementation (SRFI)
- Structure and Interpretation of Computer Programs (SICP) - Dieses Scheme Buch wird in Einsteiger Programmierkursen am MIT und anderen Universitäten verwendet
- HowTo Design Programms - Einsteiger Scheme Buch