EMZETT.
Login

Kurz: Scheme (1975, Guy Steele und Gerald Sussman am MIT) ist ein bewusst kleiner Dialekt von Lisp. Der gesamte Sprachkern passt auf wenige Seiten, hat aber alles Wesentliche.

Teil des Kurses Scheme

Kapitel 1 von 8 im Kurs Scheme. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Was ist Scheme?

Scheme (1975, Guy Steele und Gerald Sussman am MIT) ist ein bewusst kleiner Dialekt von Lisp. Der gesamte Sprachkern passt auf wenige Seiten, hat aber alles Wesentliche: Funktionen erster Klasse, Closures, Endrekursion, Makros (syntax-rules) und Continuations. Das Lehrbuch Structure and Interpretation of Computer Programs (SICP) hat Generationen von Informatikern mit Scheme unterrichtet.

Es gibt viele Implementierungen (Guile, Chez, Chicken, Gambit, Racket, MIT Scheme). Dieser Kurs nutzt GNU Guile, die Erweiterungssprache des GNU-Projekts (verwendet z. B. in GNU Guix, dem funktionalen Paketmanager). Standards: R5RS, R6RS und R7RS.

Ausführen

guile hallo.scm                 # Skript ausführen
guile                           # interaktive Konsole (REPL)
guile -c '(display (+ 1 2))'    # Einzeiler
guile --no-auto-compile x.scm   # ohne Zwischenübersetzung

Das erste Programm

(display "Hallo, Welt!")
(newline)
(display (+ 1 2))
(newline)
(write "write zeigt Anführungszeichen")
(newline)
(display (list 1 "zwei" 'drei 4.5))
(newline)
(write (list 1 "zwei" 'drei #\x))
(newline)
(define name "Mia")
(display (string-append "Hallo, " name "!"))
(newline)

Ausgabe:

Hallo, Welt!
3
"write zeigt Anf\xfchrungszeichen"
(1 zwei drei 4.5)
(1 "zwei" drei #\x)
Hallo, Mia!

Alles in Scheme ist ein Ausdruck in Klammern: (operator operand1 operand2 ...). display gibt lesbar aus, write im Quelltext-Format.

Zahlen

Scheme hat einen numerischen Turm aus Ganzzahlen beliebiger Größe, Brüchen, reellen und komplexen Zahlen:

(define (zeige x) (display x) (newline))
(zeige (+ 1 2 3))
(zeige (/ 10 4))
(zeige (/ 10.0 4))
(zeige (quotient 17 5))
(zeige (remainder 17 5))
(zeige (modulo -7 3))
(zeige (expt 2 100))
(zeige (sqrt 16))
(zeige (exact->inexact 1/3))
(zeige (round 2.5))
(zeige (floor 2.7))
(zeige (truncate -2.7))
(zeige (max 3 9 4))
(zeige (abs -5))
(zeige (number->string 255 16))
(zeige (string->number "42"))
(zeige (inexact->exact (floor 3.9)))
(zeige (list (integer? 3.0) (rational? 1/3) (exact? 1/3) (inexact? 0.5)))
(zeige (+ 1/3 1/6))
(zeige (gcd 48 18))
(zeige (lcm 4 6))

Ausgabe:

6
5/2
2.5
3
2
2
1267650600228229401496703205376
4
0.3333333333333333
2.0
2.0
-2.0
9
5
ff
42
3
(#t #t #t #t)
1/2
6
12

Definitionen und Funktionen

(define (zeige x) (display x) (newline))
(define alter 17)
(define (quadrat x) (* x x))
(define verdopple (lambda (x) (* 2 x)))
(define (begruesse name) (string-append "Hallo, " name "!"))
(define (summe . zahlen) (apply + zahlen))
 
(zeige (quadrat 7))
(zeige (verdopple 21))
(zeige (begruesse "Mia"))
(zeige (summe 1 2 3 4))
 
(let ((a 2) (b 3))
  (zeige (+ a b)))
 
(let* ((x 5) (y (* x 2)))
  (zeige (list x y)))
 
(letrec ((gerade? (lambda (n) (if (= n 0) #t (ungerade? (- n 1)))))
         (ungerade? (lambda (n) (if (= n 0) #f (gerade? (- n 1))))))
  (zeige (gerade? 100)))
 
(call-with-values (lambda () (values 1 2)) (lambda (a b) (zeige (+ a b))))

Ausgabe:

49
42
Hallo, Mia!
10
5
(5 10)
#t
3

Merke

  • Scheme ist ein kleiner Lisp-Dialekt: alles sind Ausdrücke in Klammern
  • define bindet Namen, lambda erzeugt Funktionen, let/let*/letrec lokale Werte
  • Zahlen: Ganzzahlen beliebiger Größe, exakte Brüche, Fließkommazahlen
  • display gibt aus, newline beendet die Zeile

Übungsaufgabe

Schreibe eine Funktion kreisflaeche, die π mit (* 4 (atan 1)) berechnet.

Quiz zur Selbstkontrolle

Weiter im Kurs

Weiter: Kontrollfluss, Listen und Rekursion

Alle Kapitel: Scheme im Überblick