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übersetzungDas 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
So führst du den Code aus: Datei hallo.scm speichern und mit guile hallo.scm ausführen (GNU Guile von gnu.org/software/guile; weitere Implementierungen: Chez, Chicken, Gambit, Racket).
Merke
- Scheme ist ein kleiner Lisp-Dialekt: alles sind Ausdrücke in Klammern
definebindet Namen,lambdaerzeugt Funktionen,let/let*/letreclokale Werte- Zahlen: Ganzzahlen beliebiger Größe, exakte Brüche, Fließkommazahlen
displaygibt aus,newlinebeendet die Zeile
Aufgabe
Schreibe eine Funktion kreisflaeche, die π mit (* 4 (atan 1)) berechnet.