www.wikidata.de-de.nina.az
Dieser Artikel behandelt die Programmiersprache Fur die Bedeutung des alemannischen Wortes Scheme fur Maske siehe Larve Maske Die Programmiersprache Scheme ist eine Lisp Variante Sie ist funktional unterstutzt jedoch auch andere Programmierparadigmen z B imperative Programmierung SchemeBasisdatenParadigmen Multi Paradigma funktional prozedural metaErscheinungsjahr 1975Designer Guy Lewis Steele junior Gerald Jay SussmanEntwickler Guy L Steele und Gerald Jay SussmanAktuelle Version R7RS ratified standard 2013 Typisierung stark dynamischWichtige Implementierungen viele z B MIT GNU SchemeBeeinflusst von Lisp ALGOL MDLBeeinflusste Common Lisp JavaScript R Ruby Dylan Lua Racket Snap BYOBwww scheme reports orgScheme zeichnet sich dadurch aus dass nur wenige Programmierkonzepte durch die Syntax vorgegeben sind In Scheme gibt es daher mehr Moglichkeiten ein Programm zu beschreiben als in vielen anderen Programmiersprachen Beispielsweise gibt es im Scheme Standard keine Hilfsmittel zur objektorientierten Programmierung solche konnen aber mittels Makros und l Ausdrucken in Scheme programmiert und zur objektorientierten Programmierung in Scheme verwendet werden Scheme ist eine programmierbare Programmiersprache Entwickelt wurde Scheme von Gerald Jay Sussman und Guy Lewis Steele Jr am Massachusetts Institute of Technology wo auch die formale Spezifikation zur Verfugung steht der sogenannte Revised Report Die derzeit aktuelle Spezifikation ist R7RS 1 Inhaltsverzeichnis 1 Syntax und Semantik 2 Spezialform Lambda 3 Globale Definitionen 4 Lokale Bindungen 4 1 let 4 2 let 4 3 letrec und named let 4 4 define 5 Datentypen 5 1 Prozeduren 5 2 Paare und Listen 5 3 Weitere Datentypen 6 Fallunterscheidung 7 Schleifen 8 Kommentare 9 Vergleich zwischen Scheme und LISP 10 Implementierungen und Entwicklungswerkzeuge 11 Literatur 12 Weblinks 12 1 Einfuhrungen 12 2 Sprachstandards 13 EinzelnachweiseSyntax und Semantik BearbeitenDie Syntax von Scheme ist sehr regelmassig und einfach Grundlage ist eine vollstandig geklammerte Prafix Notation siehe auch Polnische Notation Ein Programm besteht aus Ausdrucken und Definitionen Ausdrucke sind entweder Literale oder zusammengesetzte Ausdrucke die einen Funktionsaufruf darstellen operator operand 1 operand 2 operand n Jedes Element eines zusammengesetzten Ausdrucks ist wieder ein Ausdruck Die Bedeutung oder Semantik von Ausdrucken ist uber ihre Auswertung definiert Die Bedeutung Semantik eines literalen Ausdrucks ist der konstante Wert des Ausdrucks Zum Beispiel hat die Zeichenfolge span class mi 2 span den Wert der Zahl 2 und die Zeichenfolge span class no t span hat den booleschen Wahrheitswert fur wahr Bei der Auswertung zusammengesetzter Ausdrucke muss der Ausdruck operator in Anlehnung an mathematische Operatoren zu einer Funktion auswerten Rechts des Operators stehen beliebig viele Operanden die wiederum einfache oder zusammengesetzte Formen sind Die Klammern sind damit von besonderer Bedeutung und konnen im Gegensatz zu den meisten anderen Programmiersprachen nicht beliebig gesetzt werden Die zusammengesetzte Form foo 42 etwa ist ein Ausdruck der auf semantischer Ebene den Aufruf der an die Variable foo gebundenen Funktion mit dem Argument 42 bedeutet Die Auswertung des Ausdrucks foo 42 dagegen fuhrt zu einem Fehler zur Laufzeit Bei 42 handelt es sich um eine zusammengesetzte Form und die Semantik sieht die Anwendung des Operators vor Da 42 allerdings eine Zahl und keine Funktion ist kommt es zu einem Fehler Ein Vorteil der vollstandig geklammerten Prafix Notation besteht darin dass diese Notation nur mit einer einzigen Prazedenz fur alle Operatoren auskommt Eine gangige Kritik an der Syntax von Scheme bezieht sich auf die hohe Zahl der Klammern die die Erstellung und Bearbeitung des Quelltextes erschweren Scheme Programmierer begegnen dieser Schwierigkeit indem sie Editoren verwenden die die Bearbeitung von Scheme Quelltexten in besonderer Weise unterstutzen zum Beispiel Emacs Zu diesen Hilfen zahlen die automatische Einruckung des Codes und die Markierung zusammengehoriger Klammerpaare wahrend des Editierens Einige Scheme Implementierungen wie zum Beispiel Racket erlauben abweichend vom Sprachstandard zusatzlich die Verwendung von eckigen Klammern Dadurch soll die Ubersichtlichkeit erhoht werden Beispiel let x 42 y 23 x y Spezialform Lambda BearbeitenDas Schlusselwort lambda leitet die Spezialform fur sogenannte Lambda Ausdrucke ein Ein Lambda Ausdruck wertet zu einer Prozedur aus die in Scheme ein Wert erster Klasse ist Prozeduren konnen damit wie Werte anderer Typen im Programm verwendet werden also etwa an Namen gebunden werden als Argumente bei einem Prozeduraufruf ubergeben werden oder von einer Prozedur zuruckgegeben werden Definition der Spezialform lambda lambda argument expression lambda x x x Bildet das Quadrat von x Aufruf der vom obigen Lambda Ausdruck erzeugten Prozedur lambda x x x 5 Bildet das Quadrat von 5 Ruckgabe 25 Der Name dieser Spezialform geht auf den Lambda Kalkul zuruck Globale Definitionen BearbeitenEine Definition mit dem Schlusselwort define bindet einen Wert an einen Namen Der Name ist global gebunden kann also an einer beliebigen Stelle im Programm nach der Definition verwendet werden Da Prozeduren in Scheme ebenfalls Werte sind konnen mit define auch globale Prozeduren definiert werden Im folgenden Code Abschnitt wird der Name a number an die Zahl 42 gebunden und anschliessend der Name square an eine Funktion die eine Zahl quadriert define a number 42 define square lambda x x x Zur Definition globaler Prozeduren kann auch eine vereinfachte Notation verwendet werden bei der der lambda Ausdruck weggelassen wird Obige Definition von square kann in abgekurzter Form wie folgt geschrieben werden define square x x x Ein Beispiel dafur dass eine Funktion eine andere Funktion zuruckgeben kann liefert folgender Ausdruck define sum with x lambda y y x Der Parameter x der Funktion sum with bestimmt wie sich die zuruckgegebene Funktion verhalt Die zuruckgegebene Funktion addiert ein Argument y genau um den in sum with angegebenen Faktor x sum with 5 1 Ergebnis 6Lokale Bindungen BearbeitenDie Variablen und Funktionsdeklaration gestaltet sich in Scheme etwas anders als in konventionellen Programmiersprachen Zum einen mussen Variablen und Funktionen Prozeduren nicht an Bezeichner gebunden werden zum anderen geschieht die Deklaration uber Prozeduren es gibt keine gesonderten Schlusselworter Zur Deklaration stehen die Formen define und let zur Verfugung je nach Bedarf konnen anstelle von let auch die Variationen let und letrec verwendet werden let Bearbeiten let bindet mehrere Werte an die angegebenen Bezeichner Diese Bindungen sind nur innerhalb des Rumpfes von let sichtbar let hat die folgende Syntax let name 1 ausdruck 1 name 2 ausdruck 2 name n ausdruck n Rumpf des let Ausdrucks name 1 name n sind nur innerhalb des Rumpfes von let gebunden Die Ausdrucke ausdruck 1 bis ausdruck n werden in einer nicht spezifizierten Reihenfolge ausgewertet bevor die resultierenden Werte an die jeweiligen Namen gebunden werden Danach wird der Rumpf des let Ausdrucks ausgewertet Erst im Rumpf gelten die Bindungen name 1 bis name n Es ist insbesondere mit let nicht moglich im Ausdruck ausdruck i i i auf einen anderen Namen zuzugreifen der im selben let Ausdruck gebunden wird vgl let Der Wert des letzten Ausdrucks im Rumpf ergibt den Wert des gesamten let Ausdrucks Da die Auswertungsreihenfolge der Ausdrucke ausdruck i i i nicht festgelegt ist und theoretisch sogar alle Ausdrucke zeitgleich ausgewertet werden durfen spricht man auch von einem parallelen let Beispiele let a 3 b 10 12 c lambda n n 2 c a b gt 50 let a 1 let a 0 b a b gt 1 let ist eine vereinfachte Syntax die in einen Funktionsaufruf ubersetzt wird Beispiel let a 1 1 b 2 2 a b expandiert zu lambda a b a b 1 1 2 2 let Bearbeiten let hat dieselbe Syntax wie let und eine ahnliche Semantik Im Unterschied zu let ist bei let die Reihenfolge in der die Ausdrucke in den Name Ausdruck Paaren ausgewertet werden festgelegt Die Auswertung erfolgt von links nach rechts Man spricht daher auch von einem sequentiellen let Im Unterschied zu let kann in den Ausdrucken rechte Seiten der Name Ausdruck Paare auf die Namen der weiter links stehenden Bindungspaare zugegriffen werden Beispiel let a 1 let a 0 b a b gt 0 Wie let ist auch let eine vereinfachte Syntax und wird in verschachtelte Funktionsaufrufe ubersetzt let a 1 1 b a 1 a b expandiert zu lambda a lambda b a b a 1 1 1 letrec und named let Bearbeiten letrec Ausdrucke haben dieselbe Syntax wie let Ausdrucke Hinsichtlich der Sichtbarkeit der zu bindenden Namen gibt es jedoch einige Unterschiede Die Namen also die linken Seiten der Bindungspaare konnen in jedem Ausdruck der Bindungspaare verwendet werden Die vom let her bekannte Einschrankung dass sich die Namen in einem Ausdruck nur auf vorhergehende also weiter links stehende Namen beziehen konnen fallt also weg Insbesondere kann letrec zur Definition von lokalen rekursiven Funktionen verwendet werden Beispiel letrec sum lambda lst s if null lst s sum cdr lst s car lst sum list 1 2 3 0 gt 6 Es konnen auch wechselseitig rekursive Funktionen definiert werden letrec even lambda n if zero n t odd n 1 odd lambda n if zero n f even n 1 even 42 gt t Eine Variante von letrec ist das sogenannte named let das besonders zur Programmierung von Schleifen verwendet wird Die Syntax ist let name bindungen rumpf wobei bindungen die vom let her bekannten Paare aus Name und Ausdruck sind Der Rumpf des named let wird als Rumpf einer Prozedur mit dem Namen name verwendet die genau so viele Argumente hat wie Bindungspaare angegeben wurden Das named let ist ein Makro welches in den Aufruf dieser Prozedur name expandiert Als Argumente werden die rechten Seiten der Bindungspaare verwendet Das Beispiel fur letrec kann mit einem named let folgendermassen geschrieben werden let sum lst list 1 2 3 s 0 if null lst s sum cdr lst s car lst define Bearbeiten define wird meist benutzt um auf globaler Ebene Funktionen und Konstanten zu deklarieren aber es ist auch innerhalb des Rumpfes von Prozeduren verwendbar Die Sichtbarkeit der so gebundenen Variablen beschrankt sich auf den Rumpf in dem die Definition steht define die nicht auf globaler Ebene stehen werden interne Definitionen genannt und gelegentlich der besseren Lesbarkeit wegen anstatt eines letrec verwendet Die Syntax ist define bezeichner ausdruck Der Ausdruck darf sich auch rekursiv auf bezeichner beziehen In diesem Beispiel werden foo und bar intern definiert Beide Variablen sind nur innerhalb des Rumpfes des let Ausdrucks sichtbar let x 5 define foo y bar x y define bar a b a b a foo x 3 Obiger Code entspricht dieser Version mit letrec let x 5 letrec foo lambda y bar x y bar lambda a b a b a foo x 3 Datentypen BearbeitenProzeduren Bearbeiten Prozeduren gehoren zu den wichtigsten Sprachelementen von Scheme Sie konnen mit einem Lambda Ausdruck lambda beschrieben werden Da sie in Scheme wie jeder andere Datentyp behandelt werden ist es moglich sie mit let oder define an einen Bezeichner zu binden Beispiel Eine Prozedur mit zwei Argumenten define test lambda arg1 arg2 Es gibt eine vereinfachte Notation mit der der define und der lambda Ausdruck zusammengefasst werden konnen define test arg1 arg2 Aufgerufen wird diese Prozedur wie folgt test wert1 wert2 Prozeduraufrufe mussen generell mit zwei Klammern eingeschlossen werden Scheme betont die Rolle von Ausdrucken die einen Wert haben gegenuber Befehlen die etwas tun Deswegen ist es im Gegensatz zu vielen anderen Sprachen nicht notig den Ausdruck im Korper der Prozedurbeschreibung als Ruckgabewert zu markieren Im Gegenteil Es sind besondere Konstrukte wie begin notig um Anweisungen ohne Ruckgabe ihres Wertes auszufuhren Naturlich gibt es eine Reihe von vordefinierten Prozeduren wie cons car cdr lt Diese vordefinierten Prozeduren konnen neu definiert werden wie folgendes Beispiel zeigt define x y x y wurde jetzt nicht addieren sondern subtrahieren Dadurch dass die mathematischen Operatoren ebenfalls durch Prozeduren realisiert sind ergibt sich fur Berechnungen eine Prafixnotation Scheme kennt keine Operatorhierarchie alle Formeln sind eindeutig Paare und Listen Bearbeiten Listen werden in Scheme Programmen relativ haufig gebraucht Wichtigster Baustein fur Listen in Scheme sind Paare Ein Paar ist eine Datenstruktur die zwei beliebige Scheme Werte enthalt Mit cons wird ein neues Paar erzeugt Beispiel cons sinn 42 Dieser Aufruf von cons erzeugt ein neues Paar dessen erstes Feld das Symbol sinn enthalt und dessen zweites Feld die Zahl 42 Auf das erste Feld eines Paares kann mit der eingebauten Funktion car sprich carr zugegriffen werden auf das zweite Feld mit cdr sprich kudder Die Namen car content of address register und cdr content of decrement register sind historisch begrundet haben sich aber so erhalten Sie beziehen sich auf Operationen die seinerzeit bei der ersten Lisp Implementation auf der IBM 704 benutzt wurden Die eingebauten Funktionen set car und set cdr setzen die Werte der entsprechenden Felder eines Paares auf einen neuen Wert Das Typ Pradikat pair gibt genau dann t fur wahr zuruck wenn es auf ein Paar also einen mit cons erzeugten Wert angewendet wurde Die Definition von Listen ist induktiv Die leere Liste geschrieben ist eine Liste Ausserdem ist ein Paar dessen cdr eine Liste ist eine Liste Durch die Definition ergibt sich dass eine Liste aus Paaren besteht Im car Feld eines Paares steht ein beliebiger Wert im cdr Feld das Paar das das nachste Listenelement enthalt Das Ende der Liste ist erreicht wenn im cdr Feld die leere Liste zu finden ist was sich mit der eingebauten Funktion null uberprufen lasst Beispiele fur Listen cons 1 cons 1 cons 2 Fur die Erzeugung von Listen gibt es ausserdem noch die komfortable Funktion list die eine beliebige Anzahl von Argumenten nimmt und diese als Liste zuruckgibt Die folgenden beiden Listen sind aquivalent list 1 2 3 cons 1 cons 2 cons 3 Funktionen die Listen verarbeiten sind meist rekursive Funktionen Mit dieser Funktion lasst sich zum Beispiel die Lange einer Liste bestimmen define length lst if null lst 0 1 length cdr lst Scheme Programmierer machen von der Moglichkeit die Felder eines Paares mit set car oder set cdr zu andern fast nie Gebrauch Die Verarbeitung von Listen erfolgt fast immer rein funktional d h aus Listen werden neue Listen erzeugt Ein Beispiel ist diese Funktion map die eine Funktion f auf alle Elemente einer Liste anwendet define map f lst if null lst cons f car lst map f cdr lst Weitere Datentypen Bearbeiten Weitere Datentypen sind unter anderem integer ganze Zahlen beliebige Stellenzahl rational Bruche beliebige Genauigkeit real Dezimalzahlen komplexe Zahlen Symbole Zeichen Strings Zeichenkette Paare Vektoren Port Reprasentation fur Eingabe Ausgabe Gerate Dateien etc Booleanwahr und falsch werden durch t und f dargestellt wobei Scheme jedoch nur f in veralteten Implementierungen nur ein Synonym fur leere Liste als logisch falsch interpretiert alle anderen Werte gelten als wahr Fallunterscheidung BearbeitenIfif wertet einen Test Ausdruck aus und wertet je nach dessen Wahrheitswert den zweiten Operanden Konsequente oder den dritten Operanden Alternative aus Der Wert des gesamten If Ausdrucks ergibt sich aus der Auswertung der Konsequente bzw Alternative Nur wenn der Test Ausdruck den Wert f hat wird die Alternative ausgewertet andernfalls die Konsequente D h jeder Wert ausser f gilt als logisch wahr Ein entsprechender Ausdruck sieht zum Beispiel so aus if gt x 0 positive not positive Dieser Ausdruck wertet entweder zum Symbol positive oder zum Symbol not positive aus Da If ein Ausdruck ist kann If innerhalb von Ausdrucken verwendet werden 2 if gt x max max x CondMit cond ist es moglich mehrere Falle zu unterscheiden Ein Fall besteht aus einem Test und einer Konsequente Die Falle werden von links nach rechts uberpruft Liefert der Test eines Falles nicht f zuruck wird die entsprechende Konsequente ausgewertet Dieser Wert ergibt dann den Wert des gesamten cond Ausdrucks Trifft keiner der angegebenen Falle zu wird falls vorhanden der else Fall ausgewertet Ist kein else Fall vorhanden ist der Wert des cond Ausdrucks nicht definiert Beispiel cond wert 65 a wert 66 b else unbekannt Schleifen BearbeitenScheme besitzt keinerlei Programmiersprachen Konstrukte fur Schleifen allerdings wird in den automatisch inkorporierten Scheme Standard Libraries beispielsweise mit dem do Konstrukt die Moglichkeit von Schleifen angeboten Schleifen werden in der Regel durch rekursive Funktionsaufrufe implementiert Eine Endlosschleife sieht im einfachsten Fall so aus define loop loop Ein haufig gezeigtes Beispiel um dies zu demonstrieren ist die Berechnung der Fakultat define fak n if n 0 1 n fak n 1 Um dieses theoretisch ansprechende Konzept praktikabel umzusetzen optimiert Scheme die endstammige Rekursion bzw allgemeiner alle endstammigen Funktionsaufrufe Bei der nicht endstammigen Rekursion leistet die Funktion nach dem Selbstaufruf noch Arbeit Im Beispiel die Multiplikation fak 4 4 fak 3 4 3 fak 2 4 3 2 fak 1 4 3 2 1 fak 0 4 3 2 1 1 4 3 2 1 4 3 2 4 6 24 Hier wird wahrend des Ablaufs zum Speichern der Zwischenergebnisse zunehmend mehr Speicher Platz benotigt Eine endstammige tail recursive Variante des obigen Beispieles ware define fak iter n a if n 0 a fak iter n 1 n a define fak n fak iter n 1 Der Ablauf wurde dann wie folgt aussehen fak 4 fak iter 4 1 fak iter 3 4 fak iter 2 12 fak iter 1 24 fak iter 0 24 24 Scheme erkennt dass das Ergebnis des Prozeduraufrufs nur noch zuruckgegeben wird und kann somit fur alle Prozeduraufrufe denselben Speicherplatz verwenden Die zusatzliche Variable a in der Prozedur fak iter akkumuliert die Zwischenergebnisse Kommentare BearbeitenKommentare werden durch ein Semikolon eingeleitet und reichen bis zum Zeilenende Vergleich zwischen Scheme und LISP BearbeitenDrei wesentliche Merkmale unterscheiden Scheme von Lisp In Scheme gibt es die Funktion call with current continuation Sie erlaubt die gegenwartige Continuation d h eine Art Ausfuhrungszustand des laufenden Programms als Variable zu verwenden Damit ist es moglich spater im Programmablauf zur Stelle dieser Continuation zuruck zu springen Der Scheme Standard schreibt proper tail recursion vor Prozeduraufrufe in einer endrekursiven Position durfen keinen Speicherplatz auf dem Aufrufstapel des Programms verbrauchen Das bedeutet dass eine unbegrenzte Anzahl an endrekursiven Aufrufen einer Prozedur moglich ist Im Gegensatz zu LISP sind Makros in Scheme hygienisch Innerhalb eines Makros eingefuhrte Bezeichner verdecken keine anderen Bezeichner der lexikalischen Umgebung ausserhalb des Makros also des aufrufenden Programms Umgekehrt werden innerhalb eines Makros verwendete Bezeichner immer innerhalb der lexikalischen Umgebung des Makros aufgelost nicht ausserhalb Das bedeutet dass die Bezeichner eines Makros nur fur das Makro selbst sichtbar sind und das Makro nicht auf Bezeichner des ubergeordneten Programms zugreifen kann sowie dass das Programm nicht auf die internen Bezeichner des Makros zugreifen kann Implementierungen und Entwicklungswerkzeuge BearbeitenEs steht eine grosse Zahl von Implementierungen der Programmiersprache zur Verfugung 2 Im Folgenden werden nur einige populare Implementierungen erwahnt Bigloo 3 ubersetzt Scheme Code in verschiedene andere Sprachen C Java und NET Chicken ist eine Implementierung die Scheme nach C ubersetzt und deswegen auf praktisch allen Plattformen lauft Sie stellt sowohl einen Interpreter als auch einen Compiler zur Verfugung und hat wegen der Anbindung zu C eine umfangreiche Bibliothek an Erweiterungen Die Implementierung ist weitgehend R5RS konform Gambit C 4 verfugt neben einem Scheme Interpreter auch uber einen der effizientesten Scheme zu C Compiler Gauche 5 ist eine R7RS konforme Implementierung Sie ist als Skriptinterpreter fur Entwickler und Administratoren konzipiert Einige der Entwicklungsziele sind eine kurze Startzeit eine eingebaute Systemschnittstelle native Mehrsprachenunterstutzung Weiterhin konnen zahlreiche Erweiterungen eingebunden werden z B fur OpenGL und GTK GNU Guile ist ein Interpreter der als Bibliothek eingebunden werden kann Ziel ist in erster Linie Programme leicht um Scripting Fahigkeiten erweitern zu konnen LispMe 6 ist eine Implementierung fur PalmOS kompatible PDAs Racket 7 fruher PLT Scheme ist eine verbreitete Implementierung die neben einer grossen Menge von Bibliotheken eine eigene Entwicklungsumgebung mit dem Namen DrRacket fruher DrScheme beinhaltet DrRacket ist speziell auf den Einsatz in der Programmieranfangerausbildung zugeschnitten und leicht zu bedienen Racket enthalt mehrere Compiler die Racket Scheme Code zu Byte oder C Code umwandeln Scheme 48 8 ist eine komplett in Scheme geschriebene Scheme Implementierung Zum Bootstrapping wird ein statisch typisierter Scheme Dialekt namens PreScheme verwendet Scheme 48 ubersetzt Scheme Code in Bytecode der in einem Speicherimage gesichert werden kann Scheme 48 zeichnet sich besonders durch seine Moglichkeiten aus Scheme Code zu debuggen SIOD 9 Ein kleiner schneller Scheme Interpreter der unter anderem Verwendung in GIMPs ScriptFu bis Version 2 4 fand Literatur BearbeitenHal Abelson Gerald Jay Sussman Structure and Interpretation of Computer Programs McGraw Hill ISBN 0 07 000422 6 Hal Abelson Gerald Jay Sussman Struktur und Interpretation von Computerprogrammen Springer Verlag ISBN 3 540 42342 7 R Kent Dybvig The Scheme Programming Language The MIT Press ISBN 0 262 54148 3 4 Ausgabe online Iain Ferguson The Schemer s Guide Schemers Inc ISBN 0 9628745 2 3 Daniel P Friedman Matthias Felleisen The Little Schemer The MIT Press ISBN 0 262 56099 2 Daniel P Friedman Matthias Felleisen The Seasoned Schemer The MIT Press ISBN 0 262 56100 X Daniel P Friedman Matthias Felleisen The Reasoned Schemer The MIT Press ISBN 0 262 56214 6 George Springer Daniel P Friedman Scheme and the Art of Programming The MIT Press ISBN 0 262 19288 8 Herbert Klaeren Michael Sperber Die Macht der Abstraktion Einfuhrung in die Programmierung Teubner ISBN 3 8351 0155 2 Herbert Klaeren Michael Sperber Vom Problem zum Programm Teubner ISBN 3 519 22242 6 Jacques Chazarain Programmer avec Scheme International Thomson Publishing France ISBN 2 84180 131 4 Chris Hanson Garald Jay Sussman Software Design for Flexibility The MIT Press ISBN 978 0 262 04549 0Weblinks Bearbeiten nbsp Wikisource Scheme An Interpreter for Extended Lambda Calculus Quellen und Volltexte englisch schemers org Materialsammlung zu Scheme Guy Steele Gerald Sussman The Original Lambda Papers SRFI Scheme Requests for Implementation stellt eine Sammlung von Funktionalitaten bereit die sich praktisch als Standard Bibliothek fur Scheme Implementierungen herausgebildet hat Einfuhrungen Bearbeiten How To Design Programs HTDP Einsteiger Scheme Buch Structure and Interpretation of Computer Programs SICP Dieses Scheme Buch wurde jahrelang in den Einsteiger Programmierkursen am MIT und anderen Universitaten verwendet Teach Yourself Scheme in Fixnum Days Online Kurs fur Einsteiger Sprachstandards Bearbeiten Definition des veralteten Sprachstandards R5RS Definition des vorherigen Sprachstandards R6RS Definition des aktuellen Sprachstandards R7RS PDF 679 kB Einzelnachweise Bearbeiten Seite des Standards R7RS Liste bekannter Implementierungen Bigloo Webseite Gambit C Webseite Gauche Webseite LispMe Webseite Racket Webseite Scheme 48 Webseite SIOD Webseite Memento vom 6 April 2007 im Internet Archive Abgerufen von https de wikipedia org w index php title Scheme amp oldid 237490584