Standards und Implementierungen
Scheme ist ein Standard (R5RS, R6RS, R7RS-small) mit vielen Implementierungen:
| Implementierung | Besonderheit |
|---|---|
| GNU Guile | Erweiterungssprache des GNU-Projekts, Basis von GNU Guix |
| Racket | Eigener Dialekt mit riesiger Bibliothek und DrRacket |
| Chez Scheme | Sehr schneller Compiler (Basis von Racket CS) |
| Chicken | Übersetzt nach C, viele Pakete ("Eggs") |
| Gambit | Native Programme, leichtgewichtig |
| MIT Scheme | Referenz aus SICP, Editor Edwin |
| Gauche | Skripting-Schwerpunkt |
| Chibi | Kleine R7RS-Implementierung zum Einbetten |
Portable Programme (R7RS)
R7RS-Programme beginnen mit einem import:
(import (scheme base) (scheme write))
(define (quadrat x) (* x x))
(display (quadrat 7))
(newline)In Guile gibt es für R7RS einen Schalter: guile --r7rs hallo.scm.
Typische Hilfsfunktionen selbst bauen
Wer portabel bleiben will, schreibt kleine Hilfen selbst:
(define (zeige x) (display x) (newline))
(define (bereich von bis)
(if (> von bis) '() (cons von (bereich (+ von 1) bis))))
(define (summe liste) (apply + liste))
(define (filtern p liste)
(cond ((null? liste) '())
((p (car liste)) (cons (car liste) (filtern p (cdr liste))))
(else (filtern p (cdr liste)))))
(define (zusammenfassen f start liste)
(if (null? liste) start (zusammenfassen f (f start (car liste)) (cdr liste))))
(define (flach liste)
(cond ((null? liste) '())
((pair? (car liste)) (append (flach (car liste)) (flach (cdr liste))))
(else (cons (car liste) (flach (cdr liste))))))
(zeige (bereich 1 10))
(zeige (summe (bereich 1 100)))
(zeige (filtern even? (bereich 1 10)))
(zeige (zusammenfassen * 1 (bereich 1 10)))
(zeige (flach '(1 (2 (3 4)) 5)))Ausgabe
(1 2 3 4 5 6 7 8 9 10) 5050 (2 4 6 8 10) 3628800 (1 2 3 4 5)
Testen ohne Bibliothek
(define bestanden 0)
(define fehler 0)
(define-syntax pruefe
(syntax-rules ()
((_ ausdruck erwartet)
(let ((ist ausdruck))
(if (equal? ist erwartet)
(begin (set! bestanden (+ bestanden 1)) (display "ok ") (write 'ausdruck) (newline))
(begin (set! fehler (+ fehler 1)) (display "FEHLER ") (write 'ausdruck) (display " => ") (write ist) (newline)))))))
(pruefe (+ 1 2) 3)
(pruefe (reverse '(1 2 3)) '(3 2 1))
(pruefe (string-append "a" "b") "ab")
(pruefe (* 2 2) 5)
(display bestanden) (display " bestanden, ") (display fehler) (display " fehlgeschlagen") (newline)Ausgabe
ok (+ 1 2) ok (reverse (quote (1 2 3))) ok (string-append "a" "b") FEHLER (* 2 2) => 4 3 bestanden, 1 fehlgeschlagen
Merke
- Scheme ist ein Standard mit vielen Implementierungen (Guile, Racket, Chez, Chicken, ...)
- R7RS-small ist der aktuelle portable Standard
- Kleine Hilfsfunktionen und Makros ersetzen oft schwere Bibliotheken
- Guile eignet sich besonders als Skript- und Erweiterungssprache
Aufgabe
Installiere GNU Guix oder Chicken Scheme und führe ein Hello-World aus.