April 10, 2003
23, 42, 189473248732424
1/3, 2390874/132948576
inkorrekt: 2390874 /132948576
(enthält Leerzeichen)
0.3, 3.1415926, 6.02e23, -.738E-17
Hinweis: Solche Zahlen werden im allgemeinen nur mit beschränkter Genauigkeit dargestellt.
Ein Leerzeichen oder ein Zeilenumbruch ist notwendig, um zwei Wörter, die nebeneinander stehen, voneinander zu trennen.
Sie sind außerdem zulässig (aber nicht notwendig) vor und nach Klammern. Ansonsten haben zusätzliche Leerzeichen und Zeilenumbrüche keine Auswirkungen auf die Bedeutung eines Programms.
Linke Klammern und rechte Klammern müssen in Zahl und Art übereinstimmen.
Hinweis: Klammern haben immer Bedeutung in einem Programm. Es nicht erlaubt, Klammernpaare hinzuzufügen oder wegzulassen, auch wenn die Bedeutung vorher und nachher "`intuitiv"' gleich ist.
Namen können aus folgenden Bestandteilen bestehen:
Buchstaben
Bindestriche
Unterstriche
die Zeichen +
, *
, /
, =
, >
,
<
, ?
, &
, :
Ziffern, sofern sie nicht an erster Stelle vorkommen
Folgende Bestandteile dürfen nicht vorkommen:
Klammern (egal welcher Art)
Semikolon
Komma
Anführungszeichen (egal welcher Art)
Leerzeichen
Korrekte Beispiele:
+, *, /, usw.
sqrt (vordefiniert)
true (vordefiniert)
a-number (Komposita werden konventionsmäßig mit Bindestrichen geschrieben)
aNumber (wenn auch konventionswidrig)
a_number (wenn auch konventionswidrig)
number->string (vordefinier)
cons? (vordefiniert)
Inkorrekte Beispiele:
define, cond, define-struct, else (weil Schlüsselwörter)
1+ (weil beginnend mit einer Ziffer)
Alles, was auf einer Zeile nach einem Semikolon (das nicht innerhalb einer Zeichenkette steht) folgt, wird von Scheme ignoriert und kann damit als Kommentar dienen.
Beispiel:
(define pi 3.14159265) ; wichtige Konstante
Symbole folgen den gleichen Buchstabierungsregeln wie Namen, nur mit einem Apostroph (gesprochen "`Quote"') davor.
Beispiele:
'+
'yes
'correct
'maybe
Hinweis: Es gibt keine besondere Verbindung zwischen
dem Symbol 'yes
(einem ganz normalen Wert) und einer eventuell
definierten Variable namens yes.
Eine Zeichenkette repräsentiert ein Stück beliebigen Text. Der Text
wird dafür zwischen doppelte Anführungszeichen gesetzt. Eventuell
darin vorkommende doppelte Anführungszeichen werden als \"
dargestellt; eventuell vorkommende \
werden als \\
dargestellt. Beispiele:
"foo"
"Das Prinzip \"Hoffnung\""
"Kommt ein Backslash geflogen, \\ ..."
Der Ausdruck
(f esb0 esb1 ... esbn)
ist eine Anwendung (oder ein Aufruf) der Funktion f auf die Ergebnisse der Ausdrücke e0, e1, ..., en. Beispiele:
(+ 1 2) ist die Anwendung der Funktion +
auf die
Werte 1 und 2 -- das Ergebnis ist die Summe der beiden Zahlen.
(* (+ 3 4) 5) ist die Anwendung der Funktion *
auf zwei Zahlen: das Ergebnis von (+ 3 4) (7) und die Zahl
5, also insgesamt 35.
(= x y) ist die Anwendung der Funktion =
auf die
Werte der Variablen x und y. Dabei kommt
true oder false heraus, je nachdem, ob die beiden
Werte (numerisch) gleich sind oder nicht.
Hinweise:
Die Funktion bzw. der Operator steht immer vorn, nie dazwischen wie bei vielen Operationen in der Mathematik.
Die Klammern sind zwingend erforderlich.
Zusätzliche Klammern sind nicht zulässig.
Inkorrekte Beispiele:
(1 + 2) (Der Operator steht nicht vorn)
+ 1 2 (Klammern fehlen)
((+ 1 2)) (zusätzliche Klammern)
(define v e)
definiert die Variable v auf den Wert des Ausdrucks e, so daß zukünftige Vorkommen von v durch den Wert von e ersetzt werden.
Beispiele:
(define number 121243234)
Nach dieser Definition wird number durch die Zahl 121243234
ersetzt.
(define (f psb1 psb1 ...psbn) e)
definiert die Funktion f. Jeder Parameter pi ist ein Variablenname, und diese Variablen können innerhalb des Rumpfes e verwendet werden.
Beispiele:
(define (square n) (* n n))
oder
(define (square n) (* n n))
Nach dieser Definition liefert z.B. (square 5) den Wert 25: (square 5) wird durch den Rumpf (* n n) ersetzt, wobei 5 für n eingesetzt wird.
(cond (qsb1 asb1) (qsb2 asb2) ...(qsbn asbn))
Dieser Ausdruck gibt den Wert einer der ai zurück, je nachdem welcher der Ausdrücke qi (die jeweils einen Wahrheitswert ergeben müssen) der erste ist, der true ergibt. Statt der letzten Frage qn kann auch das Schlüsselwort else erscheinen, was besagt, daß der Ausdruck an ergeben soll, wenn keine der Fragen true ergeben hat.
Beispiel:
(cond ((> temperatur 35) 'heiss) ((> temperatur 25) 'warm) ((> temperatur 15) 'mittel) (else 'kalt))
Hinweise:
Jede Klausel muß von einem Klammernpaar umschlossen werden.
Jede Klausel muß genau zwei Ausdrücke (Frage und Antwort) enthalten.
Inkorrekte Beispiele:
(cond (< number 4) 5 (>= number 4) 6)
Hier fehlen Klammern um die Klauseln.
(cond ((+ bignum 4) 5) ((- bignum 4) 6))
In diesem Fall ergeben die Fragen keine Wahrheitswerte.
(define-struct n (fsb1 fsb2 ... fsbn))
Dabei ist n der Name der Struktur und die fi (ihrerseits Namen) sind Felder. Diese Strukturdefinition definiert mehrere Funktionen auf einmal:
(make-n v1 v2 ...vn)
erzeugt ein Objekt vom Struktur-Typ n, in dem die Felder f1,
f2, ..., fn mit den Werten v1,
v2, ..., vn besetzt sind.
(n? v) stellt fest, ob das (beliebige) Objekt v eine Struktur vom Typ n ist oder nicht, und gibt entsprechend true oder false zurück.
(v-fi s) liefert für eine Struktur s vom Typ n den Inhalt von Feld fi.
Die Funktion make-n heißt Konstruktor, die Funktion n? heißt Prädikat, und die die v-fi heißen Selektoren. Beispiel:
;; Ein Name besteht aus zwei Symbolen - Vor- und Nachname (define-struct name (personal family)) ;; make-name: symbol x symbol -> name ;; name?: object -> boolean ;; name-personal: name -> symbol ;; name-family: name -> symbol
Ein syntaktisches Schlüsselwort nach einer öffnenden Klammer bedeutet, daß zwischen den Klammern kein Funktionsaufruf, sondern eine Spezialform steht, bei der besondere Regeln gelten. Die syntaktischen Schlüsselwörter in rudimentärem Scheme sind define, cond, else und define-struct. (Erläuterungen im vorangegangenen Abschnitt.)
+, -, *, / (...)
sqrt liefert die Wurzel einer Zahl
remainder liefert den Divisionsrest zweier Zahlen
pi (3.1415...)
e (2.7182...)
true steht für "`wahr"', false für "`falsch"'
<
, <=
, >
, >=
, =
akzeptieren
jeweils zwei Zahlen als Eingabe und liefern einen Wahrheitswert
zero?, positive?, negative? akzeptieren jeweils eine Zahl als Eingabe und liefern einen Wahrheitswert.
equal? nimmt zwei Objekte (gleich welchen Typs) als Eingaben und liefert einen Wahrheitswert
and, or, not sind die entsprechenden Operationen auf Wahrheitswerten
Beispiele:
(or (<= 1 3) (zero? 5)) => true (and (<= 1 3) (zero? 5)) => false (and (<= 1 3) (not (zero? 5))) => true
empty ist ein vordefinierter Name für die leere Liste
cons nimmt ein beliebiges Objekt und eine Liste als Eingaben, und liefert eine neue Liste zurück, deren erstes Element das Objekt, und dessen Rest die Eingabeliste ist.
first nimmt eine nichtleere Liste als Eingabe und liefert deren erstes Element.
rest nimmt eine nichtleere Liste als Eingabe und liefert deren Rest, also eine Liste, bei der gegenüber der Eingabe das erste Element fehlt.
empty? akzeptiert ein Objekt als Eingabe und liefert einen Wahrheitswert, der angibt, ob es sich dabei um die leere Liste handelt.
cons? akzeptiert ein Objekt als Eingabe und liefert einen Wahrheitswert, der angibt, ob es sich dabei um eine nichtleere Liste handelt.
Beispiele:
(cons 'element empty) => (cons 'element empty) (define pizza-toppings (cons 'anchovies (cons 'salami (cons 'gummi empty)))) pizza-toppings => (cons 'anchovies (cons 'salami (cons 'gummi empty))) (first pizza-toppings) => 'anchovies (rest pizza-toppings) => (cons 'salami (cons 'gummi empty)) (first (rest pizza-toppings)) => 'salami (empty? pizza-toppings) => false (cons? pizza-toppings) => true (empty? (rest (rest (rest pizza-toppings)))) => true
error akzeptiert eine Zeichenkette als Eingabe und bricht die Programmausführung unter Anzeige des enthaltenen Textes an.