Schema (Programmiersprache)

Planen
Lambda lc.svg
Paradigmen Multi-Paradigma: funktional, Imperativ, Meta
Familie Lispeln
Entworfen von Guy L. Steele
Gerald Jay Sussman
Erstmals erschienen 1975; Vor 47 Jahren
Stabile Version
R7RS / 2013; Vor 9 Jahren
Disziplin tippen Dynamisch, latent, stark
Zielfernrohr Lexikalisch
Dateiname -Erweiterungen .scm, .ss
Webseite www.Scheme-Berichte.org
Haupt Implementierungen
Viele
(Siehe Schema -Implementierungen)
Beeinflusst von
Algol, Lispeln, Mdl
Beeinflusst
Clojure, Common Lisp, Dylan, EULISP, Haskell, Hüpfen, JavaScript, Julia, Lua, Multilisp, Python, R, Schläger, Rubin, Rost, S, Scala, T
  • Schema bei Wikibooks

Planen ist ein Dialekt des Lispeln Familie von Programmiersprachen. Schema wurde in den 1970er Jahren in der geschaffen MIT AI Lab und von seinen Entwicklern veröffentlicht, Guy L. Steele und Gerald Jay Sussman, über eine Reihe von Memos, die jetzt als die bekannt sind Lambda Papiere. Es war der erste Dialekt von Lisp zum Auswahl lexikalischer Bereich und die erste, die Implementierungen durchführen müssen Schwanzoptimierungeine stärkere Unterstützung für funktionelle Programmierungen und damit verbundene Techniken wie rekursive Algorithmen. Es war auch eine der ersten Programmiersprachen, die sie unterstützen, erste Klasse Kontinuationen. Es hatte einen erheblichen Einfluss auf die Anstrengung, die zur Entwicklung von führte Common Lisp.[1]

Die Programmsprache ist im Beamten standardisiert IEEE Standard[2] und ein de facto Standard genannt Überarbeitetn Bericht über das algorithmische Sprachschema (RnRs). Ein weit verbreiteter Standard ist R5RS (1998).[3] Der zuletzt ratifizierte Schema-Standard ist "R7RS-Small" (2013).[4] Der expansivere und modulare R6Rs wurde 2007 ratifiziert.[5] Beide verfolgen ihre Abstammung von R5Rs; Die folgende Zeitleiste spiegelt die chronologische Reihenfolge der Ratifizierung wider.

Geschichte

Ursprünge

Das Programm begann in den 1970er Jahren als Versuch zu verstehen Carl Hewitt's SchauspielermodellFür welchen Zweck haben Steele und Sussman einen "winzigen Lisp -Dolmetscher" verwendet MacLisp und dann "Mechanismen zum Erstellen von Schauspielern und Senden von Nachrichten hinzugefügt".[6] Das Programm wurde ursprünglich "Schemer" in der Tradition anderer bezeichnet Lispeln-Elebed Sprachen wie z. Planer oder Conniver. Der aktuelle Name resultierte aus der Verwendung der Autoren der Autoren der Sein Betriebssystem, die die Dateinamen auf zwei Komponenten von höchstens sechs Zeichen beschränkten. Derzeit wird "Schemer" häufig verwendet, um sich auf einen Schema -Programmierer zu beziehen.

R6rs

Ein neuer Sprachstandardisierungsprozess begann im Scheme -Workshop 2003 mit dem Ziel, einen R6RS -Standard im Jahr 2006 zu erzeugen. Dieser Prozess brach mit dem früheren R ausnRS -Ansatz der Einstimmigkeit.

R6RS verfügt über ein Standardmodulsystem, das eine Spaltung zwischen der Kernsprache und der Bibliotheken ermöglicht. Eine Reihe von Entwürfen der R6RS -Spezifikation wurde veröffentlicht, wobei die endgültige Version R5.97RS beträgt. Eine erfolgreiche Abstimmung führte zur Ratifizierung des neuen Standards, der am 28. August 2007 bekannt gegeben wurde.[5]

Derzeit die neuesten Veröffentlichungen verschiedener Schema -Implementierungen[7] Unterstützen Sie den R6RS -Standard. Es gibt eine tragbare Referenzimplementierung der vorgeschlagenen implizit phasenweise Bibliotheken für R6Rs, die als Psyntax bezeichnet werden und die sich bei verschiedenen älteren Schema -Implementierungen ordnungsgemäß belastet und startet.[8]

Ein Merkmal von R6Rs ist der Record-Descriptor (RTD). Wenn ein RTD erstellt und verwendet wird, kann die Datensatztypdarstellung das Speicherlayout anzeigen. Es berechnete auch die Objektfeld -Bitmaske und das veränderliche Schema -Objektfeld -Bitmasken und half dem Müllsammler, was mit den Feldern zu tun ist, ohne die gesamte Felderliste zu durchqueren, die im RTD gespeichert sind. Mit RTD können Benutzer das grundlegende RTD erweitern, um ein neues Datensatzsystem zu erstellen.[9]

R6Rs führt zahlreiche signifikante Veränderungen in der Sprache ein.[10] Der Quellcode ist jetzt in angegeben in Unicodeund eine große Untergruppe von Unicode -Zeichen kann jetzt in Schema -Symbolen und erscheinen Kennungenund es gibt andere geringfügige Änderungen an den lexikalischen Regeln. Die Zeichendaten werden jetzt auch in Unicode angegeben. Viele Standardverfahren wurden in die neuen Standardbibliotheken verschoben, die selbst eine große Ausdehnung des Standards bilden und Verfahren und syntaktische Formen enthalten, die früher nicht Teil des Standards waren. Es wurde ein neues Modulsystem eingeführt, und Systeme für die Ausnahmebehandlung sind jetzt standardisiert. Syntax-Rules wurde durch eine expressionstivere syntaktische Abstraktionsanlage (Syntax-Case) ersetzt, mit der die Verwendung des gesamten Schemas zur Makroerweiterungszeit verwendet werden kann. Konforme Implementierungen sind jetzt erforderlich Um das Schema voll zu unterstützen Numerischer Turmund die Semantik der Zahlen wurde erweitert, hauptsächlich in Richtung der Unterstützung für die IEEE 754 Standard für die numerische Darstellung des schwimmenden Punktes.

R7rs

Der R6RS -Standard hat Kontroversen verursacht, weil einige ihn als Abkehr von der minimalistischen Philosophie betrachten.[11][12] Im August 2009 kündigte das Programm Lenkungsausschuss des Programms, das den Standardisierungsprozess überwacht, seine Absicht an, das Aufteilungsschema in zwei Sprachen zu empfehlen: eine große moderne Programmiersprache für Programmierer; und eine kleine Version, eine Untergruppe der großen Version, die den von Pädagogen und Gelegenheitsimpädagogen geloten Minimalismus beibehält.[13] Zwei Arbeitsgruppen wurden geschaffen, um an diesen beiden neuen Versionen des Schemas zu arbeiten. Die Site Reports Process -Site verfügt über Links zu den Chartas, öffentlichen Diskussionen der Arbeitsgruppen und zum Ausgabe von Tracking -Systemen.

Der neunte Entwurf von R7Rs (kleine Sprache) wurde am 15. April 2013 zur Verfügung gestellt.[14] Eine Abstimmung, die diesen Entwurf ratifiziert, schloss am 20. Mai 2013.[15] Und der Abschlussbericht ist seit dem 6. August 2013 verfügbar und beschreibt "die" kleine "Sprache dieser Bemühungen: Daher kann er nicht als Nachfolger von R6Rs isoliert betrachtet werden.[4]

1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 2010 2015 2020
Lisp 1, 1,5, Lisp 2(verlassen)
 MacLisp
 Interisp
 Mdl
 Lisp Machine Lisp
 Planen R5rs R6rs R7Rs klein
 NULL
ZIL (Zork Implementierungssprache)
 Franz Lisp
 Common Lisp
 Le lisp
 MIT -Schema
 T
 Chez Schema
 EMACS Lisp
 Autolisp
 Picolisp
 EULISP
 ISLISP
 OpenLisp
 PLT -Schema  Schläger
 Gnu Guile
 Visual Lisp
 Clojure
 Bogen
 Lfe
 Hy

Unterscheidungsmerkmale

Schema ist in erster Linie ein Funktionelle Programmierung Sprache. Es teilt viele Merkmale mit anderen Mitgliedern der LISP -Programmiersprache. Die sehr einfache Syntax des Schemas basiert auf S-Expressionen, Klammern von Listen, in denen ein Präfixbetreiber von seinen Argumenten folgt. Programmprogramme bestehen somit aus Sequenzen verschachtelter Listen. Listen sind auch die Hauptdatenstruktur im Schema, was zu einer engen Äquivalenz zwischen Quellcode und Datenformaten führt (Homoikonizität). Programmprogramme können problemlos Teile des Schemascode dynamisch erstellen und bewerten.

Das Vertrauen in Listen als Datenstrukturen wird von allen Lisp -Dialekten gemeinsam genutzt. Schema erbt eine reiche Reihe von Listenverarbeitung Primitive wie Nachteile, Wagen und CDR von seinen Lisp -Vorläufern. Schema verwendet streng aber Dynamisch typisierte Variablen und unterstützt Erste Klassenverfahren. Daher können Verfahren als Werte für Variablen zugewiesen oder als Argumente an Verfahren übergeben werden.

Dieser Abschnitt konzentriert sich hauptsächlich auf innovative Merkmale der Sprache, einschließlich der Merkmale, die das Schema von anderen LISPs unterscheiden. Sofern nicht anders angegeben, beziehen sich die Beschreibungen der Merkmale auf den R5RS -Standard. In Beispielen in diesem Abschnitt wird die Notation "===> Ergebnis" verwendet, um das Ergebnis der Bewertung des Ausdrucks auf der unmittelbaren vorhergehenden Linie anzuzeigen. Dies ist die gleiche Konvention, die in R5Rs verwendet wird.

Minimalismus

Schema ist eine sehr einfache Sprache, die viel einfacher zu implementieren ist als viele andere vergleichbare Sprachen Ausdruckskraft.[16] Diese Leichtigkeit ist auf die Verwendung von zugeschrieben Lambda -Kalkül Ein Großteil der Syntax der Sprache aus primitiveren Formen abzuleiten. Zum Beispiel der 23 S-expressionsbasierten syntaktischen Konstrukte, die im R5RS-Schema-Standard definiert sind, werden 14 als abgeleitete oder Bibliotheksformen klassifiziert, die als Makros geschrieben werden können, die grundlegendere Formen beinhalten, hauptsächlich Lambda. Wie R5Rs (§3.1) sagt: "Das grundlegendste der variablen Bindungskonstrukte ist die Lambda -Expression, da alle anderen variablen Bindungskonstrukte in Bezug auf Lambda -Ausdrücke erklärt werden können."[3]

Grundlegende Formen: Definieren Sie, lambda, zitieren Sie, if, define-syntax, let-syntax, letrec-syntax, syntax-rules, set!
Abgeleitete Formen.

Beispiel: Ein Makro zum Implementieren Lassen als Ausdruck verwendet Lambda Um die variablen Bindungen durchzuführen.

(Definieren Sie Syntax Lassen  (Syntax-Rules ()  ((Lassen ((var Expr) ...) Karosserie ...)  ((Lambda (var ...) Karosserie ...) Expr ...)))) 

Also verwendet Lassen Wie oben definiert, würde eine Schema -Implementierung neu schreiben "(sei ((a 1) (b 2)) (+ b a))" wie "((Lambda (a b) (+ b a)) 1 2)", wodurch die Aufgabe der Implementierung auf die Codierungsverfahren reduziert wird.

1998 bemerkten Sussman und Steele, dass der Minimalismus des Schemas kein bewusstes Designziel war, sondern das unbeabsichtigte Ergebnis des Designprozesses. "Wir haben tatsächlich versucht, etwas kompliziertes und entdeckte, zufällige zu bauen, dass wir versehentlich etwas entworfen hatten, das all unsere Ziele erreicht hat, aber viel einfacher war als wir beabsichtigt hatten ... Wir haben festgestellt, dass der Lambda -Kalkül - ein kleiner, einfacher Formalismus - - ein einfacher Formalismus - könnte als Kern einer leistungsstarken und ausdrucksstarken Programmiersprache dienen. "[6]

Lexikalischer Bereich

Wie die meisten modernen Programmiersprachen und im Gegensatz zu früheren LISPs wie z. MacLispDas Schema ist lexikalisch abgeschottet: Alle möglichen variablen Bindungen in einer Programmeinheit können analysiert werden, indem der Text der Programmeinheit gelesen wird, ohne die Kontexte zu berücksichtigen, in denen es aufgerufen werden kann. Dies steht im Gegensatz zum dynamischen Scoping, das für frühe Lisp -Dialekte charakteristisch war, da die Verarbeitungskosten mit den primitiven textuellen Substitutionsmethoden verbunden sind, die zur Implementierung lexikalischer Scoping -Algorithmen bei Compilern und Dolmetschern des Tages verwendet wurden. In diesen LISPs war es für einen Hinweis auf a durchaus möglich freie Variable In einem Verfahren, um sich je nach Kontext des Aufrufs auf ziemlich unterschiedliche Bindungen zu beziehen.

Der Anstoß, lexikalische Scoping, das in den frühen 1970er Jahren ein ungewöhnliches Scoping -Modell war Algol. Er schlug das vor Algolartige lexikalische Scoping-Mechanismen würde helfen, ihr anfängliches Ziel der Implementierung zu erkennen Hewitts Schauspielermodell in Lisp.[6]

Die wichtigsten Erkenntnisse zur Einführung des lexikalischen Scops in einen Lisp -Dialekt wurden in Sussman und Steeles Lambda -Papier von 1975, "Schema: Ein Dolmetscher für erweiterte Lambda Calculus", populär gemacht.[17] wo sie das Konzept des lexikalische Schließung (auf Seite 21), der in einem beschrieben worden war KI -Memo 1970 von Joel Moses, wer hat die Idee zugeschrieben Peter J. Landin.[18]

Lambda -Kalkül

Alonzo -KircheDie mathematische Notation, der Lambda Calculus, hat Lisps Verwendung von "Lambda" als Schlüsselwort zur Einführung eines Verfahrens sowie die Beeinflussung der Entwicklung von inspiriert Funktionelle Programmierung Techniken, die den Einsatz von beinhalten Funktionen höherer Ordnung in Lisp. Frühe LISPs waren jedoch keine geeigneten Ausdrücke des Lambda -Kalküls aufgrund ihrer Behandlung von freie Variablen.[6]

Ein formales Lambda -System hat Axiome und eine vollständige Berechnungsregel. Es ist hilfreich für die Analyse unter Verwendung mathematischer Logik und Tools. In diesem System kann die Berechnung als Richtungsabzug angesehen werden. Die Syntax des Lambda -Kalküls folgt den rekursiven Ausdrücken von X, Y, Z, ..., Klammern, Räumen, der Periode und dem Symbol λ.[19] Die Funktion der Lambda -Berechnung umfasst: Erstens als Ausgangspunkt einer leistungsstarken mathematischen Logik. Zweitens kann es die Anforderung von Programmierern verringern, die Implementierungsdetails zu berücksichtigen, da sie zur Nachahmung der Maschinenbewertung verwendet werden kann. Schließlich erzeugte die Lambda-Berechnung eine erhebliche Meta-Theorie.[20]

Die Einführung des lexikalischen Bereichs löste das Problem durch eine Äquivalenz zwischen einigen Formen der Lambda -Notation und ihrem praktischen Ausdruck in einer arbeitenden Programmiersprache. Sussman und Steele zeigten, dass die neue Sprache verwendet werden konnte, um alle imperativen und deklarativen Semantik anderer Programmiersprachen einschließlich Algol und Forranund der dynamische Umfang anderer LISPs durch Verwendung von Lambda -Ausdrücken nicht als einfache Verfahren, sondern als "Kontrollstrukturen und Umgebungsmodifikatoren".[21] Sie stellten vor Fortsetzungsstil Zusammen mit ihrer ersten Beschreibung des Schemas in der ersten Lambda -Zeitungen und in nachfolgenden Papieren zeigten sie die rohe Kraft dieser praktischen Verwendung von Lambda -Kalkül.

Blockstruktur

Das Schema erbt insbesondere seine Blockstruktur von früheren blockstrukturierten Sprachen Algol. Im Schema werden Blöcke um drei implementiert Bindungskonstrukte: Lassen, Lassen* und letrec. Zum Beispiel schafft das folgende Konstrukt a Block in dem ein Symbol nannte var ist an die Zahl 10 gebunden:

(definieren var "Gans") ;; Jeder Verweis auf Var hier ist an "Gans" gebunden (Lassen ((var 10))  ;; Aussagen gehen hier. Jeder Verweis auf Var hier ist an 10 gebunden.  ) ;; Jeder Verweis auf Var hier ist an "Gans" gebunden 

Blöcke können sein verschachtelt willkürlich komplexe Blockstrukturen gemäß dem Bedarf des Programmierers zu erstellen. Die Verwendung von Blockstrukturierung zur Schaffung lokaler Bindungen lindert das Risiko von Namespace -Kollision das kann sonst auftreten.

Eine Variante von Lassen, Lassen*Ermöglicht Bindungen, um sich auf Variablen zu beziehen, die zuvor im selben Konstrukt definiert wurden, somit:

(Lassen* ((var1 10)  (var2 (+ var1 12)))  ;; Die Definition von Var1 konnte sich jedoch nicht auf Var2 beziehen  ) 

Die andere Variante, letrec, ist so konzipiert, dass er aktiviert ist gegenseitig rekursiv Verfahren aneinander gebunden sein.

;; Berechnung der männlichen und weiblichen Sequenzen von Hofstadter als eine Liste von Paaren (definieren (Hofstadter-male-weis n)  (letrec ((weiblich (Lambda (n) 		 (wenn (= n 0) 			 1 			 (- n (männlich (weiblich (- n 1))))))) 	 (männlich (Lambda (n) 		 (wenn (= n 0) 		 0 		 (- n (weiblich (männlich (- n 1)))))))  (Lassen Schleife ((i 0))  (wenn (> i n) 	 '() 	 (Nachteile (Nachteile (weiblich i) 		 (männlich i)) 		(Schleife (+ i 1))))))) (Hofstadter-male-weis 8) ===> ((1 . 0) (1 . 0) (2 . 1) (2 . 2) (3 . 2) (3 . 3) (4 . 4) (5 . 4) (5 . 5)) 

(Sehen Hofstadters männliche und weibliche Sequenzen Für die in diesem Beispiel verwendeten Definitionen.)

Alle Verfahren, die in einer einzigen gebunden sind letrec kann sich unter Namen sowie auf Werte von Variablen, die zuvor im gleichen definiert wurden, aufeinander beziehen letrec, aber sie können sich nicht beziehen Werte später im gleichen definiert letrec.

Eine Variante von Lassen, die Form "named let", hat eine Kennung nach dem Lassen Stichwort. Dies bindet die Let -Variablen an das Argument eines Verfahrens, dessen Name der angegebene Kennung ist und dessen Körper der Körper der Let -Form ist. Der Körper kann wie gewünscht wiederholt werden, indem der Verfahren aufgerufen wird. Der benannte LET wird häufig zur Implementierung der Iteration verwendet.

Beispiel: Ein einfacher Zähler

(Lassen Schleife ((n 1))  (wenn (> n 10)  '()  (Nachteile n 	 (Schleife (+ n 1))))) ===> (1 2 3 4 5 6 7 8 9 10) 

Wie bei jedem Verfahren im Schema ist das im benannte LET erstellte Verfahren ein erstklassiges Objekt.

Richtige Schwanzrekursion

Schema hat ein Iterationskonstrukt, tun, aber es ist mehr idiomatisch im Schema zu verwenden Schwanzrekursion ausdrücken Wiederholung. Implementierungen des Standard-Konformierungsschemas sind erforderlich, um Schwanzaufrufe zu optimieren, um eine unbegrenzte Anzahl von aktiven Schwanzaufrufen zu unterstützen (R5RS § 3.5).[3]- Eine Eigenschaft, die der Schemebericht beschreibt als richtige Schwanzrekursion- Es ist sicher, dass Schema -Programmierer iterative Algorithmen mit rekursiven Strukturen schreiben, die manchmal intuitiver sind. Schwanz rekursive Verfahren und die genannt Lassen Formular bietet Unterstützung für die Iteration mithilfe der Schwanzrekursion.

;; Erstellen einer Liste von Quadraten von 0 bis 9: ;; Hinweis: Die Schleife ist einfach ein willkürliches Symbol, das als Etikett verwendet wird. Jedes Symbol reicht aus. (definieren (Quadratliste n)  (Lassen Schleife ((i n) (res '()))  (wenn (< i 0)  res  (Schleife (- i 1) (Nachteile (* i i) res))))) (Quadratliste 9) ===> (0 1 4 9 16 25 36 49 64 81) 

Erstklassige Kontinuationen

Kontinuationen im Schema sind erstklassige Objekte. Schema liefert das Verfahren Call-with-Strom-Einsatz (auch bekannt als Rufen Sie/cc. (R5RS Sek. 6.4)[3] Erstklassige Kontinuationen ermöglichen es dem Programmierer, nicht-lokale zu erstellen Kontrollkonstrukte wie zum Beispiel Iteratoren, Coroutinen, und Backtracking.

Kontinuationen können verwendet werden, um das Verhalten von zu emulieren Rückgabeanweisungen in imperativen Programmiersprachen. Die folgende Funktion Find-First, gegebene Funktion Func und Liste lst, gibt das erste Element zurück x in lst so dass (Func x) Gibt wahr zurück.

(definieren (Find-First Func lst)  (Call-with-Strom-Einsatz  (Lambda (sofort zurückkehren)  (für jeden (Lambda (x) 		 (wenn (Func x) 		 (sofort zurückkehren x))) 	 lst)  #f))) (Find-First ganze Zahl? '(1/2 3/4 5.6 7 8/9 10 11)) ===> 7 (Find-First Null? '(1 2 3 4)) ===> #f 

Das folgende Beispiel, das Puzzle eines herkömmlichen Programmierers, zeigt, dass das Schema Kontinuationen als erstklassige Objekte behandeln kann, sie an Variablen binden und als Argumente an Verfahren weitergeben können.

(Lassen* ((Yin  ((Lambda (CC) (Anzeige "@") CC) (Call-with-Strom-Einsatz (Lambda (c) c))))  (Yang  ((Lambda (CC) (Anzeige "*") CC) (Call-with-Strom-Einsatz (Lambda (c) c)))))  (Yin Yang)) 

Bei der Ausführung zeigt dieser Code eine Zählsequenz an: @*@**@***@****@*****@******@*******@******** ...

Gemeinsamer Namespace für Verfahren und Variablen

Im Gegensatz zu gemeinsamer LISP teilen alle Daten und Verfahren im Schema einen gebräuchlichen Namespace, während in Common Lispeln Funktionen und Daten haben separate Namespaces Ermöglichen Sie es, dass eine Funktion und eine Variable denselben Namen haben und eine besondere Notation benötigen, um eine Funktion als Wert zu beziehen. Dies wird manchmal als "bezeichnet"Lisp-1 gegen LISP-2"Unterscheidung, bezieht sich auf den einheitlichen Namespace des Schemas und die separaten Namespaces von gemeinsamem Lisp.[22]

Im Schema können die gleichen Primitiven zur Manipulation und Bindung von Daten verwendet werden, um Verfahren zu binden. Es gibt kein Äquivalent zu Common Lisps's Defun und #' Primitive.

;; Variable an eine Zahl gebunden: (definieren f 10) f ===> 10 ;; Mutation (Veränderung des gebundenen Wertes) (einstellen! f (+ f f 6)) f ===> 26 ;; Zuweisen einer Prozedur derselben Variablen: (einstellen! f (Lambda (n) (+ n 12))) (f 6) ===> 18 ;; Zuweisen des Ergebniss eines Ausdrucks derselben Variablen: (einstellen! f (f 1)) f ===> 13 ;; Funktionelle Programmierung: (anwenden + '(1 2 3 4 5 6)) ===> 21 (einstellen! f (Lambda (n) (+ n 100))) (Karte f '(1 2 3)) ===> (101 102 103) 

Implementierungsstandards

Dieses Unterabschnitt dokumentiert entwerfen Entscheidungen, die über die Jahre getroffen wurden, die das Schema einen bestimmten Charakter gegeben haben, aber nicht die direkten Ergebnisse des ursprünglichen Designs sind.

Numerischer Turm

Das Schema gibt einen vergleichsweise vollständigen Satz numerischer Datenatypen an, einschließlich Komplex und rational Typen, die im Schema als numerischer Turm bekannt sind (R5RS § 6.2[3]). Der Standard behandelt diese als Abstraktionen und verpflichtet den Implementierer nicht zu bestimmten internen Darstellungen.

Zahlen können die Qualität der Genauigkeit haben. Eine genaue Zahl kann nur durch eine Folge von exakten Operationen erzeugt werden, die andere genaue Zahlen beinhalten - die INXAKTION ist somit ansteckend. Der Standard gibt an, dass zwei implementierende Implementierungen äquivalente Ergebnisse für alle Vorgänge erzielen müssen, die zu genauen Zahlen führen.

Der R5RS -Standard gibt Verfahren an exakt-> ungenau und ungenau-> genau Dies kann verwendet werden, um die Genauigkeit einer Zahl zu ändern. ungenau-> genau erzeugt "die genaue Zahl, die dem Argument numerisch am nächsten ist". exakt-> ungenau erzeugt "die ungenaue Zahl, die dem Argument numerisch am nächsten ist". Der R6RS -Standard lässt diese Verfahren aus dem Hauptbericht aus, legt sie jedoch als R5RS -Kompatibilitätsverfahren in der Standardbibliothek (RNRS R5RS (6)) an.

Im R5RS -Standard sind Schema -Implementierungen nicht erforderlich, um den gesamten numerischen Turm zu implementieren, aber sie müssen "eine kohärente Untergruppe implementieren, die sowohl mit den Zwecken der Umsetzung als auch dem Geist der Schema -Sprache übereinstimmt" (R5RS § 6.2.3).[3] Der neue R6RS -Standard erfordert die Implementierung des gesamten Turms und "genaue ganzzahlige Objekte und genaue rationale Zahlobjekte von praktisch unbegrenzten Größe und Präzision und um bestimmte Verfahren zu implementieren ... damit sie immer genaue Ergebnisse zurückgeben, wenn genaue Argumente angegeben werden" (R6Rs Sek. 3.4, § 11.7.1).[5]

Beispiel 1: genaue Arithmetik in einer Implementierung, die die genauen rationalen komplexen Zahlen unterstützt.

;; Summe von drei rationalen reellen Zahlen und zwei rationalen komplexen Zahlen (definieren x (+ 1/3 1/4 -1/5 -1/3i 405/50+2/3i)) x ===> 509/60+1/3i ;; Überprüfen Sie die Genauigkeit. (genau? x) ===> #t 

Beispiel 2: Gleiche Arithmetik in einer Implementierung, die weder genaue rationale Zahlen noch komplexe Zahlen unterstützt, aber reelle Zahlen in rationaler Notation akzeptiert.

;; Summe von vier rationalen reellen Zahlen (definieren xr (+ 1/3 1/4 -1/5 405/50)) ;; Summe von zwei rationalen reellen Zahlen (definieren xi (+ -1/3 2/3)) xr ===> 8.48333333333333 xi ===> 0,333333333333333 ;; Überprüfen Sie die Genauigkeit. (genau? xr) ===> #f (genau? xi) ===> #f 

Beide Implementierungen entsprechen dem R5RS -Standard, aber die zweite entspricht nicht R6Rs, da er den vollständigen numerischen Turm nicht implementiert.

Verzögerte Bewertung

Schema unterstützt eine verzögerte Bewertung durch die Verzögerung Form und das Verfahren Macht.

(definieren a 10) (definieren eval-aplus2 (Verzögerung (+ a 2))) (einstellen! a 20) (Macht eval-aplus2) ===> 22 (definieren Eval-aplus50 (Verzögerung (+ a 50))) (Lassen ((a 8))  (Macht Eval-aplus50)) ===> 70 (einstellen! a 100) (Macht eval-aplus2) ===> 22 

Der lexikalische Kontext der ursprünglichen Definition des Versprechens bleibt erhalten, und sein Wert bleibt auch nach der ersten Verwendung von erhalten Macht. Das Versprechen wird immer nur einmal bewertet.

Diese Primitiven, die als Werte produzieren oder handhaben, die als als bekannt sind Versprechen, kann verwendet werden, um Fortgeschrittene zu implementieren faule Bewertung Konstrukte wie Ströme.[23]

Im R6RS -Standard sind dies keine Primitiven mehr, sondern werden als Teil der R5RS -Kompatibilitätsbibliothek (RNRS R5RS (6)) bereitgestellt.

In R5Rs eine vorgeschlagene Implementierung von Verzögerung und Macht wird gegeben, das Versprechen als Verfahren ohne Argumente (a Thunk) und Verwendung Memoisierung Um sicherzustellen, dass es immer noch einmal bewertet wird, unabhängig von der Anzahl der Zeiten Macht wird genannt (R5RS § 6.4).[3]

SRFI 41 ermöglicht die Expression sowohl endlicher als auch unendlicher Sequenzen mit außergewöhnlicher Wirtschaft. Zum Beispiel ist dies eine Definition der Fibonacci-Folge Verwenden der in SRFI 41 definierten Funktionen:[23]

;; Definieren Sie die Fibonacci -Sequenz: (definieren Fibs  (Stream-Cons 0  (Stream-Cons 1  (Stream-Map +  Fibs  (Stream-Cdr Fibs))))) ;; Berechnen Sie die hundertste Zahl in der Sequenz: (Stream-Ref Fibs 99) ===>  218922995834555169026 

Auftrag der Bewertung von Verfahrensargumenten

Die meisten LISPs geben eine Auswertung der Bewertung für Verfahrensargumente an. Schema nicht. Auswertung der Bewertung-einschließlich der Reihenfolge, in der der Ausdruck in der Operatorposition bewertet wird-kann durch eine Implementierung auf Call-by-A-Basis ausgewählt werden, und die einzige Einschränkung ist: Operand -Ausdrücke sind eingeschränkt, um mit einer sequentiellen Auswertung zu übereinstimmen. " (R5RS Sek. 4.1.3)[3]

(Lassen ((ev (Lambda(n) (Anzeige "Bewertung")  (Anzeige (wenn (Verfahren? n) "Verfahren" n))  (Neue Zeile) n)))  ((ev +) (ev 1) (ev 2))) ===> 3 

EV ist ein Verfahren, das das daran verabschiedete Argument beschreibt, und gibt dann den Wert des Arguments zurück. Im Gegensatz zu anderen LISPs ist das Auftreten eines Ausdrucks in der Operatorposition (dem ersten Element) eines Schemasausdrucks recht legal, solange das Ergebnis des Ausdrucks in der Operatorposition ein Verfahren ist.

Wenn Sie das Verfahren " +" aufrufen, um 1 und 2 hinzuzufügen, können die Ausdrücke (ev +), (ev 1) und (ev 2) in beliebiger Reihenfolge bewertet werden . Somit können die folgenden drei Zeilen in beliebiger Reihenfolge nach Standardschema angezeigt werden, wenn der obige Beispielcode ausgeführt wird, obwohl der Text einer Zeile möglicherweise nicht mit einer anderen verschachtelt ist, da dies die sequentielle Bewertungsbeschränkung verletzt.

Bewertung 1
Bewertung 2
Bewertung des Verfahrens

Hygienische Makros

Im R5RS -Standard und auch in späteren Berichten kann die Syntax des Schemas leicht über das Makrosystem erweitert werden. Der R5RS -Standard führte ein leistungsstarkes hygienisches Makrosystem ein, mit dem der Programmierer der Sprache neue syntaktische Konstrukte hinzufügen kann Musteranpassung Sublanguage (R5RS Sec 4.3).[3] Zuvor war das hygienische Makrosystem in einen Anhang des R4RS die Sprache.[24]

Implementierungen des hygienischen Makrosystems, auch genannt Syntax-Rulessind erforderlich, um den lexikalischen Scoping des Rests der Sprache zu respektieren. Dies wird durch spezielle Namensregeln für die Benennung und Scoping für die Makroerweiterung gewährleistet und vermeidet häufige Programmierfehler, die in den Makrosystemen anderer Programmiersprachen auftreten können. R6RS gibt ein ausgefeilteres Transformationssystem an, Syntax-Case, das seit einiger Zeit als Sprachweiterung zum R5RS -Schema erhältlich ist.

;; Definieren Sie ein Makro, um eine Variante von "if" mit einer Mehrfachausdruck zu implementieren ;; wahrer Zweig und kein falscher Zweig. (Definieren Sie Syntax Wenn  (Syntax-Rules ()  ((Wenn Pred Exp Exps ...)  (wenn Pred (Start Exp Exps ...))))) 

Aufrufe von Makros und Verfahren haben eine enge Ähnlichkeit-beide sind S-Expressionen-, aber sie werden unterschiedlich behandelt. Wenn der Compiler im Programm auf eine S-Expression trifft, prüft er zunächst, ob das Symbol als syntaktisches Schlüsselwort im aktuellen lexikalischen Bereich definiert ist. In diesem Fall versucht es, das Makro zu erweitern und die Elemente im Schwanz der S-Expression als Argumente zu behandeln, ohne Code zu kompilieren, um sie zu bewerten, und dieser Vorgang wird rekursiv wiederholt, bis keine Makroaufrufe bestehen. Wenn es sich nicht um ein syntaktisches Schlüsselwort handelt, erstellt der Compiler Code, um die Argumente im Schwanz der S-Expression zu bewerten und dann die vom Symbol am Kopf des S-Expression dargestellte Variable zu bewerten und als Verfahren mit dem zu nennen bewertete Schwanzausdrücke als tatsächliche Argumente.

Die meisten Schema -Implementierungen bieten auch zusätzliche Makrosysteme. Unter den beliebten sind syntaktische Schließungen, explizite Umbenennung von Makros und Definieren Sie Makro, ein nicht hygienisches Makrosystem ähnlich wie Defmacro System zur Verfügung gestellt Common Lisp.

Die Unfähigkeit, anzugeben, ob ein Makro hygienisch ist oder nicht, ist eine der Mängel des Makrosystems. Alternative Modelle für die Expansion wie Umfangssätze bieten eine potenzielle Lösung.[25]

Umgebungen und eval

Vor R5Rs hatte das Schema kein Standard -Äquivalent zur bewerten Verfahren, das in anderen LISPs allgegenwärtig ist, obwohl das erste Lambda -Papier beschrieben wurde auswerten als "ähnlich der Lisp -Funktion Eval" "[17] und der erste überarbeitete Bericht im Jahr 1978 ersetzte dies durch beifügen, was zwei Argumente nahm. Die zweiten, dritten und vierten überarbeiteten Berichte ließ ein Äquivalent von weggelassen bewerten.

Der Grund für diese Verwirrung ist, dass im Schema mit dem lexikalischen Scoping das Ergebnis der Bewertung eines Ausdrucks davon abhängt, wo er bewertet wird. Beispielsweise ist nicht klar, ob das Ergebnis der Bewertung des folgenden Ausdrucks 5 oder 6 betragen sollte:[26]

(Lassen ((Name '+))  (Lassen ((+ *))  (auswerten (aufführen Name 2 3)))) 

Wenn es in der äußeren Umgebung bewertet wird, wo Name ist definiert, das Ergebnis ist die Summe der Operanden. Wenn es in der inneren Umgebung bewertet wird, in der das Symbol "+" an den Wert des Verfahrens "*" gebunden wurde, ist das Ergebnis das Produkt der beiden Operanden.

R5RS löst diese Verwirrung durch, indem drei Verfahren angegeben werden, die Umgebungen zurückgeben und ein Verfahren bereitstellen bewerten Das erfordert eine S-Expression und eine Umgebung und bewertet den Ausdruck in der umgebenden Umgebung. (R5RS Sek. 6.5)[3] R6Rs erweitert dies durch Bereitstellung eines Verfahrens namens Umgebung durch die der Programmierer genau angeben kann, welche Objekte in die Bewertungsumgebung importieren sollen.

Mit dem modernen Schema (normalerweise mit R5Rs kompatibel), um diesen Ausdruck zu bewerten, muss man eine Funktion definieren auswerten das kann so aussehen:

(definieren (auswerten Expr)  (bewerten Expr (Interaktionsumgebung))) 

Interaktionsumgebung ist das globale Umfeld des Dolmetschers.

Behandlung nicht-Boolen-Werte in booleschen Ausdrücken

In den meisten LISP -Dialekten einschließlich Common Lisp, durch Konvention des Wertes NULL bewertet den Wert falsch in einem booleschen Ausdruck. Im Schema seit dem IEEE -Standard im Jahr 1991,[2] alle Werte außer #F, einschließlich NULL"S entsprechend im Schema, das als" () geschrieben wird ", bewerten Sie den Wert, der in einem booläischen Ausdruck wahr ist. (R5RS Sek. 6.3.1)[3]

Wo die Konstante, die den booleschen Wert von True darstellt, ist T In den meisten LISPs ist es im Schema #t.

Disjunktizität der primitiven Datenatypen

Im Schema sind die primitiven Datentypen disjunkt. Nur eines der folgenden Prädikate kann für jedes Schema -Objekt zutreffen: boolean?, Paar?, Symbol?, Nummer?, verkohlen?, String?, Vektor?, Hafen?, Verfahren?. (R5RS Sec 3.2)[3]

Im Gegensatz dazu überlappen sich die numerischen Datentypen im Gegensatz dazu. Zum Beispiel erfüllt ein ganzzahliger Wert alle alle ganze Zahl?, rational?, real?, Komplex? und Nummer? Prädikate gleichzeitig. (R5RS Sec 6.2)[3]

Äquivalenzprädikate

Das Schema hat drei verschiedene Arten von Äquivalenz zwischen willkürlichen Objekten, die von drei verschiedenen bezeichnet werden Äquivalenzprädikate, relationale Operatoren zum Testen der Gleichstellung, EQ?, EQV? und gleich?:

  • EQ? bewertet #f Es sei denn, seine Parameter repräsentieren das gleiche Datenobjekt im Speicher;
  • EQV? ist im Allgemeinen dasselbe wie EQ? behandelt aber primitive Objekte (z. B. Zeichen und Zahlen) besonders, so dass Zahlen, die denselben Wert darstellen, sind EQV? Auch wenn sie sich nicht auf dasselbe Objekt beziehen;
  • gleich? Vergleicht Datenstrukturen wie Listen, Vektoren und Zeichenfolgen, um festzustellen, ob sie kongruente Struktur haben und EQV? Inhalt. (R5RS Sek. 6.1)[3]

Typ -abhängige Äquivalenzoperationen existieren auch in Schema: String =? und String-ci =? Vergleichen Sie zwei Saiten (letztere führt einen Fall unabhängigen Vergleich durch); char =? und char-ci =? Vergleiche Zeichen; = Vergleicht Zahlen.[3]

Kommentare

Bis zum R5RS -Standard war der Standardkommentar in Schema ein Semikolon, was den Rest der Linie unsichtbar macht. Zahlreiche Implementierungen haben alternative Konventionen unterstützt, in denen Kommentare mehr als eine einzelne Zeile erweitern können, und der R6RS -Standard erlaubt zwei von ihnen: ein Ganzes S-Expression kann in einen Kommentar (oder "kommentiert") durch Vorgehen mit ihm mitgewandt werden #; (eingeführt in SRFI 62[27])) und ein multiline Kommentar oder "Blockkommentar" kann durch den umgebenden Text mit erstellt werden #| und |#.

Input-Output

Die Eingabe und Ausgabe des Schemas basieren auf dem Hafen Datentyp. (R5RS Sec 6.6)[3] R5RS definiert zwei Standardports, die mit den Verfahren zugänglich sind Aktueller Eingangsport und Aktueller Ausgangsport, die den Unix -Vorstellungen von entsprechen Standardeingangs- und Standardausgabe. Die meisten Implementierungen bieten auch aktuelles Error-Port. Umleitung von Eingabe und Standardausgabe wird im Standard durch Standardverfahren wie z. B. unterstützt mit Eingabe-FROM-Datei und mit Ausgangsmaterial. Die meisten Implementierungen bieten String-Ports mit ähnlichen Umleitungsfunktionen, sodass viele normale Eingabe-Output-Vorgänge anstelle von Dateien anstelle von Dateien durchgeführt werden können, wobei die in SRFI 6 beschriebenen Prozeduren verwendet werden können.[28] Der R6RS -Standard enthält viel anspruchsvollere und fähigere Portverfahren und viele neue Portypen.

Die folgenden Beispiele sind im strengen R5RS -Schema geschrieben.

Beispiel 1: Mit Ausgangsausgabe (Stromausgleich):

(Lassen ((Hallo0 (Lambda() (Anzeige "Hallo Welt") (Neue Zeile))))  (Hallo0)) 

Beispiel 2: als 1, aber das optionale Portargument für Ausgabeverfahren verwendet

(Lassen ((Hallo1 (Lambda (p) (Anzeige "Hallo Welt" p) (Neue Zeile p))))  (Hallo1 (Aktueller Ausgangsport))) 

Beispiel 3: Als 1, aber die Ausgabe wird in eine neu erstellte Datei umgeleitet

;; NB: With-Output-to-File ist eine optionale Prozedur in R5Rs (Lassen ((Hallo0 (Lambda () (Anzeige "Hallo Welt") (Neue Zeile))))  (mit Ausgangsmaterial "HelloWorldoutputFile" Hallo0)) 

Beispiel 4: als 2, jedoch mit explizitem Datei geöffnet und port in der Nähe, um die Ausgabe an Datei zu senden

(Lassen ((Hallo1 (Lambda (p) (Anzeige "Hallo Welt" p) (Neue Zeile p)))  (Ausgangsport (Open-Output-Datei "HelloWorldoutputFile")))  (Hallo1 Ausgangsport)  (Schließen Ausgangsport)) 

Beispiel 5: als 2, aber mit der Verwendung von Call-with-output-Datei zum Senden von Ausgabe an eine Datei.

(Lassen ((Hallo1 (Lambda (p) (Anzeige "Hallo Welt" p) (Neue Zeile p))))  (Call-With-Output-Datei "HelloWorldoutputFile" Hallo1)) 

Ähnliche Verfahren werden für die Eingabe vorgesehen. Das R5RS -Schema liefert die Prädikate Eingabeport? und Ausgangsport?. Für Zeicheneingang und Ausgabe, Schreibchar, Read-char, Peek-Char und Char-Ready? sind bereitgestellt. Für das Schreiben und Lesen von Schema -Ausdrücken bietet das Schema lesen und schreiben. Bei einem Lesevorgang ist das zurückgegebene Ergebnis das Objekt am Ende des Datei, wenn der Eingabeport das Ende der Datei erreicht hat. Dies kann mit dem Prädikat getestet werden EOF-Objekt?.

Zusätzlich zum Standard definiert SRFI 28 ein grundlegendes Formatierungsverfahren, das Common Lisps ähnelt Format Funktion, danach heißt es.[29]

Neudefinition von Standardverfahren

Im Schema sind die Verfahren an Variablen gebunden. Bei R5RS hat der Sprachstandard formell vorgeschrieben, dass Programme die variablen Bindungen integrierter Verfahren ändern können, was sie effektiv neu definiert. (R5RS "Sprachänderungen")[3] Zum Beispiel kann man sich erstrecken + Saiten sowie Zahlen zu akzeptieren, indem sie neu definiert werden:

(einstellen! +  (Lassen ((Original+ +))  (Lambda Args  (anwenden (wenn (oder (Null? Args) (String? (Wagen Args)))  Zeichenfolge  Original+)  Args)))) (+ 1 2 3) ===> 6 (+ "1" "2" "3") ===> "123" 

In R6Rs gehört jede Bindung, einschließlich der Standards, zu einer Bibliothek, und alle exportierten Bindungen sind unveränderlich. (R6RS Sec 7.1)[5] Aus diesem Grund ist die Neudefinition von Standardverfahren durch Mutation verboten. Stattdessen ist es möglich, ein anderes Verfahren unter dem Namen eines Standards zu importieren, was tatsächlich der Neudefinition ähnelt.

Nomenklatur und Namenskonventionen

Im Standardschema enthalten Prozeduren, die von einem Datenatyp in einen anderen konvertieren. "->" In ihrem Namen enden Prädikate mit einem "?", Und Verfahren, die den Wert bereits zugeteilter Daten ändern, das mit einem "!" Auf diese Konventionen folgt häufig Schema -Programmierer.

In formalen Kontexten wie Schema -Standards wird das Wort "Prozedur" in der Präferenz für "Funktion" verwendet, um auf einen Lambda -Ausdruck oder primitiven Verfahren zu verweisen. Bei normaler Verwendung werden die Wörter "Prozedur" und "Funktion" austauschbar verwendet. Die Anwendung von Verfahren wird manchmal formal als als Kombination.

Wie bei anderen LISPs der Begriff "Thunk"wird im Schema verwendet, um auf ein Verfahren ohne Argumente zu verweisen. Der Begriff" ordnungsgemäße Schwanzreursion "bezieht Schwanzaufrufe.

Die Form der Titel der Standarddokumente seit R3Rs ", überarbeitetn Bericht über das algorithmische Sprachschema "ist ein Hinweis auf den Titel des Algol 60 Standarddokument, "Überarbeiteter Bericht über das algorithmische Sprachalgol 60", die zusammenfassende Seite von R3Rs ist eng auf der Zusammenfassung des Algol 60 -Berichts modelliert.[30][31]

Überprüfung der Standardformen und -verfahren

Die Sprache ist in den Standards R5RS (1998) und R6Rs (2007) offiziell definiert. Sie beschreiben Standard "Forms": Schlüsselwörter und begleitende Syntax, die die Kontrollstruktur der Sprache liefern, und Standardverfahren, die gemeinsame Aufgaben ausführen.

Standardformen

Diese Tabelle beschreibt die Standardformen im Schema. Einige Formen erscheinen in mehr als einer Zeile, da sie nicht leicht in eine einzige Funktion in der Sprache eingeteilt werden können.

Formulare, die in dieser Tabelle mit "L" gekennzeichnet sind, werden als abgeleitete "Bibliotheksformulare" im Standard eingestuft und werden häufig als Makros implementiert, wobei in der Praxis grundlegende Formen verwendet werden, was die Implementierungsaufgabe erheblich erleichtert als in anderen Sprachen.

Standardformen im Sprach -R5RS -Schema
Zweck Formen
Definition definieren
Bindungskonstrukte lambda, do (l), lass (l), lass* (l), letrec (l)
Bedingte Bewertung if, cond (l), Fall (l) und (l) oder (l)
Sequentielle Bewertung Start (*)
Wiederholung lambda, do (l), named let (l)
Syntaktische Erweiterung Define-syntax, let-syntax, letrec-syntax, syntax-rules (r5rs), syntax-kase (r6rs)
Zitieren QUOTE ('), unquote (,), quasiiquote (`), unquotespspeln (,@)
Abtretung einstellen!
Verzögerte Bewertung Verzögerung (l)

Beachten Sie, dass Start wird als Bibliothekssyntax in R5Rs definiert, aber der Expander muss davon erfahren, um die Spleißfunktionalität zu erreichen. In R6Rs ist es keine Bibliothekssyntax mehr.

Standard Prozeduren

Die folgenden zwei Tabellen beschreiben die Standardverfahren im R5RS -Schema. R6Rs ist weitaus umfangreicher und eine Zusammenfassung dieser Art wäre nicht praktisch.

Einige Verfahren erscheinen in mehr als einer Zeile, da sie nicht einfach in eine einzige Funktion in der Sprache eingeteilt werden können.

Standardverfahren im Sprach -R5RS -Schema
Zweck Verfahren
Konstruktion Vektor, Make-Vector, Make-String, Liste
Äquivalenzprädikate EQ?, EQV?, Equal?, String =?, String-ci =?, char =?, char-ci =?
Typumwandlung Typ Vektor-> Liste, List-> Vektor, Nummer-> String, String-> Nummer, Symbol-> String, String-> Symbol, char-> Ganzzahl, Integer-> char, String-> List, List-> String
Zahlen Siehe separate Tabelle
Saiten String ?, Make-String, String, String-Length, String-Ref, String-Set!, String =?, String-Ci =?, String <? String-ci <?, String <=? String-ci <=?, String>? String-ci> ?, String> =? String-Ci> =?, Substring, String-Append, String-> List, List-> String, String-Copy, String-Fill!
Figuren char?, char =?, char-ci =?, char <? char-ci <?, char <=? char-ci <=?, char>? char-ci>?, char> =? char-ci> = ?, charphabetic ?, char-numeric?, char-Whitespace? Char-DownCase
Vektoren Make-Vector, Vektor, Vektor?, Vektorlänge, Vektor-Ref, Vektorset!
Symbole Symbol-> String, Zeichenfolge-> Symbol, Symbol?
Paare und Listen Paar? memv. Mitglied, ASSQ, ASSV, Assoc, List-> Vektor, Vektor-> Liste, List-> String, String-> List
Identitätsprädikate boolean ?, pair?, symbol?, number?, char?, string?, vector?, port?, procedure?
Kontinuationen CALL-With-Strom-Kontinuierung (Anruf/CC), Werte, Anruf-mit-Werten, Dynamik-Wind
Umgebungen Bewertung, Schema-Report-Umgebung, Null-Umgebung, Interaktionsumgebung (optional)
Input-Output Anzeige, Newline, Lesen, Schreiben, Lesen, Schreibchar, Peek-char, char-ready?, eof-Object? Open-Input-Datei, Open-Output-Datei, Close-Input-Port, Close-output-Port, Input-Port?, Output-Port? Eingabe-Datei, Call-with-output-Datei mit Eingangs-FROM-Datei (optional) mit Ausgabe-zu-Datei (optional)
Systemschnittstelle Laden (optional), Transkript-On (optional), Transcript-off (optional)
Verzögerte Bewertung Macht
Funktionelle Programmierung Vorgehensweise ?, Bewerben, Karte, foreig
Booleschen boolean? nicht

String- und Zeichenverfahren, die in ihren Namen "-ci" enthalten, führen Fallunabhängige Vergleiche zwischen ihren Argumenten durch: Oberfall und untere Fallversionen desselben Zeichens werden als gleich angesehen.

Standard numerische Verfahren im Sprach -R5RS -Schema
Zweck Verfahren
Grundlegende arithmetische Operatoren +, -, *, /, ABS, Quotient, Rest, Modulo, GCD, LCM, expt, SQRT
Rationale Zahlen Zähler, Nenner, rational ?, Rationalisiert
Annäherung Boden, Decke, verkürzt, rund
Genauigkeit ungenau-> genau, genau-ungenau, genau?, ungenau?
Ungleichheiten <, <= , >, >=, =
Verschiedene Prädikate Null?, negativ?, positiv? seltsam? eben?
Maximal und minimal Max Min
Trigonometrie Sünde, Cos, Tan, Asin, Acos, Atan
Exponentiale Exp, Protokoll
Komplexe Zahlen Make-rectangular, make-polar, real-partent, bildteil, Größe, Winkel, Komplex?
Input-Output Nummer-> String, Zeichenfolge-> Nummer
Typ Prädikate Ganzzahl?, rational?, real?, komplex?, numme?

Implementierungen von - und /, die mehr als zwei Argumente einnehmen, sind definiert, aber bei R5Rs optional.

Schemeanfragen zur Implementierung

Aufgrund des Minimalismus des Schemas werden viele gemeinsame Verfahren und syntaktische Formen nicht durch den Standard definiert. Um die Kernsprache klein zu halten, aber die Standardisierung von Erweiterungen zu erleichtern, verfügt die Scheme -Community über eine "Schemeanfrage zur Implementierung" (SRFI) (SRFI), durch den Erweiterungsbibliotheken durch sorgfältige Diskussion über Erweiterungsvorschläge definiert werden. Dies fördert die Code -Portabilität. Viele der SRFIs werden von allen oder den meisten Schema -Implementierungen unterstützt.

SRFIs mit ziemlich breiter Unterstützung in verschiedenen Implementierungen umfassen:[32]

  • 0: Feature-basierte bedingte Expansionskonstrukt
  • 1: Listenbibliothek
  • 4: Homogene numerische Vektor -Datentypen
  • 6: Grundlegende String -Ports
  • 8: Empfangen, Bindung an mehrere Werte
  • 9: Datensatztypen definieren
  • 13: String -Bibliothek
  • 14: Charakter-Set-Bibliothek
  • 16: Syntax für Variablenverfahren Arity
  • 17: Generalized Set!
  • 18: Multithreading -Unterstützung
  • 19: Zeitartypen und -verfahren
  • 25: Mehrdimensionale Array-Primitive
  • 26: Notation für Spezialisierungsparameter ohne Currying
  • 27: Quellen zufälliger Bits
  • 28: Grundlegende Formatketten
  • 29: Lokalisierung
  • 30: verschachtelte Mehrzeilungskommentare
  • 31: Eine spezielle Form für die rekursive Bewertung
  • 37: Argumentation: Ein Programmargumentprozessor
  • 39: Parameterobjekte
  • 41: Ströme
  • 42: eifrige Verständnisse
  • 43: Vektorbibliothek
  • 45: Primitive zum Ausdruck von iterativen faulen Algorithmen
  • 60: Ganzzahlen als Bits
  • 61: Eine allgemeinere Cond -Klausel
  • 66: Oktetvektoren
  • 67: Vergleiche Verfahren

Implementierungen

Das elegante, minimalistische Design hat Programm zu einem beliebten Ziel für Sprachdesigner, Hobbyisten und Pädagogen und aufgrund seiner geringen Größe, der eines typischen DolmetscherEs ist auch eine beliebte Wahl für eingebettete Systeme und Scripting. Dies hat zu zahlreichen Implementierungen geführt,[33] Die meisten voneinander unterscheiden sich so sehr, dass das Portieren von Programmen von einer Implementierung zu einer anderen ziemlich schwierig ist, und die geringe Größe der Standardsprache bedeutet, dass das Schreiben eines nützlichen Programms mit einer großen Komplexität in Standard -tragbarem Schema fast unmöglich ist.[13] Der R6RS -Standard legt eine viel breitere Sprache fest, um seinen Appell an Programmierer zu erweitern.

Fast alle Implementierungen bieten einen traditionellen Lisp-Stil Read -E -druck -Schleife Für Entwicklung und Debuggen. Viele auch kompilieren Programmprogramme für ausführbare binäre. Die Unterstützung des Einbettungsschemascodes in Programme, die in anderen Sprachen geschrieben wurden C. Das Gambit, Huhn, und Bigloo Schema -Dolmetscher kompilieren das Schema zu C, was einbettet, was einbettet. Darüber hinaus kann der Compiler von Bigloo so konfiguriert werden, dass er generiert wird JVM Bytecodeund es verfügt auch über einen experimentellen Bytecode -Generator für .NETZ.

Einige Implementierungen unterstützen zusätzliche Funktionen. Zum Beispiel, Kawa und JSCHEME Stellen Sie die Integration in Java -Klassen an, und das Schema für C -Compiler erleichtert es häufig einfach, externe Bibliotheken in C zu verwenden, um die Einbettung des tatsächlichen C -Codes in die Schemequelle zu ermöglichen. Ein anderes Beispiel ist PVTS, das eine Reihe visueller Tools bietet, um das Lernen von Schema zu unterstützen.

Verwendungszweck

Schema wird von einer Zahl häufig verwendet[34] von Schulen; insbesondere eine Reihe von Einführungen Informatik Kurse verwenden Schema in Verbindung mit dem Lehrbuch Struktur und Interpretation von Computerprogrammen (Sicp).[35] In den letzten 12 Jahren, PLT hat die gelaufen ProgrammByDesign (Früher TeachCheme!) Project, das fast 600 Highschool -Lehrer und Tausende von Schülern der Highschool -Programme für das Programmieren von rudimentärem Programm ausgesetzt ist. MITDie alte Einführungsprogrammierklasse 6.001 wurde im Schema unterrichtet,[36] Obwohl 6.001 durch modernere Kurse ersetzt wurden, wird SICP am MIT weiterhin unterrichtet.[37] Ebenso die Einführungsklasse bei UC Berkeley, CS 61A, wurde bis 2011 vollständig im Schema unterrichtet und kleinere Umleitungen in das Logo sparen, um den dynamischen Umfang zu demonstrieren. Heute hat Berkeley wie MIT den Lehrplan durch eine modernere Version ersetzt, die in erster Linie unterrichtet wird Python 3Aber der aktuelle Lehrplan basiert immer noch auf dem alten Lehrplan, und Teile der Klasse werden immer noch im Schema unterrichtet.[38]

Das Textbuch So entwerfen Sie Programme Von Matthias Fellisen, derzeit an der Northeastern University, wird einige Hochschulen für Hochschulausbildung für ihre einleitenden Informatikkurse verwendet. Beide Nordöstliche Universität und Worcester Polytechnic Institute Verwenden Sie das System ausschließlich für ihre Einführungskurse Grundlagen der Informatik (CS2500) und Einführung in das Programmdesign (CS1101).[39][40] Rose-Hulman Verwendet das Schema im fortschrittlicheren Kurs für Programmiersprachenkonzepte.[41] Brandeis UniversityDer Kernkurs, die Struktur und die Interpretationen von Computerprogrammen (COSI121B) werden ebenfalls ausschließlich von Theoretical Computern Scientist im Schema unterrichtet Harry Mairson.[42] Universität von IndianaDie Einführungsklasse, C211, wird vollständig im Schema unterrichtet. Eine selbstliegende Version des Kurses, CS 61AS, verwendet weiterhin Schema.[43] Die einleitenden Informatikkurse bei Yale und Grinnell College werden auch im Schema unterrichtet.[44] Programmierdesign -Paradigmen,[45] Ein obligatorischer Kurs für die Studenten der Informatik -Doktoranden bei Nordöstliche UniversitätVerwendet auch ein umfassendes Schema. Der ehemalige Einführungs -Informatikkurs an der University of Minnesota - Twin Cities, CSCI 1901, verwendete ebenfalls Schema als Hauptsprache, gefolgt von einem Kurs, der die Schüler in die Java -Programmiersprache einführte.[46] Nach dem Beispiel des MIT ersetzte die Abteilung jedoch 1901 durch das Python-basierte CSCI 1133.[47] während die funktionelle Programmierung im dritten Semester-Kurs CSCI 2041 ausführlich behandelt wird.[48] In der Softwareindustrie, Tata -Beratungsdienste, Asiens größtes Software-Beratungsunternehmen, verwendet in ihrem einmonatigen Schulungsprogramm für Fresh College-Absolventen ein Programm.

Das Schema wird/wurde auch für Folgendes verwendet:

Siehe auch

Verweise

  1. ^ Common Lisp: The Language, 2. Aufl., Guy L. Steele Jr. Digital Press; 1981. ISBN978-1-55558-041-4. "Common Lisp ist ein neuer Dialekt von Lisp, ein Nachfolger von MacLisp, der stark von Zetalisp und in gewissem Maße von Schema und Interisp beeinflusst wird."
  2. ^ a b 1178-1990 (Reaff 2008) IEEE-Standard für die Programmiersprache für Schema. IEEE -Teilenummer STDPD14209, einstimmig bestätigt Bei einer Sitzung des Überprüfungsausschusses des IEEE-SA Standards Board Standards (REVCOM) vom 26. März 2008 (Punkt 6.3 im Protokoll) ist die Bestätigungsmutungen zugreifen, die Oktober 2009. Hinweis: Dieses Dokument ist nur bei IEEE erhältlich und ist online nicht verfügbar Zum Zeitpunkt des Schreibens (2009).
  3. ^ a b c d e f g h i j k l m n o p q Richard Kelsey; William Cler; Jonathan Rees; et al. (August 1998). "Überarbeitet5 Bericht über das algorithmische Sprachschema ". Höherer Ordnung und symbolische Berechnung. 11 (1): 7–105. doi:10.1023/a: 1010051815785. S2CID 14069423. Abgerufen 2012-08-09.
  4. ^ a b "R7RS Finale verfügbar" (PDF). 2013-07-06.
  5. ^ a b c d Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; et al. (August 2007). "Überarbeitet6 Bericht über das algorithmische Sprachschema (R6RS) ". Schema -Lenkungsausschuss. Abgerufen 2011-09-13.
  6. ^ a b c d Sussman, Gerald Jay; Steele, Guy L. (1. Dezember 1998). "Der erste Bericht über das Programm überarbeitet". Höherer Ordnung und symbolische Berechnung. 11 (4): 399–404. doi:10.1023/a: 1010079421970. S2CID 7704398.
  7. ^ "R6RS -Implementierungen". r6rs.org. Abgerufen 2017-11-24.
  8. ^ Abdulaziz Ghuum (2007-10-27). "R6RS-Bibliotheken und Syntax-Case-System (PSYNTAX)". Ikarus -Schema. Abgerufen 2009-10-20.
  9. ^ Keep, Andrew W.; Dybvig, R. Kent (November 2014). "Eine Laufzeitdarstellung von Schema-Datensatztypen". Journal of Functional Programming. 24 (6): 675–716. doi:10.1017/s0956796814000203. S2CID 40001845.
  10. ^ "Überarbeitet^6 Bericht über das algorithmische Sprachschema, Anhang E: Sprachänderungen". Schema -Lenkungsausschuss. 2007-09-26. Abgerufen 2009-10-20.
  11. ^ "R6RS -Wähler". Schema -Lenkungsausschuss. 2007. Abgerufen 2012-08-09.
  12. ^ Marc Feeley (Zusammenstellung) (2007-10-26). "Die Absichten der Implementierer in Bezug auf R6Rs". Schema-Lenkungsausschuss, R6RS-Discuss-Mailingliste. Abgerufen 2012-08-09.
  13. ^ a b Will Cler, Marc Feeley, Chris Hanson, Jonathan Rees und Olin Shivers (2009-08-20). "Positionserklärung (Entwurf)". Schema -Lenkungsausschuss. Abgerufen 2012-08-09.{{}}: Cs1 montiert: Mehrfachnamen: Autorenliste (Link)
  14. ^ "R7RS 9. Entwurf verfügbar" (PDF). 2013-04-15.
  15. ^ Will Cler (2013-05-10). "Verlängerung der Abstimmungsphase". Schema Sprachlenkausschuss, Schema-Berichts-Mailingliste. Archiviert von das Original Am 2013-07-21. Abgerufen 2013-07-07.
  16. ^ Das Schema 48 Die Implementierung ist so benannt Richard Kelsey; Jonathan Rees; Mike Sperber (2008-01-10). "Das unvollständige Schema 48 Referenzhandbuch für Release 1.8". Jonathan Rees, S48.org. Abgerufen 2012-08-09.
  17. ^ a b Gerald Jay Sussman & Guy Lewis Steele Jr. (Dezember 1975). "Schema: Ein Dolmetscher für erweiterte Lambda -Kalkül" (PDF). AI -Memos. MIT AI Lab. AIM-349. HDL:1721.1/5794. Abgerufen 23. Dezember 2021.
  18. ^ Joel Moses (Juni 1970), Die Funktion der Funktion in Lisp oder warum das Funarg -Problem als Umweltproblem bezeichnet werden sollte, HDL:1721.1/5854, KI -Memo 199, Eine nützliche Metapher für den Unterschied zwischen Funktion und Zitat in LISP ist das Zitat als eine poröse oder offene Abdeckung der Funktion, da freie Variablen zur aktuellen Umgebung entkommen. Funktion wirkt als geschlossene oder nicht poröse Abdeckung (daher der von Landin verwendete Begriff "Verschluss"). So sprechen wir von "offenen" Lambda -Ausdrücken (Funktionen in Lisp sind normalerweise Lambda -Ausdrücke) und "geschlossen" Lambda -Ausdrücke. [...] Mein Interesse an dem Umweltproblem begann, während Landin, der das Problem tief verstand, zwischen 1966 und 67 MIT besuchte. Ich habe dann die Korrespondenz zwischen den Funarg -Listen festgestellt, die die Ergebnisse der Bewertung von "geschlossenen" Lambda -Ausdrücken in sind LISPELN und ICH SCHWIMME'S Lambda -Schließungen.
  19. ^ Van Tonder, André (1. Januar 2004). "Ein Lambda -Kalkül für die Quantenberechnung". Siam Journal über Computing. 33 (5): 1109–1135. Arxiv:Quant-Ph/0307150. doi:10.1137/s0097539703432165. S2CID 613571.
  20. ^ Niehren, J.; Schwinghammer, J.; Smolka, G. (November 2006). "Ein gleichzeitiger Lambda -Kalkül mit Futures" (PDF). Theoretische Informatik. 364 (3): 338–356. doi:10.1016/j.tcs.2006.08.016.
  21. ^ Gerald Jay Sussman & Guy Lewis Steele Jr. (März 1976). "Lambda: der ultimative Imperativ". AI -Memos. MIT AI Lab. AIM-353. Archiviert von das Original (PostScript oder PDF) am 2016-05-10. Abgerufen 2012-08-09.
  22. ^ Gabriel, Richard P.; Pitman, Kent (1988). "Technische Probleme der Trennung in Funktionszellen und Wertzellen". Lisp und symbolische Berechnung. Vol. 1, nein. 1 (veröffentlicht Juni 1988). S. 81–101. doi:10.1007/bf01806178. Abgerufen 2012-08-09.
  23. ^ a b Philip L. Bewig (2008-01-24). "SRFI 41: Streams". Die SRFI -Redakteure Schemers.org. Abgerufen 2012-08-09.
  24. ^ William Cler und Jonathan Rees, hrsg. (1991). "Überarbeitet4 Bericht über das algorithmische Sprachschema ". ACM Lisp -Zeiger. 4 (3): 1–55. Abgerufen 2012-08-09.
  25. ^ Flatt, Matthew (2016). "Bindung als Sätze von Scopes". Verfahren des 43. jährlichen ACM Sigplan-Sigact-Symposiums über Prinzipien der Programmiersprachen. S. 705–717. doi:10.1145/2837614.2837620. ISBN 978-1-4503-3549-2. S2CID 15401805.
  26. ^ Jonathan Rees, Das Treffen im Juni 1992 im Juni 1992 Archiviert 2011-07-16 bei der Wayback -Maschine (PostScript), In Lisp Pizters, V (4), Oktober bis Dezember 1992. Abgerufen 2012-08-09
  27. ^ Taylor Campbell (2005-07-21). "SRFI 62: S-Expression Kommentare". Die SRFI -Redakteure Schemers.org. Abgerufen 2012-08-09.
  28. ^ William D Cler (1999-07-01). "SRFI 6: Basic String -Ports". Die SRFI -Redakteure Schemers.org. Abgerufen 2012-08-09.
  29. ^ Scott G. Miller (2002-06-25). "SRFI 28: Grundlegende Formatketten". Die SRFI -Redakteure Schemers.org. Abgerufen 2012-08-09.
  30. ^ J.W. Backus; F.L. Bauer; J.Green; C. Katz; J. McCarthy P. Naur; et al. (Januar -April 1960). "Überarbeiteter Bericht über das algorithmische Sprachalgol 60". Numerische Mathematik, Kommunikation des ACM und Journal der British Computer Society. Abgerufen 2012-08-09.
  31. ^ Jonathan Rees; William Cler, Hrsg. (Dezember 1986). "Überarbeitet (3) Bericht über das algorithmische Sprachschema (der dem Gedächtnis von Algol 60 gewidmet ist)". ACM Sigplan nennt. 21 (12): 37–79. Citeseerx 10.1.1.29.3015. doi:10.1145/15042.15043. HDL:1721.1/6424. S2CID 43884422. Abgerufen 2012-08-09.
  32. ^ "Schema -Systeme, die SRFIs unterstützen". Die SRFI -Herausgeber Schemers.org. 2009-08-30. Abgerufen 2012-08-09.
  33. ^ 75 Bekannte Implementierungen des Schemas werden von aufgeführt "Scheme-Faq-Standard". Community Schema Wiki. 2009-06-25. Abgerufen 2009-10-20.
  34. ^ Ed Martin (2009-07-20). "Liste der Schema-Nutzungschulen". Schemers Inc. Abgerufen 2009-10-20.
  35. ^ "Liste der SICP-Use-Schulen". MIT Press. 1999-01-26. Abgerufen 2009-10-20.
  36. ^ Eric Grimson (Frühjahr 2005). "6.001 Struktur und Interpretation von Computerprogrammen". MIT Open Courseware. Abgerufen 2009-10-20.
  37. ^ Alex Vandiver; Nelson Elhage; et al. (Januar 2009). "6.184 - Zombies trinken koffeinhaltig 6.001". MIT CSAIL. Abgerufen 2009-10-20.
  38. ^ John Denero (Herbst 2019). "Informatik 61a, Berkeley". Abteilung für Elektrotechnik und Computerwissenschaften, Berkeley. Abgerufen 2019-12-17.
  39. ^ CS 2500: Grundlagen der Informatik i, Nordöstliche Universität
  40. ^ CS 1101: Einführung in das Programmdesign (A05): Kurssoftware, Worcester Polytechnic Institute
  41. ^ "CSSE 304: Programmiersprache Konzepte". Rose-Hulman Institute of Technology.
  42. ^ "Frühling 2021 CS121B Lehrplan" (PDF). Brandeis University.
  43. ^ https://berkeley-cs61as.github.io
  44. ^ Dana Angluin (Herbst 2009). "Einführung in die Informatik (CPSC 201)". The Zoo, Informatikabteilung der Yale University. Abgerufen 2009-10-20.
  45. ^ "Programmierdesign Paradigmen CSG107 Kurslesungen". Northeastern University College für Computer- und Informationswissenschaft. Herbst 2009. Abgerufen 2012-08-09.
  46. ^ Struktur der Computerprogrammierung i Archiviert 2010-06-19 bei der Wayback -Maschine, Informatikabteilung, Universität von Minnesota, Frühjahr 2010 (abgerufen 2010-01-30).
  47. ^ CSCI erforderte Klassenkursbeschreibungen und andere Informationen Archiviert 2019-10-25 in der Wayback -Maschine, Informatikabteilung, Universität von Minnesota (abgerufen 2019-10-25)
  48. ^ CSCI 2041 - Neues Kurs CSE Curriculum Committee, University of Minnesota (abgerufen 2019-10-25)
  49. ^ Robin Cover (2002-02-25). "DSSSL - Dokumentstil Semantik und Spezifikationssprache. ISO/IEC 10179: 1996". Seiten abdecken. Abgerufen 2012-08-09.
  50. ^ "Die wichtigste Skriptsprache für das heutige Gimping, das heute damit verbunden ist, ist ein Schema." Aus Dov Grobgeld (2002). "Das GIMP -Grundschema -Tutorial". Das GIMP -Team. Abgerufen 2012-08-09.
  51. ^ Todd Graham Lewis; David Zoll; Julian Missig (2002). "GNOME -FAQ aus dem Internetarchiv". Das Gnome -Team, gnome.org. Archiviert von das Original Am 2000-05-22. Abgerufen 2012-08-09.
  52. ^ "Guile-gnome". Kostenlose Software -Stiftung. Abgerufen 2012-08-09.
  53. ^ Laurence Brevard (2006-11-09). "Synopsys Map-InSm Programm Update: EDA Interoperability Developers 'Forum " (PDF). Synopsis Inc.. Abgerufen 2012-08-09.
  54. ^ Kawai, Shiro (Oktober 2002). "Zusammenklebende Dinge - Schema in der Echtzeit -CG -Inhaltsproduktion". Verfahren der ersten internationalen Lisp -Konferenz, San Francisco,: 342–348. Abgerufen 2012-08-09.
  55. ^ Bill Magnuson; Hal Abelson & Mark Friedman (2009-08-11). "Unter der Motorhaube des App -Erfinders für Android". Google Inc, offizieller Google Research Blog. Abgerufen 2012-08-09.

Weitere Lektüre

Externe Links