Scheme

Alena Münchhausen April 7, 2016 S 3 0
FONT SIZE:
fontsize_dec
fontsize_inc

Scheme ist eine funktionale Programmiersprache und einer der beiden Hauptdialekte der Programmiersprache Lisp. Im Gegensatz zu Common Lisp, die andere Hauptdialekt, Schema folgt einem minimalistischen Design-Philosophie Angabe eines kleinen Standardkern mit leistungsstarken Tools für die Spracherweiterung.

Schema wurde am MIT AI Lab von Guy L. Steele und Gerald Jay Sussman, die es über eine Reihe von Memos, jetzt als Lambda-Papiere genannt, für den Zeitraum 1975-1980 an die akademische Welt eingeführt entwickelt. Es war das erste Lisp-Dialekt zu lexikalischen Gültigkeitsbereich und der erste auf Implementierungen erfordern, um die Tail-Call-Optimierung durchführen zu wählen, so dass stärkere Unterstützung der funktionalen Programmierung und die damit verbundenen Techniken wie rekursive Algorithmen. Es war auch eine der ersten Programmiersprachen, um erstklassige Fortsetzungen zu unterstützen. Es hatte einen signifikanten Einfluss auf den Aufwand, der für die Entwicklung des Common Lisp geführt.

Das Scheme Sprache wird in der offiziellen IEEE-Standard vereinheitlicht und eine de-facto-Standard genannt überarbeiteten Bericht über die Algorithmische Sprache Scheme. Die am häufigsten implementierte Standard ist R5RS und ein neuer Standard R6RS wurde 2007 Scheme eine breite Nutzerbasis durch seine Kompaktheit und Eleganz, aber seine minimalistischen Philosophie ratifiziert hat auch große Unterschiede zwischen den praktischen Implementierungen verursacht, so sehr, dass das Scheme Lenkungs Ausschuss nennt es "das weltweit unportable Programmiersprache" und "eine Familie von Dialekten" und nicht als eine einzige Sprache.

Geschichte

Origin

Scheme begann als ein Versuch, Carl Hewitt Schauspieler-Modell zu verstehen, wozu Steele und Sussman schrieb ein "tiny Lisp-Interpreter" Verwendung MacLisp und dann "hinzugefügt Mechanismen zum Erstellen von Schauspielern und Senden von Nachrichten." Scheme hieß ursprünglich "Schemer", in der Tradition der anderen Lisp-stamm Sprachen wie Planner oder Verschwörer. Der aktuelle Name resultiert aus der Verwendung des ITS-Betriebssystem der Autoren, die Dateinamen in zwei Komponenten von jeweils höchstens sechs Zeichen beschränkt. Derzeit "Schemer" wird üblicherweise verwendet, um ein Schema Programmierer beziehen.

R6RS

Eine neue Sprache Standardisierungsprozess begann 2003 bei den Scheme-Workshop, mit dem Ziel der Herstellung einer R6RS Standard im Jahr 2006. Dieser Prozess brach mit der früheren RnRS Ansatz der Einstimmigkeit.

R6RS verfügt über eine Standard-Modul-System, so dass eine Spaltung zwischen der Kernsprache und Bibliotheken. Eine Reihe von Entwürfen des R6RS Spezifikation wurden freigelassen, die endgültige Version sein R5.97RS. Eine erfolgreiche Abstimmung führte zu der Ratifizierung des neuen Standards, kündigte am 28. August 2007.

Derzeit werden die neuesten Versionen der verschiedenen Scheme-Implementierungen, wie Chez Scheme, Schläger, Ikarus, Diebstahl und Ypsilon, unterstützen die R6RS Standard. Es ist ein tragbares Referenz Umsetzung der vorgeschlagenen implizit Phased-Bibliotheken für R6RS, genannt psyntax, die Lasten und Stiefelriemen selbst richtig auf verschiedene ältere Scheme-Implementierungen.

R6RS stellt zahlreiche bedeutende Änderungen an der Sprache. Der Quellencode wird nun in Unicode angegeben ist, und eine große Untermenge der Unicode-Zeichen können nun in Schema Symbole und Identifikatoren, und es gibt andere kleinere Änderungen der lexikalischen Regeln. Zeichendaten ist jetzt auch in Unicode festgelegt. Viele Standardverfahren an die neuen Standard-Bibliotheken, die sich eine große Erweiterung der Standard-Form, mit einem Verfahren und syntaktischen Formen, die früher nicht Teil der Standard wurden verschoben. Ein neues Modulsystem eingeführt worden, und Systeme zur Fehlerbehandlung werden nun standardisiert. Syntax-Regeln hat mit einem ausdrucks syntaktische Abstraktion Anlage, die die Nutzung aller von Schema auf der Makroexpansionszeit ermöglicht ersetzt. Konforme Implementierungen müssen nun voll numerische Turm Scheme zu unterstützen, und die Semantik von Zahlen wurden erweitert, vor allem in Richtung der Unterstützung für die IEEE 754-Standard für Fließkomma-Zahlendarstellung.

R7RS

Die R6RS Standard hat Kontroverse verursacht, weil es ist zu sehen, von der minimalistischen Philosophie abgewichen sind. Im August 2009 hat das Schema Lenkungsausschuss, der die Normungsprozess überwacht ihre Absicht angekündigt, Splitting Schema in zwei Sprachen zu empfehlen: eine große, moderne Programmiersprache für Programmierer und eine Teilmenge der große Version Beibehaltung der Minimalismus von Pädagogen und lässig implementors gelobt; zwei Arbeitsgruppen geschaffen wurden, um auf diese beiden neuen Versionen der Scheme arbeiten. Das Scheme Reports Prozess Website enthält Links zu den Arbeitsgruppen Urkunden, öffentliche Diskussionen und Issue-Tracking-Systems.

Eine neunte Entwurf R7RS ist seit 2013.04.15 erhältlich. Eine Abstimmung der Ratifizierung dieses Entwurfs Sprache schloss am 2013.05.20.

Der Abschlussbericht der R7RS ist seit 2013.07.06 erhältlich.

Unterscheidungsmerkmale

Scheme ist in erster Linie eine funktionale Programmiersprache. Es teilt viele Eigenschaften mit anderen Mitgliedern der Programmiersprache Lisp-Familie. Sehr einfache Syntax-Schema basiert auf s-Ausdrücke beruht, in Klammern Listen, in denen ein Präfix-Operator wird durch seine Argumente folgen. Scheme Programmen bestehen also aus Sequenzen von verschachtelten Listen. Listen sind auch die Hauptdatenstruktur in Schema, was zu einer engen Übereinstimmung zwischen Quellcode und Datenformaten. Scheme-Programme können einfach erstellen und Stücke von Scheme-Code dynamisch zu bewerten.

Die Abhängigkeit von Listen als Datenstrukturen wird von allen Lisp Dialekte geteilt. Scheme erbt einen umfangreichen Satz von Liste Verarbeitungs Primitiven wie cons, car und cdr von seinem Lisp Vorfahren. Schema verwendet streng, aber dynamisch typisierte Variablen und unterstützt First-Class-Funktionen. So können Funktionen wie Variablen Werte zugewiesen werden oder als Argumente an Funktionen übergeben werden.

Dieser Abschnitt konzentriert sich hauptsächlich auf innovative Features der Sprache, einschließlich der Features, die Schema aus anderen Lisps unterscheiden. Wenn nicht anders angegeben, beziehen sich Beschreibungen von Merkmalen zum R5RS Standard.

In den Beispielen in diesem Abschnitt vorgesehen ist, die Notation "=== & gt; Ergebnis" wird verwendet, um das Ergebnis der Auswertung des Ausdrucks auf der unmittelbar vorhergehenden Zeile anzuzeigen. Dies ist die gleiche Konvention in R5RS verwendet.

Grundlegende Design-Merkmale

Dieser Unterabschnitt beschreibt die Merkmale des Scheme, die es von anderen Programmiersprachen von seinen frühesten Tagen ausgezeichnet haben. Dies sind die Aspekte der Regelung, dass jedes Produkt des Scheme Sprache am stärksten beeinflussen, und sie die Aspekte, die alle Versionen der Programmiersprache Scheme, von 1973 vorwärts, teilen.

Minimalismus

Scheme ist eine sehr einfache Sprache, viel einfacher zu implementieren als viele andere Sprachen vergleichbarer Ausdruckskraft. Diese Leichtigkeit ist auf die Verwendung von Lambda-Kalkül, um einen Großteil der Syntax der Sprache aus primitiveren Formen abzuleiten. Zum Beispiel der 23 s-Expression basierenden syntaktische Konstrukte im R5RS Scheme-Standard definierten, 11 sind als abgeleitete oder Bibliothek bildet, die als Makros mit mehr Grundformen, vornehmlich lambda geschrieben werden können, klassifiziert. Wie R5RS sagt: "Die grundlegendste der variablen Bindungskonstrukte ist die Lambda-Ausdruck, weil alle anderen variablen Bindungskonstrukte können in Bezug auf die Lambda-Ausdrücke erklärt werden."

Beispiel: ein Makro zu implementieren als ein Ausdruck mit, um die Variablenbindungen durchzuführen.

So verwenden wie oben eine Scheme-Implementierung definiert wäre neu zu schreiben "" als "", welche Aufgabe die Umsetzung der von Codierungsverfahren Instanzen reduziert.

Im Jahr 1998 Sussman und Steele, bemerkte, dass der Minimalismus von Schema war keine bewusste Design-Ziel, sondern das unbeabsichtigte Ergebnis des Designprozesses. "Wir waren wirklich versucht, etwas kompliziert zu bauen und entdeckte, serendipitously, dass wir versehentlich etwas, das alle unsere Ziele erreicht, aber war viel einfacher, als wir gedacht hatten konzipiert .... wir erkannt, dass die Lambda-Kalkül eine kleine, einfache Formalismus dienen könnte als Kern eines starken und ausdrucksstarke Programmiersprache. "

Lexikalischen Gültigkeitsbereich

Wie die meisten modernen Programmiersprachen und im Gegensatz zu früheren Lisps wie MacLisp wird Scheme lexikalisch scoped: alle möglichen Variablenbindungen in einer Programmeinheit kann durch das Lesen Sie den Text der Programmeinheit ohne Rücksicht auf den Kontext, in dem sie aufgerufen werden können, untersucht werden. Dies kontrastiert mit dynamischen Scoping, die charakteristisch für frühe Lisp Dialekte war, wegen der Prozesskosten mit den zur lexikalischen Scoping-Algorithmen in Compiler und Interpreter des Tages zu implementieren primitive Textsubstitutionsverfahren verbunden. In diesen Lisps durchaus möglich, war es für eine Bezugnahme auf eine freie Variable innerhalb einer Prozedur um ganz unterschiedliche Bindungen außerhalb der Prozedur, in Abhängigkeit vom Kontext des Anrufs beziehen.

Der Anstoß zu lexikalischen Scoping, das eine ungewöhnliche Scoping-Modell in den frühen 1970er Jahren war, in ihre neue Version von Lisp übernehmen, kam von Sussman Studien von ALGOL. Er schlug vor, dass Algol-ähnlichen lexikalischen Scoping Mechanismen helfen würde, auf ihre ursprünglichen Ziel der Umsetzung Hewitt Schauspieler Modell in Lisp zu realisieren.

": Für Extended Lambda-Kalkül eines Dolmetschers Scheme", wo sie nahm den Begriff des lexikalischen Verschluss, der in ein beschrieben worden war, die wichtige Erkenntnisse darüber, wie lexikalischen Scoping in ein Lisp-Dialekt einzuführen wurden in Sussman und Steele 1975 Lambda Papier, popularisiert AI Memo 1970 von Joel Moses, der auf die Idee, Peter J. Landin zurückzuführen.

Lambda-Kalkül

Mathematischen Notation Alonzo Kirche, dem Lambda-Kalkül, hat von "Lambda" Lisp ist als Schlüsselwort für die Einführung eines Verfahrens, sowie die Beeinflussung der Entwicklung von funktionalen Programmiertechniken, die die Verwendung von Funktionen höherer Ordnung in Lisp inspiriert. Aber früh Lisps nicht geeignet waren Ausdrücke des Lambda-Kalkül wegen ihrer Behandlung der freien Variablen.

Die Einführung von lexikalischen Gültigkeitsbereich das Problem gelöst, indem sie ein Äquivalenz zwischen einigen Formen der Lambda-Notation und ihren praktischen Ausdruck in einer Arbeits Programmiersprache. Sussman und Steele zeigte, dass die neue Sprache verwendet werden, um elegant abzuleiten alle Imperativ und deklarative Semantik von anderen Programmiersprachen wie ALGOL und Fortran, und der Dynamikumfang der anderen Lisps, indem Sie Lambda-Ausdrücke nicht als einfaches Verfahren Instanzen, sondern als "Steuer Strukturen und Umfeld Modifikatoren. " Sie führten Fortsetzungsübertragungsstil zusammen mit ihrer ersten Beschreibung des Scheme in der ersten der Lambda-Papiere, und in den folgenden Papiere gingen sie, um die rohe Kraft dieser praktischen Einsatz der Lambda-Kalkül zu demonstrieren.

Blockstruktur

Scheme erbt seine Blockstruktur aus früheren Block strukturierten Sprachen, insbesondere ALGOL. In Schema werden Blöcke von drei Bindungskonstrukte implementiert :, und. Zum Beispiel erzeugt die folgende Konstrukt einen Block, in dem ein Symbol bezeichnet wird, die der Anzahl 10 gebunden:

Blöcke können verschachtelt werden, um beliebig komplexe Blockstrukturen je nach Bedarf des Programmierers zu erstellen. Die Verwendung von Blockstrukturierung zu lokalen Bindungen zu erstellen mildert das Risiko von Namespace-Konflikt, die sonst auftreten können.

Eine Variante der ,, erlaubt Bindungen an die Variablen zuvor in der gleichen Konstrukt, so definiert ist:

Die andere Variante ,, ist entworfen, um sich gegenseitig rekursive Verfahren, die aneinander gebunden werden können.

Alle in einem einzigen gebunden Verfahren können miteinander durch Namen wie die Werte der Variablen zuvor in der gleichen definierten beziehen, als auch, aber sie können nicht auf Werte später im selben definierten beziehen.

Eine Variante, die "mit dem Namen let" Form weist eine Kennung nach dem Schlüsselwort. Dieser bindet die let-Variablen auf das Argument einer Prozedur, deren Name die angegebene Kennung und dessen Körper ist der Körper des let Form. Der Körper kann durch Aufruf der Prozedur wiederholt werden. Der benannte let wird häufig zur Iteration implementieren.

Beispiel: ein einfacher Zähler

Wie jedes Verfahren in Schema das Verfahren in der genannten let erstellt ist ein erstklassiges Objekt.

Proper Endrekursion

Scheme eine Iterationskonstruktion ,, aber es ist mehr idiomatischen Schema zu Endrekursion verwenden, um Iteration auszudrücken. Standard-konformen Schema-Implementierungen sind erforderlich, um zu optimieren Schwanz ruft, um zu unterstützen eine unbegrenzte Anzahl von aktiven Schwanz eine Eigenschaft, die Scheme Bericht beschreibt, wie die richtige Endrekursion dass es sicher für Scheme-Programmierer, um iterative Algorithmen mit rekursive Strukturen, die manchmal mehr sind zu schreiben Anrufe intuitiv. Schwanz rekursive Prozeduren und die mit dem Namen Form unterstützen Iteration mit Endrekursion.

First-Class-Fortsetzungen

Fortsetzungen in Schema sind erstklassige Objekte. Regelung sieht die Vorgehensweise, um die aktuelle Fortsetzung durch Packen Sie es als ein auf eine formale Argument in einem Verfahren durch den Programmierer vorgesehen gebunden Fluchtverfahren zu erfassen. First-Class-Fortsetzungen ermöglichen dem Programmierer, nicht-lokale Steuerkonstrukte wie Iteratoren Koroutinen und Backtracking zu erstellen.

Fortsetzungen kann verwendet werden, um das Verhalten der return-Anweisungen in imperativen Programmiersprachen emulieren. Die folgende Funktion, gegebene Funktion und Liste, liefert das erste Element in einer solchen, die true zurückgibt.

Das folgende Beispiel, Puzzle eine traditionelle Programmierers, zeigt, dass Schema können Fortsetzungen als First-Class-Objekte zu behandeln, Bindung an Variablen und Weitergabe als Argumente an Prozeduren.

Wenn er ausgeführt wird dieser Code zeigt eine Zählsequenz:

Gemeinschafts-Namespace für Prozeduren und Variablen

Im Gegensatz zu Common Lisp, alle Daten und Verfahren in Schema einen gemeinsamen Namespace, während in Common Lisp Funktionen und Daten über getrennte Namensräume die es ermöglicht, eine Funktion und einer Variablen, die den gleichen Namen haben, und erfordern spezielle Notation für die Bezugnahme auf ein Funktion als Wert. Dies wird manchmal als die "Lisp-1 vs. Lisp-2" Unterscheidung bekannt, die sich auf die einheitlichen Namensraum des Schemas und der separaten Namespaces von Common Lisp.

In Schema können die gleichen Grundelemente, die verwendet werden, um Daten zu manipulieren und zu binden, verwendet werden, um Verfahren zu binden. Es gibt kein Äquivalent von Common Lisp ist, und Primitiven.

Implementierungsstandards

Dieser Unterabschnitt Dokumenten Design-Entscheidungen, die im Laufe der Jahre, das Schema einen besonderen Charakter gegeben haben, getroffen worden sind, aber sind nicht die direkten Ergebnisse des ursprünglichen Entwurfs.

Numerische Turm

Schema spezifiziert eine vergleichsweise vollständigen Satz von numerischen Datentypen einschließlich komplexer und rational-Typen, die in Schema als Zahlenturm bekannt ist. Der Standard behandelt diese als Abstraktionen und nicht die Implementierer auf bestimmte interne Repräsentationen zu begehen.

Zahlen kann die Qualität der Genauigkeit. Eine genaue Zahl kann nur durch eine Folge von Operationen, die genaue anderen genauen Zahlen Ungenauigkeit erzeugt werden ist also ansteckend. Der Standard legt fest, dass zwei beliebige Implementierungen müssen gleichwertige Ergebnisse für alle Operationen, was zu genauen Zahlen zu erzeugen.

Die R5RS Norm legt Verfahren und die verwendet werden kann, um die Genauigkeit einer Zahl zu ändern. produziert "die genaue Anzahl, die numerisch am nächsten zu dem Argument." produziert "die ungenaue Zahl, die zahlenmäßig am nächsten an der Argumentation ist". Die R6RS Standard lässt diese Verfahren aus dem Hauptbericht, doch legt sie als R5RS Kompatibilitätsverfahren in der Standardbibliothek).

Im R5RS Standard werden Scheme-Implementierungen nicht erforderlich, die gesamte Zahlenturm zu implementieren, aber sie müssen "eine zusammenhängende Teilmenge entspricht sowohl im Sinne der Umsetzung und dem Geist der Sprache Scheme" zu implementieren. Die neue R6RS Standard erfordert Umsetzung der ganze Turm und "genaue Integer-Objekte und exakte rationale Zahl Objekten praktisch unbegrenzt ausdehnen und Präzision, und bestimmte Verfahren zu implementieren ... so dass sie exakte Ergebnisse bei gegebenen genauen Argumente immer wieder zurückkehren".

Beispiel 1: exakter Arithmetik in einer Implementierung, die exakte rationale komplexe Zahlen unterstützt.

Beispiel 2: Der gleiche arithmetische in einer Implementierung, die weder genaue Zahlen noch rationale komplexe Zahlen unterstützt aber nicht akzeptieren, reelle Zahlen in rational-Notation.

Beide Implementierungen entsprechen dem R5RS Standard, aber die zweite nicht auf R6RS entsprechen, weil sie nicht zu implementieren die vollständige Zahlenturm.

Verzögerte Auswertung

Scheme unterstützt verzögerte Auswertung durch die Form und das Verfahren.

Die lexikalische Rahmen der ursprünglichen Definition der Verheißung bleibt erhalten, und sein Wert wird auch nach der ersten Verwendung, Das Versprechen wird immer nur einmal ausgewertet erhalten.

Diese Grundelemente, die produzieren oder zu behandeln, wie Versprechungen bekannten Werte können zur Behandlung von fortgeschrittenem lazy evaluation Konstrukte wie Ströme zu implementieren.

Im R6RS Standard sind dies nicht mehr Primitiven, sondern werden als Teil des R5RS Kompatibilitätsbibliothek zur Verfügung gestellt).

In R5RS wird eine vorgeschlagene Implementierung und gegeben, zur Durchführung des Versprechen als eine Prozedur ohne Argumente und mit memoization, um sicherzustellen, dass es immer nur einmal berechnet, unabhängig von der Anzahl der Male aufgerufen wird.

SRFI 41 ermöglicht die Expression beider endlichen und unendlichen Sequenzen mit außergewöhnlichen Wirtschaft. Zum Beispiel ist dies eine Definition der Fibonacci-Sequenz unter Verwendung der in SRFI 41 Funktionen:

Reihenfolge der Auswertung von Prozedurargumente

Die meisten Lisps geben Sie eine Reihenfolge der Auswertung für die Prozedurargumente. Scheme nicht. Reihenfolge der Auswertung, einschließlich der Reihenfolge, in der der Ausdruck in der Bedienerposition ausgewertet wird durch eine Implementierung auf einer Call-by-Call-Basis gewählt werden, und die einzige Einschränkung ist, dass "die Auswirkungen einer gleichzeitigen Auswertung der Operator und Operanden Ausdrücke gezwungen ist, die mit einem gewissen Reihenfolge der Auswertung zu sein. "

ev ist ein Verfahren, das Argument an sie übergeben wird beschrieben, gibt dann den Wert des Arguments. Im Gegensatz zu anderen Lisps ist das Aussehen eines Ausdruckes in der Bedienerposition eines Ausdrucks Schema ziemlich zugelassen, solange das Ergebnis des Ausdrucks in der Bedienerposition ist ein Verfahren.

Bei Aufruf der Prozedur "+" auf 1 und 2 die folgenden Ausdrücke hinzuzufügen, und kann in einer beliebigen Reihenfolge bewertet werden, solange der Effekt ist nicht so, dass sie in parallel ausgewertet. Somit werden die folgenden drei Zeilen können in beliebiger Reihenfolge nach Standardschema angezeigt werden, wenn das obige Beispiel Code ausgeführt wird, auch wenn der Text einer Zeile darf nicht mit einem anderen verschachtelt werden, denn das würde die sequentielle Auswertung Bedingung verletzen.

Hygienic-Makros

Im R5RS Standard und auch in späteren Berichten können die Syntax der Scheme bequem über die Makro-System erweitert werden. Die R5RS Standard eingeführt eine leistungsstarke hygienische Makrosystem, das es dem Programmierer, neue syntaktische Konstrukte der Sprache mit einem einfachen Mustervergleich Untersprache hinzuzufügen. Zuvor hatte die hygienische Makrosystem auf einen Anhang des R4RS Standard verbannt worden, als ein "hohes Niveau" System neben einem "low level" Makro-System, die beide als Erweiterungen Schema und nicht als wesentlicher Teil der behandelten die Sprache.

Implementierungen der hygienischen Makrosystem, auch genannt, erforderlich, um die lexikalische Scoping der Rest der Sprach respektieren. Dies wird durch spezielle Namens und Scoping-Regeln für Makroexpansion gewährleistet, und vermeidet gemeinsame Programmierfehler, die in den Makro-Systeme anderer Programmiersprachen auftreten können. R6RS legt ein anspruchsvoller Transformationssystem ,, die seit als Spracherweiterung zu R5RS Schema für einige Zeit zur Verfügung.

Aufrufe von Makros und Verfahren tragen eine große Ähnlichkeit beide sind s-Ausdrücke aber sie anders behandelt werden. Wenn der Compiler einen s-Expression in dem Programm überprüft es zuerst, ob das Symbol als eine syntaktische Schlüsselwort innerhalb des aktuellen lexikalischen Gültigkeits definiert. Wenn ja, dann versucht, um das Makro zu erweitern, die Behandlung der Produkte in den Schwanz des s-Ausdruck als Argument, ohne Kompilieren von Code, um sie zu bewerten, und dieser Prozess wird rekursiv wiederholt, bis keine Makroaufrufe bleiben. Wenn es nicht eine syntaktische Stichwort, kompiliert der Compiler Code, um die Argumente in den Schwanz der s-Ausdruck auszuwerten und dann, um die Variable durch das Symbol an der Spitze des s-Ausdruck auszuwerten und nennen es als ein Verfahren mit dem bewertet Schwanz Ausdrücke als tatsächliche gebenen Argumenten.

Die meisten Scheme-Implementierungen auch zusätzliche Makro-Systeme. Unter beliebtesten sind syntaktische Verschlüsse, explizite Umbenennung Makros und ein nicht-hygienische Makrosystem ähnlich System in Common Lisp zur Verfügung gestellt.

Umgebungen und eval

Vor R5RS hatte Scheme keinen Standardwert von dem Verfahren, das ubiquitär in anderen Lisps ist, obwohl die erste Lambda Papier hatte als "ähnlich der LISP-Funktion EVAL" und dem ersten überarbeiteten Bericht 1978 beschrieben ersetzt dies mit, die zwei Argumente hat . Die zweite, dritte und vierte überarbeitete Berichten fehlen jegliche Äquivalent.

Der Grund für diese Verwirrung ist, dass in Schema mit seinen lexikalischen Scoping das Ergebnis der Auswertung eines Ausdrucks hängt davon ab, wo es ausgewertet wird. Zum Beispiel ist es nicht klar, ob das Ergebnis der Auswertung des folgenden Ausdrucks sollte 5 oder 6 sein:

Wenn es in der äußeren Umgebung, in der festgelegt wird ausgewertet, das Ergebnis ist die Summe der Operanden. Wenn es in der Innenumgebung, in der das Symbol "+" auf den Wert des Verfahrens "*" gebunden wurde ausgewertet wird, das Ergebnis ist das Produkt der zwei Operanden.

R5RS löst diese Verwirrung durch Angabe von drei Verfahren, die Umgebung zurück, und die Bereitstellung eines Verfahrens, das eine s-Ausdruck und eine Umgebung, in der Umwelt vorgesehen dauert und wertet den Ausdruck. R6RS erweitert diese durch die Bereitstellung eines Verfahrens aufgerufen, um den der Programmierer kann genau festlegen, welche in die Evaluierungsumgebung Objekte importieren.

Behandlung von nicht-Boolesche Werte in Booleschen Ausdrücken

In den meisten Dialekten Lisp einschließlich Common Lisp, durch Konvention wertet der Wert auf den Wert false in einem boolschen Ausdruck. In Schema, da dem IEEE-Standard 1991, alle Werte mit Ausnahme #f, darunter 's Äquivalent in Scheme, die als geschrieben steht ", zu bewerten, um den Wert true in einem boolschen Ausdruck.

Wo die Konstante, die den Booleschen Wert true in den meisten Lisps ist, in Schema ist.

Disjunktheit primitiver Datentypen

In Schema die primitiven Datentypen sind disjunkt. Nur eines der folgenden Prädikate gilt für jede Scheme-Objekt sein kann :, ,, ,, ,,,.

Innerhalb der numerischen Datentyp dagegen überlappen sich die Zahlenwerte. Zum Beispiel kann ein Integer-Wert erfüllt alle die, ,, und Prädikate zur gleichen Zeit.

Gleichwertigkeit Prädikate

Schema hat drei verschiedene Arten von Äquivalenz zwischen beliebigen Objekten durch drei verschiedene Äquivalenz Prädikaten relationalen Operatoren zum Testen Gleichheit ,, und bezeichnet:

  •  ausgewertet wird, wenn seine Parameter stellen die gleiche Datenobjekt in einem Speicher;
  •  ist im allgemeinen das gleiche wie jedoch behandelt primitiven Objekte speziell so dass die Zahlen, die den gleichen Wert darstellen, sind selbst dann, wenn sie sich nicht auf das gleiche Objekt beziehen;
  •  vergleicht Datenstrukturen wie Listen, Vektoren und Zeichenfolgen zu bestimmen, wenn sie deckungsgleich Aufbau und Inhalt haben.

Typ abhängig Äquivalenzoperationen gibt es auch in Scheme: und vergleichen Sie zwei Zeichenfolgen; Zeichen und vergleichen; vergleicht Zahlen.

Bemerkungen

Bis zum R5RS Standard, der Standard-Kommentar in Schema war ein Semikolon, die den Rest der Zeile unsichtbar Schema macht. Zahlreiche Implementierungen alternative Konventionen erlauben Kommentare unterstützt, für mehr als eine einzige Leitung zu verlängern und die R6RS Standard erlaubt zwei von ihnen: ein ganzes s-Expression kann durch Voranstellen in einen Kommentar gedreht werden und ein mehrzeiliges Kommentar "Bausteinkommentar" kann durch umgebende Text und hergestellt werden.

Input-Output

Regelung Eingang und Ausgang für den Port-Datentyp basiert. R5RS definiert zwei Standard-Ports, erreichbar mit den Verfahren und, die den Unix Vorstellungen von der Standardeingabe und die Standardausgabe entspricht. Die meisten Implementierungen stellen auch. Umleitung von Eingangs- und die Standardausgabe in der Norm, die von Standardverfahren, wie und unterstützt. Die meisten Implementierungen String-Anschlüsse mit ähnlichen Umleitungsfunktionen, so dass viele normale Eingabe-Ausgabe-Operationen am String-Puffer anstelle von Dateien durchgeführt werden, unter Verwendung von in SRFI beschriebenen Verfahren 6. Die R6RS Norm legt viel anspruchsvoller und in der Lage Port Verfahren und viele neue Arten von Port.

Die folgenden Beispiele werden in strenger R5RS Schema geschrieben.

Beispiel 1: Mit Ausgabe standardmäßig auf:

Beispiel 2: Wie 1, aber unter Verwendung von optionalen Port Argument Ausgangsverfahren

Beispiel 3: Wie 1, aber Ausgang ist mit einem neu erstellten Datei umgeleitet

Beispiel 4: Wie 2, aber mit expliziten Datei geöffnet und in der Nähe von Port-Ausgabe senden In eine Datei

Beispiel 5: Wie 2, jedoch mit mit Call-with-Ausgabedatei zur Ausgabe in eine Datei zu senden.

Ähnliche Verfahren werden für die Eingabe zur Verfügung gestellt. R5RS Schema stellt die Prädikate und. Hinweise zur Zeicheneingabe und Ausgabe ,,, und zur Verfügung gestellt. Zum Schreiben und Lesen Scheme Ausdrücke stellt Scheme und. Bei einem Lesebetrieb ist das zurückgegebene Ergebnis der Ende-der-Datei-Objekt, wenn der Eingangsanschluss hat das Ende der Datei erreicht ist, und dies kann mit Hilfe des Prädikats zu prüfen.

Zusätzlich zu den Standard SRFI 28 definiert eine grundlegende Formatierung Common Lisp Schen Funktion ähnelt, nach dem es benannt ist.

Neudefinition der Standardverfahren

In Schema, werden Verfahren, die Variablen gebunden. Bei R5RS die Sprache Standard formell den Auftrag, dass Programme können die Variablenbindungen von integrierten Verfahren zu ändern, neu zu definieren effektiv sie. Zum Beispiel kann man erweitern, um Zeichenfolgen sowie Zahlen durch eine Neudefinition akzeptieren:

In R6RS jeden verbindlich, einschließlich den Standard, gehört zu einem gewissen Bibliothek und alle exportierten Bindungen sind unveränderlich. Aus diesem Grund wird Neudefinition der Standardverfahren durch Mutation verboten. Stattdessen ist es möglich, ein anderes Verfahren nach dem Namen eines Standardmodell, welches im Effekt ähnelt Neudefinition importieren.

Nomenklatur und Namenskonventionen

In Standard-Schema, Verfahren, die von einem Datentyp in einen anderen konvertieren enthalten die Zeichenkette "- & gt;" in ihrem Namen, Prädikate Ende mit einem "?", und Verfahren, die den Wert der bereits zugeordneten Daten mit einem "!" am Ende zu ändern. Diese Konventionen werden oft von Scheme-Programmierer gefolgt.

In formalen Kontexten wie Schema-Standards wird das Wort "Verfahren" den Vorzug vor "Funktion" verwendet werden, um zu einem Lambda-Ausdruck oder primitive Prozedur beziehen. Im normalen Sprachgebrauch werden die Worte "Verfahren" und "Funktion" werden austauschbar verwendet. Verfahrensanwendung wird manchmal formal als Kombination bezeichnet.

Wie in anderen Lisps der Begriff "Thunk" ist in Schema verwendet, um zu einem Verfahren ohne Argumente beziehen. Der Begriff "ordnungsgemäße Endrekursion" bezieht sich auf die Eigenschaft aller Scheme-Implementierungen, dass sie Tail-Call-Optimierung durchzuführen, um so eine unbestimmte Anzahl von aktiven Schwanz Anrufe unterstützen.

Die Form der Titel der Standards Dokumente seit R3RS "überarbeiteten Bericht über die Algorithmische Sprache Scheme", ist ein Verweis auf den Titel des ALGOL 60 Standarddokument, "Revidierte Bericht über die Algorithmische Sprache Algol 60," Die Übersichtsseite von R3RS ist eng auf der Seite Zusammenfassung der ALGOL 60 Bericht modelliert.

Bewertung von Standardformularen und Verfahren

Die Sprache wird offiziell in die Standards R5RS und R6RS definiert. Sie beschreiben Standard "Formen": Schlüsselwörter und zugehörigen Syntax, die die Kontrollstruktur der Sprache bereitzustellen und Standardverfahren, die gemeinsamen Aufgaben zu erfüllen.

Standardformulare

Diese Tabelle beschreibt die Standardformen in Scheme. Einige Formen erscheinen in mehr als einer Reihe, da sie nicht leicht in einer einzigen Funktion in der Sprache zu klassifizieren.

Formen mit "L" in dieser Tabelle werden klassifiziert als abgeleitete "library" Formen in der Standard und werden oft als Makros mit mehreren Grundformen in die Praxis umgesetzt, so dass die Aufgabe der Umsetzung viel einfacher als in anderen Sprachen.

Beachten Sie, dass beginnen, wird als Bibliothek Syntax in R5RS definiert, aber der Expander muss wissen, über sie das Spleißen Funktionalität zu erreichen. In R6RS es nicht länger eine Bibliothek Syntax.

Standardverfahren

Die beiden folgenden Tabellen werden die Standardverfahren in R5RS Scheme. R6RS ist weit umfangreicher und eine Zusammenfassung dieser Art wäre nicht praktikabel.

Einige Verfahren werden in mehr als einer Reihe, da sie nicht leicht in einer einzigen Funktion in der Sprache zu klassifizieren.

String und Charakter Verfahren, die "-ci" in ihren Namen enthalten, durchführen Fall unabhängige Vergleiche zwischen ihren Argumenten: Groß- und Kleinschreibung Versionen des gleichen Zeichens getroffen werden gleich sein.

Implementierungen - und / die mehr als zwei Argumente definiert ließ aber optional bei R5RS.

Scheme Requests for Implementation

Wegen Scheme Minimalismus sind viele gemeinsame Verfahren und syntaktischen Formen nicht durch den Standard definiert. Um die Kernsprache zu halten kleine, aber erleichtert die Standardisierung von Erweiterungen hat das Schema Community ein "Scheme Antrag auf Durchführung" Prozess, durch den Erweiterungsbibliotheken werden durch eine sorgfältige Diskussion der Erweiterungsvorschläge definiert. Dies fördert Code Portabilität. Viele der SRFIs durch alle oder fast alle Scheme-Implementierungen unterstützt.

SRFIs mit ziemlich breiten Unterstützung in verschiedenen Implementierungen sind:

  • 0: Feature-basierten bedingten Expansion Konstrukt
  • 1: Liste Bibliothek
  • 4: homogenes Zahlenvektor-Datentypen
  • 6: Grund String-Anschlüsse
  • 8: zu erhalten, die Bindung an mehrere Werte
  • 9: Definition von Datensatztypen
  • 13: String-Bibliothek
  • 14: Zeichensatzbibliothek
  • 16: Syntax für Prozeduren der variable Stelligkeit
  • 17: generali gesetzt!
  • 18: Multithreading-Unterstützung
  • 19: Zeitdatentypen und Verfahren
  • 25: mehrdimensionales Array Primitiven
  • 26: Notation für spezialisierte Parameter ohne currying
  • 27: Quellen von Zufallsbit
  • 28: Grundformatstrings
  • 29: Lokalisation
  • 30: verschachtelte mehrzeilige Kommentare
  • 31: eine besondere Form für rekursive Auswertung
  • 37: args-fach: ein Programm Argument Prozessor
  • 39: Parameterobjekte
  • 41: Ströme
  • 42: eifrig Comprehensions
  • 43: Vektor-Bibliothek
  • 45: Grundelemente für die Expression iterative Algorithmen faul
  • 60: Ganzzahlen als Bits
  • 61: eine allgemeinere cond Klausel
  • 66: Oktett Vektoren
  • 67: Vergleich Verfahren

Eine vollständige Liste der akzeptierten SRFIs ist an eleganten, minimalistisches Design hat Scheme ein beliebtes Ziel für die Sprache Designer, Bastler und Pädagogen, und wegen seiner geringen Größe, ist der einer typischen Interpreter es auch eine beliebte Wahl für eingebettete Systeme und Scripting. Dies wurde in Noten von Implementierungen, von denen die meisten unterscheiden sich so sehr, dass Programme von einer Implementierung zur anderen zu portieren ist ziemlich schwierig führte, und die geringe Größe der Standard-Sprache bedeutet, dass jeder große Komplexität Schreiben einer nützliches Programm in Standard, portable Schema ist fast unmöglich. Die R6RS Norm legt eine viel breitere Sprache, in einem Versuch, seinen Appell an Programmierer zu erweitern.

Fast alle Implementierungen bieten eine traditionelle Lisp-style-Lese-eval-print-Schleife für die Entwicklung und das Debugging. Viele auch Schema Programme ausführbare Binärdatei zu kompilieren. Unterstützung für die Einbettung von Scheme-Code in Programme in anderen Sprachen verfasst ist auch üblich, da die relative Einfachheit der Scheme-Implementierungen ist es eine beliebte Wahl für das Hinzufügen von Scripting-Fähigkeiten, um größere Systeme in Sprachen wie C Gambit, Huhn und Bigloo Arbeit durch Kompilieren Schema entwickelt bis C, die die Einbettung besonders einfach macht. Darüber hinaus können Bigloo der Compiler so konfiguriert werden, JVM-Bytecode zu erzeugen, und es verfügt auch über eine experimentelle Bytecode-Generator for.NET.

Einige Implementierungen unterstützen zusätzliche Features. Zum Beispiel Kawa und JScheme bieten Integration mit Java-Klassen und der Regelung auf C-Compiler oft machen es einfach, externe Bibliotheken in C geschrieben, bis so dass die Einbettung der eigentlichen C-Code in der Scheme Quelle verwenden. Ein weiteres Beispiel ist PVTs, die eine Reihe von visuellen Tools für die Unterstützung des Lernens von Schema bietet.

Verwendung

Schema wird häufig durch eine Reihe von Schulen verwendet wird; insbesondere eine Reihe von Einführungs Informatik Kurse verwenden Schema in Verbindung mit dem Lehrbuch Struktur und Interpretation von Computerprogrammen. In den letzten 12 Jahren hat sich die PLT ProgramByDesign Projekt, das in der Nähe von 600 High-School-Lehrer und Tausende von Gymnasiasten, um rudimentäre Programmiersprache Scheme ausgesetzt ausgeführt wurde. MIT alten einleitenden Programmierklasse 6.001 wurde in Schema gelehrt Obwohl 6.001 wurde durch modernere Plätze ersetzt worden ist, weiterhin SICP um am MIT unterrichtet werden. Das Lehrbuch, wie man Programme von Matthias Felleisen, die derzeit auf der Northeastern University Design, wird von einigen Hochschulen für ihre einleitenden Informatikkurse verwendet. Sowohl Northeastern University und Worcester Polytechnic Institute verwenden Scheme ausschließlich für ihre Einführungskurse Grundlagen der Informatik und Einführung in die Programmgestaltung auf. Indiana Universität Einführungsklasse, C211, wird vollständig in Schema unterrichtet. Der Einführungskurs an der UC Berkeley, CS 61A, war bis vor kurzem ganz im Schema gelehrt, zu retten geringfügige Umleitungen in Logo, um Dynamikumfang zu demonstrieren; Kursmaterialien, einschließlich Vortrag Webcasts, sind online verfügbar kostenlos. Die einleitenden Informatik-Kurse an der Yale und Grinnell College sind auch in Schema unterrichtet. Programmierung Design-Paradigmen, eine Pflichtveranstaltung für die Informatik Graduate Students an der Northeastern University, auch ausgiebig nutzt Scheme. Der einleitende Informatikstudium an der Universität von Minnesota - Twin Cities, CSCI 1901 verwendet auch Scheme als Hauptsprache, gefolgt von einem Kurs, der Studenten, der Programmiersprache Java stellt. In der Software-Industrie, Tata Consultancy Services, Asien der größte Software-Beratungsunternehmen, nutzt Scheme in ihrer einmonatigen Trainingsprogramm für frische Hochschulabsolventen. Scheme wird / wurde für die folgenden Zwecke verwendet:

  • Das Document Style Semantics and Specification Language, die ein Verfahren zum Spezifizieren SGML Sheets bietet, verwendet ein Schema Teilmenge.
  • Der bekannte Open-Source-Raster-Grafik-Editor GIMP verwendet Scheme als Skriptsprache.
  • Guile wurde von GNU-Projekt als offizielle Skriptsprache übernommen worden, und dass die Umsetzung des Scheme ist in solchen Anwendungen wie GNU LilyPond und GnuCash als Skriptsprache für Erweiterungen eingebettet. Ebenso verwendet Guile, um die Skriptsprache für die Desktop-Umgebung GNOME sein und GNOME hat immer noch ein Projekt, das Guile Bindungen bietet seine Bibliothek Stack.
  • Elk Scheme wird von Synopsys als Skriptsprache für seine Technologie-CAD-Tools verwendet.
  • Shiro Kawai, Senior Programmer auf dem Film Final Fantasy: Die Mächte in dir, als Skriptsprache für die Verwaltung der Echtzeit-Rendering-Engine verwendet Scheme.
  • Google App Inventor verwendet Schema, in dem Kawa wird die Scheme-Code auf Byte-Codes für die Java Virtual Machine auf Android-Geräten laufen zu kompilieren.
  Like 0   Dislike 0
Vorherige Artikel Sowjetischen U-Boot S-13
Nächster Artikel SIAI-Marchetti S.205
Bemerkungen (0)
Keine Kommentare

Fügen Sie einen Kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Zeichen übrig: 3000
captcha