\clearextrapart{Introduction}

\label{historysection}

Programming languages should be designed not by piling feature on top of
feature, but by removing the weaknesses and restrictions that make additional
features appear necessary.  Scheme demonstrates that a very small number
of rules for forming expressions, with no restrictions on how they are
composed, suffice to form a practical and efficient programming language
that is flexible enough to support most of the major programming
paradigms in use today.

%Scheme has influenced the evolution of Lisp.
Scheme
was one of the first programming languages to incorporate first class
procedures as in the lambda calculus, thereby proving the usefulness of
static scope rules and block structure in a dynamically typed language.
Scheme was the first major dialect of Lisp 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 procedure call in the same way as an operand position.  By relying
entirely on procedure calls to express iteration, Scheme emphasized the
fact that tail-recursive procedure calls are essentially goto's that
pass arguments.  Scheme was the first widely used programming language to
embrace first class escape procedures, from which all previously known
sequential control structures can be synthesized.  More recently, building
upon the design of generic arithmetic in Common Lisp, Scheme introduced
the concept of exact and inexact numbers.
With the appendix to this report Scheme becomes the first programming
language to support hygienic macros, which permit the syntax of a
block-structured language to be extended reliably.
% A few
%of these innovations have recently been incorporated into Common Lisp, while
%others remain to be adopted.

\todo{Ramsdell:
I would like to make a few comments on presentation.  The most
important comment is about section organization.  Newspaper writers
spend most of their time writing the first three paragraphs of any
article.  This part of the article is often the only part read by
readers, and is important in enticing readers to continue.  In the
same way, The first page is most likely to be the only page read by
many SIGPLAN readers.  If I had my choice of what I would ask them to
read, it would be the material in section 1.1, the Semantics section
that notes that scheme is lexically scoped, tail recursive, weakly
typed, ... etc.  I would expand on the discussion on continutations,
as they represent one important difference between Scheme and other
languages.  The introduction, with its history of scheme, its history
of scheme reports and meetings, and acknowledgements giving names of
people that the reader will not likely know, is not that one page I
would like all to read.  I suggest moving the history to the back of
the report, and use the first couple of pages to convince the reader
that the language documented in this report is worth studying.
}

\subsection*{Background}

\vest The first description of Scheme was written in
1975~\cite{Scheme75}.  A revised report~\cite{Scheme78}
\todo{italicize or not?} appeared in 1978, which described the evolution
of the language as its MIT implementation was upgraded to support an
innovative compiler~\cite{Rabbit}.  Three distinct projects began in
1981 and 1982 to use variants of Scheme for courses at MIT, Yale, and
Indiana University~\cite{Rees82,MITScheme,Scheme311}.  An introductory
computer science textbook using Scheme was published in
1984~\cite{SICP}.

%\vest As might be expected of a language used primarily for education and
%research, Scheme has always evolved rapidly.  This was no problem when
%Scheme was used only within MIT, but 
\vest As Scheme became more widespread,
local dialects began to diverge until students and researchers
occasionally found it difficult to understand code written at other
sites.
Fifteen representatives of the major implementations of Scheme therefore
met in October 1984 to work toward a better and more widely accepted
standard for Scheme.
%Participating in this workshop were Hal Abelson, Norman Adams, David
%Bartley, Gary Brooks, William Clinger, Daniel Friedman, Robert Halstead,
%Chris Hanson, Christopher Haynes, Eugene Kohlbecker, Don Oxley, Jonathan Rees,
%Guillermo Rozas, Gerald Jay Sussman, and Mitchell Wand.  Kent Pitman
%made valuable contributions to the agenda for the workshop but was
%unable to attend the sessions.
%
%Subsequent electronic mail discussions and committee work completed the
%definition of the language.
%Gerry Sussman drafted the section on numbers, Chris Hanson drafted the
%sections on characters and strings, and Gary Brooks and William Clinger
%drafted the sections on input and output.
%William Clinger recorded the decisions of the workshop and
%compiled the pieces into a coherent document.
%The ``Revised revised report on Scheme''~\cite{RRRS}
Their report~\cite{RRRS}
was published at MIT and Indiana University in the summer of 1985.
Another round of revision took place in the spring of 1986~\cite{R3RS}.
%, again accomplished
%almost entirely by electronic mail, resulted in the present report.
The present report reflects further revisions agreed upon in a meeting
that preceded the 1988 ACM Conference on Lisp and Functional Programming
and in subsequent electronic mail.

%\vest The number 3 in the title is part of the title, not a reference to
%a footnote.  The word ``revised'' is raised to the third power because
%the report is a revision of a report that was already twice revised.

\todo{Write an editors' note?}


\medskip

We intend this report to belong to the entire Scheme community, and so
we grant permission to copy it in whole or in part without fee.  In
particular, we encourage implementors of Scheme to use this report as
a starting point for manuals and other documentation, modifying it as
necessary.




\subsection*{Acknowledgements}

We would like to thank the following people for their help: Alan Bawden, Michael
Blair, George Carrette, Andy Cromarty, Pavel Curtis, Jeff Dalton, Olivier Danvy,
Ken Dickey, Andy Freeman, Richard Gabriel, Yekta G\"ursel, Ken Haase, Robert
Hieb, Paul Hudak,
Richard Kelsey, Morry Katz, Chris Lindblad, Mark Meyer, Jim Miller, Jim Philbin,
John Ramsdell, Mike Shaff, Jonathan Shapiro, Julie Sussman,
Perry Wagle, Daniel Weise, Henry Wu, and Ozan Yigit.
We thank Carol Fessenden, Daniel
Friedman, and Christopher Haynes for permission to use text from the Scheme 311
version 4 reference manual.  We thank Texas Instruments, Inc.~for permission to
use text from the {\em TI Scheme Language Reference Manual.} We gladly
acknowledge the influence of manuals for MIT Scheme, T, Scheme 84,
Common Lisp, and Algol 60.

\vest We also thank Betty Dexter for the extreme effort she put into
setting this report in \TeX, and Donald Knuth for designing the program
that caused her troubles.

\vest The Artificial Intelligence Laboratory of the
Massachusetts Institute of Technology, the Computer Science
Department of Indiana University, and the Computer and Information
Sciences Department of the University of Oregon supported the
preparation of this report.  Support for the MIT work was provided in part by
the Advanced Research Projects Agency of the Department of Defense under Office
of Naval Research contract N00014-80-C-0505.  Support for the Indiana
University work was provided by NSF grants NCS 83-04567 and NCS
83-03325.


\todo{Steele:

[c] There should be a very clear message to the reader that Scheme certainly
does owe debts to other sources, and one of them is Common Lisp.  While
Scheme certainly has been the pioneer in the treatment of closures and
functional programming in a Lisp framework, I think it is fair to say that
Common lisp pioneered a rational (forgive the pun) treatment of numeric data
types in a Lisp framework, and my impression is that Scheme learned
something in this area from the Common Lisp experience.
}

% I think the above \todo has been done. -- Will, 1991.
