The dates and events on this page are those the reports tell of themselves (R5RS, R6RS and R7RS-small, each in its own introduction), with the contents of each revision taken from the reports’ own lists of changes where they have one.
Timeline
| Year | Event |
|---|---|
| 1975 | The first description of Scheme is written, by Guy Steele and Gerald Sussman at MIT |
| 1978 | A revised report describes the language as its MIT implementation is upgraded to support an innovative compiler (Steele’s Rabbit) |
| 1981–1982 | Three projects begin to use variants of Scheme for courses, at MIT, Yale and Indiana University |
| 1984 | An introductory computer science textbook using Scheme is published (Abelson and Sussman, Structure and Interpretation of Computer Programs). In October fifteen representatives of the major implementations meet to work toward a standard |
| 1985 | Their report, the Revised Revised Report on Scheme (RRRS), is published at MIT and Indiana University in the summer |
| 1986 | Further revision in the spring: the Revised3 Report (R3RS) |
| 1988–1991 | Work in the spring of 1988 gives the Revised4 Report (R4RS), published in Lisp Pointers in 1991. It becomes the basis of the IEEE Standard for the Scheme Programming Language, IEEE 1178 (1990, published 1991) |
| 1992–1998 | A meeting at Xerox PARC in June 1992 agrees further revisions, and the Revised5 Report (R5RS) is finalised in 1998 with high-level hygienic macros, multiple return values and eval |
| 2006–2007 | Work begins in the fall of 2006 on a more ambitious standard; the Revised6 Report (R6RS) is completed in August 2007, as a core language and mandatory standard libraries |
| 2009 | Most R5RS implementations do not adopt R6RS, or adopt parts. In August 2009 the Scheme Steering Committee decides to split the standard into two compatible languages: a “small” one, for educators, researchers and embedded use, focused on R5RS compatibility, and a “large” one for mainstream software development, meant to replace R6RS |
| 2013 | The small language, the Revised7 Report (R7RS-small), is completed, edited by Alex Shinn, John Cowan and Arthur Gleckler |
| 2010s– | R7RS-large is made from SRFIs, in editions with colour names (Red, Tangerine); see below |
The Steering Committee that guided the R7RS work was William Clinger, Marc Feeley, Chris Hanson, Jonathan Rees and Olin Shivers (R7RS acknowledgements). R5RS was edited by Richard Kelsey, William Clinger and Jonathan Rees, R6RS by Michael Sperber, R. Kent Dybvig, Matthew Flatt and Anton van Straaten (with Kelsey, Clinger and Rees).
The year 2013 for R7RS-small is the year of the small language’s ratification and is not in the report’s text that was read.
What each revision added
| Revision | Added, changed or removed |
|---|---|
| R4RS | Brought together the language of the earlier reports. It had an appendix of high-level macros, which R5RS moved into the main text. Its contents are not enumerated here, because the R4RS text was not read |
| IEEE 1178 | A standard based on R4RS. The R5RS text is a superset of it and says what had to change to be so |
| R5RS (1998) |
The empty list counts as true. The division of features into essential and inessential is removed; built-in procedures are primitive, library or optional (the optional ones are load, with-input-from-file, with-output-to-file, transcript-on, transcript-off, interaction-environment, and - and / with more than two arguments). Programs may redefine built-in procedures without changing the others. Port is added to the disjoint types. The macro appendix is removed and high-level macros (syntax-rules) become part of the report, with the derived expressions defined as macros. There are no reserved identifiers. syntax-rules allows vector patterns. Multiple-value returns (values, call-with-values), eval and dynamic-wind are added. The calls that must be properly tail-recursive are defined explicitly. @ may be used within identifiers, and | is reserved for future extensions |
| R6RS (2007) |
Libraries (library, import, versions, phases), top-level programs, and standard libraries for lists, sorting, bytevectors, Unicode, hashtables, enumerations, records, conditions and exceptions, arithmetic (fixnums, flonums, bitwise), and ports with transcoders. Case-sensitive identifiers and characters. syntax-case and procedural macros. guard, raise, with-exception-handler, assert, letrec*, let-values, case-lambda, when and unless are added. The division operators div and mod, and the numeric changes (exact and inexact, real-valued?, infinities and NaNs). Nested #| |# and #; comments. [ and ] as brackets. Immutable literals and exported variables. The report states as aims to run libraries without change across implementations, to give a level of type and bounds checking sufficient for type safety, and to remain backward compatible with R5RS to the extent possible. (The list of additions is the editor’s reading of the report and the R7RS notes; the report has no list of its own that was read.) |
| R7RS-small (2013) |
Taken from the report’s own lists of changes. Compared with R5RS: case sensitivity by default (#!fold-case to turn it off), libraries (define-library, import, cond-expand, include) with an R5RS compatibility library, exceptions (raise, raise-continuable, error, with-exception-handler, guard), define-record-type (SRFI 9), parameter objects and parameterize, promises enhanced (delay-force, make-promise), bytevectors, vector constants that evaluate to themselves, read-line, flush-output-port, textual and binary ports, string and bytevector ports, write-shared and write-simple with datum labels, eof-object, syntax definitions wherever variable definitions are, syntax-rules with a custom ellipsis, _ and tail patterns, syntax-error, letrec*, define-values, let-values, let*-values, => in case, case-lambda, when and unless, boolean=?, symbol=?, infinities, NaN and negative zero, a base argument for log, map and for-each stopping at the shortest list, a third argument for member and assoc, finite? infinite? nan? exact-integer? square exact-integer-sqrt, - and / and the character and string comparisons with any number of arguments, #true and #false, make-list, list-copy, list-set!, string-map, string-for-each, string->vector, vector-append, vector-copy, vector-map, vector-for-each, vector->string, vector-copy!, string-copy!, optional ranges, partial Unicode, digit-value, #; and #| |# comments, datum labels, escapes in strings and symbols, file-exists? and delete-file, process context and time libraries, the floor and truncate division operators, load with an environment, call/cc, and part-prescribed REPL semantics.
Removed or relaxed: transcript-on and transcript-off; # in numbers and the exponent markers s f d l are no longer required; exact->inexact and inexact->exact are renamed inexact and exact (the old names remain in the R5RS library); string comparison need not follow character comparison.
Compared with R6RS: define-library replaces library and its body is in begin; no versions or phases; include, include-library-declarations and cond-expand are added; no identifier syntax; condition types left unspecified; Unicode and the full numeric tower are not required; div and mod not provided; assp and memp replaced by the optional argument of assoc and member; only the unsigned byte (u8) bytevector procedures and the #u8 syntax rather than #vu8; string ports as in SRFI 6; most of the R6RS standard libraries (hashtables, enumerations, records beyond SRFI 9, sorting, the arithmetic libraries and conditions) are left for future standardisation |
| R7RS-large | In progress as a set of editions in which the SRFIs it takes are chosen by vote of a working group. The SRFI index tags SRFIs with the keywords “R7RS Large”, “R7RS Large: Red Edition” and “R7RS Large: Tangerine Edition”; see SRFI for the ones found. Its text was not read |
The standards and where they are
| Document | Notes |
|---|---|
| R5RS | “Revised5 Report on the Algorithmic Language Scheme”, edited by Richard Kelsey, William Clinger and Jonathan Rees; the permission to copy it, in whole or in part without fee, is given in its introduction. Available at schemers.org as HTML and PDF |
| R6RS | The report, the “Standard Libraries” document, a rationale and a formal-semantics chapter; all at r6rs.org. The report and the libraries are separate documents |
| R7RS-small | One document at small.r7rs.org, with its LaTeX source on GitHub; the report grants permission to copy it in whole or in part without fee |
| IEEE 1178 | IEEE Standard for the Scheme Programming Language, 1990. A paywalled standard; not read |
| SRFIs | srfi.schemers.org |
Language design themes
The introduction of every report from R5RS on states the same design aim: languages should be designed not by piling feature on feature but by removing the weaknesses and restrictions that make additional features appear necessary. It credits Scheme with being one of the first languages to have first-class procedures as in the lambda calculus, the first major Lisp dialect to distinguish procedures from lambda expressions and symbols, to use a single lexical environment for all variables, and to evaluate the operator position of a call like an operand; to emphasise tail calls as gotos that pass arguments, to embrace first-class escape procedures, to introduce exact and inexact numbers, and the first language to support hygienic macros.
Not described
Known, not yet covered
- Reference: the contents of RRRS, R3RS and R4RS are not described: those reports were not read, and the R4RS row says only what R5RS’s list of changes and the R7RS history say about it.
- Reference: the list of what R6RS added is from the R7RS notes, the R6RS chapters seen while writing the other pages, and the library index; the R6RS report’s own list of differences from R5RS, if it has one, was not found or read.
- Reference: R7RS-large is not described beyond the SRFI index tags; the Red and Tangerine edition documents, and the process that chooses SRFIs for them, were not read.
- Reference: the formal semantics chapters of R5RS, R6RS and R7RS are not described.
Unknown
- Reference: the exact publication date of R7RS-small in 2013 and of the IEEE standard are from memory and are not in the sources read.
See also
- Implementations and dialects – who implements which report
- Standard libraries – the libraries of R6RS and R7RS
- SRFI – the SRFI process and R7RS-large