20 February 1998

Revised(5) Report on the Algorithmic Language   Scheme
******************************************************

RICHARD KELSEY, WILLIAM CLINGER, AND JONATHAN REES (Editors)
H. ABELSON         R. K. DYBVIG       C. T. HAYNES       G. J. ROZAS
N. I. ADAMS IV     D. P. FRIEDMAN     E. KOHLBECKER      G. L. STEELE JR.
D. H. BARTLEY      R. HALSTEAD        D. OXLEY           G. J. SUSSMAN
G. BROOKS          C. HANSON          K. M. PITMAN       M. WAND

Dedicated to the Memory of Robert Hieb

Summary
*******

The report gives a defining description of the programming language
Scheme.  Scheme is a statically scoped and properly tail-recursive
dialect of the Lisp programming language invented by Guy Lewis Steele
Jr. and Gerald Jay Sussman.  It was designed to have an exceptionally
clear and simple semantics and few different ways to form expressions.
A wide variety of programming paradigms, including imperative,
functional, and message passing styles, find convenient expression in
Scheme.

The introduction offers a brief history of the language and of the
report.

The first three chapters present the fundamental ideas of the language
and describe the notational conventions used for describing the
language and for writing programs in the language.

Chapters Expressions and Program structure describe the
syntax and semantics of expressions, programs, and definitions.

Chapter Standard procedures describes Scheme's built-in
procedures, which include all of the language's data manipulation and
input/output primitives.

Chapter Formal syntax and semantics provides a formal syntax
for Scheme written in extended BNF, along with a formal denotational
semantics.  An example of the use of the language follows the formal
syntax and semantics.

The report concludes with a list of references and an alphabetic index.

Contents
********

Introduction
************

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 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.  A subsequent version of Scheme introduced the concept of
exact and inexact numbers, an extension of Common Lisp's generic
arithmetic.  More recently, Scheme became the first programming
language to support hygienic macros, which permit the syntax of a
block-structured language to be extended in a consistent and reliable
manner.

Background
==========

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

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.

Their report [RRRS] was published at MIT and Indiana University in the
summer of 1985.  Further revision took place in the spring of 1986
[R3RS], and in the spring of 1988 [R4RS].  The present report reflects
further revisions agreed upon in a meeting at Xerox PARC in June 1992.

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.

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, Bruce Duba, Marc Feeley, Andy
Freeman, Richard Gabriel, Yekta G"ursel, Ken Haase, Robert Hieb, Paul
Hudak, 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 *TI Scheme
Language Reference Manual*[TImanual85].  We gladly acknowledge the
influence of manuals for MIT Scheme[MITScheme], T[Rees84], Scheme
84[Scheme84],Common Lisp[CLtL], and Algol 60[Naur63].

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.

The Artificial Intelligence Laboratory of the Massachusetts Institute
of Technology, the Computer Science Department of Indiana University,
the Computer and Information Sciences Department of the University of
Oregon, and the NEC Research Institute 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.

Overview of Scheme
******************

Semantics
=========

This section gives an overview of Scheme's semantics.  A detailed
informal semantics is the subject of chapters Basic concepts
through Standard procedures.  For reference purposes, section
Formal semantics provides a formal semantics of Scheme.

Following Algol, Scheme is a statically scoped programming language.
Each use of a variable is associated with a lexically apparent binding
of that variable.

Scheme has latent as opposed to manifest types.  Types are associated
with values (also called objects) rather than with variables.  (Some
authors refer to languages with latent types as weakly typed or
dynamically typed languages.)  Other languages with latent types are
APL, Snobol, and other dialects of Lisp.  Languages with manifest types
(sometimes referred to as strongly typed or statically typed languages)
include Algol 60, Pascal, and C.

All objects created in the course of a Scheme computation, including
procedures and continuations, have unlimited extent.  No Scheme object
is ever destroyed.  The reason that implementations of Scheme do not
(usually!) run out of storage is that they are permitted to reclaim the
storage occupied by an object if they can prove that the object cannot
possibly matter to any future computation.  Other languages in which
most objects have unlimited extent include APL and other Lisp dialects.

Implementations of Scheme are required to be properly tail-recursive.
This allows the execution of an iterative computation in constant space,
even if the iterative computation is described by a syntactically
recursive procedure.  Thus with a properly tail-recursive
implementation, iteration can be expressed using the ordinary
procedure-call mechanics, so that special iteration constructs are
useful only as syntactic sugar.  See section Proper tail recursion.

Scheme procedures are objects in their own right.  Procedures can be
created dynamically, stored in data structures, returned as results of
procedures, and so on.  Other languages with these properties include
Common Lisp and ML.

One distinguishing feature of Scheme is that continuations, which in
most other languages only operate behind the scenes, also have
"first-class" status.  Continuations are useful for implementing a wide
variety of advanced control constructs, including non-local exits,
backtracking, and coroutines.  See section Control features.

Arguments to Scheme procedures are always passed by value, which means
that the actual argument expressions are evaluated before the procedure
gains control, whether the procedure needs the result of the evaluation
or not.  ML, C, and APL are three other languages that always pass
arguments by value.  This is distinct from the lazy-evaluation
semantics of Haskell, or the call-by-name semantics of Algol 60, where
an argument expression is not evaluated unless its value is needed by
the procedure.

Scheme's model of arithmetic is designed to remain as independent as
possible of the particular ways in which numbers are represented within
a computer. In Scheme, every integer is a rational number, every
rational is a real, and every real is a complex number.  Thus the
distinction between integer and real arithmetic, so important to many
programming languages, does not appear in Scheme.  In its place is a
distinction between exact arithmetic, which corresponds to the
mathematical ideal, and inexact arithmetic on approximations.  As in
Common Lisp, exact arithmetic is not limited to integers.

Syntax
======

Scheme, like most dialects of Lisp, employs a fully parenthesized prefix
notation for programs and (other) data; the grammar of Scheme generates
a sublanguage of the language used for data.  An important consequence
of this simple, uniform representation is the susceptibility of Scheme
programs and data to uniform treatment by other Scheme programs.  For
example, the `eval' procedure evaluates a Scheme program expressed as
data.

The `read' procedure performs syntactic as well as lexical
decomposition of the data it reads.  The `read' procedure parses its
input as data (section External representation.), not as
program.

The formal syntax of Scheme is described in section Formal syntax.

Notation and terminology
========================

Primitive; library; and optional features
-----------------------------------------

It is required that every implementation of Scheme support all features
that are not marked as being "optional".  Implementations are free to
omit optional features of Scheme or to add extensions, provided the
extensions are not in conflict with the language reported here.  In
particular, implementations must support portable code by providing a
syntactic mode that preempts no lexical conventions of this report.

To aid in understanding and implementing Scheme, some features are
marked as "library". These can be easily implemented in terms of the
other, primitive, features.  They are redundant in the strict sense of
the word, but they capture common patterns of usage, and are therefore
provided as convenient abbreviations.

Error situations and unspecified behavior
-----------------------------------------

When speaking of an error situation, this report uses the phrase "an
error is signalled" to indicate that implementations must detect and
report the error.  If such wording does not appear in the discussion of
an error, then implementations are not required to detect or report the
error, though they are encouraged to do so.  An error situation that
implementations are not required to detect is usually referred to simply
as "an error."

For example, it is an error for a procedure to be passed an argument
that the procedure is not explicitly specified to handle, even though
such domain errors are seldom mentioned in this report.
Implementations may extend a procedure's domain of definition to
include such arguments.

This report uses the phrase "may report a violation of an
implementation restriction" to indicate circumstances under which an
implementation is permitted to report that it is unable to continue
execution of a correct program because of some restriction imposed by
the implementation.  Implementation restrictions are of course
discouraged, but implementations are encouraged to report violations of
implementation restrictions.

For example, an implementation may report a violation of an
implementation restriction if it does not have enough storage to run a
program.

If the value of an expression is said to be "unspecified," then the
expression must evaluate to some object without signalling an error,
but the value depends on the implementation; this report explicitly does
not say what value should be returned.

Entry format
------------

Chapters Expressions and Standard procedures are
organized into entries.  Each entry describes one language feature or a
group of related features, where a feature is either a syntactic
construct or a built-in procedure.  An entry begins with one or more
header lines of the form

 - CATEGORY: TEMPLATE

for required, primitive features, or

 - QUALIFIER CATEGORY: TEMPLATE

where QUALIFIER is either "library" or "optional" as defined  in
section Primitive; library; and optional features.

If CATEGORY is "syntax", the entry describes an expression type, and
the template gives the syntax of the expression type.  Components of
expressions are designated by syntactic variables, which are written
using angle brackets, for example, <expression>, <variable>.  Syntactic
variables should be understood to denote segments of program text; for
example, <expression> stands for any string of characters which is a
syntactically valid expression.  The notation

 <thing1> ...

indicates zero or more occurrences of a <thing>, and

 <thing1> <thing2> ...

indicates one or more occurrences of a <thing>.

If CATEGORY is "procedure", then the entry describes a procedure, and
the header line gives a template for a call to the procedure.  Argument
names in the template are ITALICIZED.  Thus the header line

 - procedure: (VECTOR-REF VECTOR K)

indicates that the built-in procedure vector-ref takes two arguments, a
vector VECTOR and an exact non-negative integer K (see below).  The
header lines

 - procedure: (MAKE-VECTOR K)
 - procedure: (MAKE-VECTOR K FILL)

indicate that the make-vector procedure must be defined to take either
one or two arguments.

It is an error for an operation to be presented with an argument that it
is not specified to handle.  For succinctness, we follow the convention
that if an argument name is also the name of a type listed in section
Disjointness of types, then that argument must be of the named
type.  For example, the header line for vector-ref given above dictates
that the first argument to vector-ref must be a vector.  The following
naming conventions also imply type restrictions:

    OBJ
          any object

    LIST, LIST1, ... LISTJ, ...
          list (see section Pairs and lists.)

    Z, Z1, ... ZJ, ...
          complex number

    X, X1, ... XJ, ...
          real number

    Y, Y1, ... YJ, ...
          real number

    Q, Q1, ... QJ, ...
          rational number

    N, N1, ... NJ, ...
          integer

    K, K1, ... KJ, ...
          exact non-negative integer

Evaluation examples
-------------------

The symbol "=>" used in program examples should be read "evaluates to."
For example,

     (* 5 8)                                ==>  40

means that the expression (* 5 8) evaluates to the object 40.  Or, more
precisely:  the expression given by the sequence of characters "(* 5
8)" evaluates, in the initial environment, to an object that may be
represented externally by the sequence of characters "40".  See section
External representations for a discussion of external
representations of objects.

Naming conventions
------------------

By convention, the names of procedures that always return a boolean
value usually end in "`?'".  Such procedures are called predicates.

By convention, the names of procedures that store values into previously
allocated locations (see section Storage model.) usually end in
"`!'".  Such procedures are called mutation procedures.  By convention,
the value returned by a mutation procedure is unspecified.

By convention, "`->'" appears within the names of procedures that take
an object of one type and return an analogous object of another type.
For example, `list->vector' takes a list and returns a vector whose
elements are the same as those of the list.

Lexical conventions
*******************

This section gives an informal account of some of the lexical
conventions used in writing Scheme programs.  For a formal syntax of
Scheme, see section Formal syntax.

Upper and lower case forms of a letter are never distinguished except
within character and string constants.  For example, `Foo' is the same
identifier as `FOO', and #x1AB is the same number as #X1ab.

Identifiers
===========

Most identifiers allowed by other programming languages are also
acceptable to Scheme.  The precise rules for forming identifiers vary
among implementations of Scheme, but in all implementations a sequence
of letters, digits, and "extended alphabetic characters" that begins
with a character that cannot begin a number is an identifier.  In
addition, `+', `-', and `...' are identifiers.  Here are some examples
of identifiers:

     lambda                   q
     list->vector             soup
     +                        V17a
     <=?                      a34kTMNs
     the-word-recursion-has-many-meanings

Extended alphabetic characters may be used within identifiers as if
they were letters.  The following are extended alphabetic characters:

     ! $ % & * + - . / : < = > ? @ ^ _ ~

See section Lexical structure for a formal syntax of
identifiers.

Identifiers have two uses within Scheme programs:

   * Any identifier may be used as a variable or as a syntactic keyword
     (see sections Variables; syntactic keywords; and regions.
     and Macros.).

   * When an identifier appears as a literal or within a literal (see
     section Literal expressions.), it is being used to denote
     a *symbol* (see section Symbols.).

Whitespace and comments
=======================

"Whitespace" characters are spaces and newlines.  (Implementations
typically provide additional whitespace characters such as tab or page
break.)  Whitespace is used for improved readability and as necessary
to separate tokens from each other, a token being an indivisible
lexical unit such as an identifier or number, but is otherwise
insignificant.  Whitespace may occur between any two tokens, but not
within a token.  Whitespace may also occur inside a string, where it is
significant.

A semicolon (;) indicates the start of a comment.  The comment
continues to the end of the line on which the semicolon appears.
Comments are invisible to Scheme, but the end of the line is visible as
whitespace.  This prevents a comment from appearing in the middle of an
identifier or number.

     ;;; The FACT procedure computes the factorial
     ;;; of a non-negative integer.
     (define fact
       (lambda (n)
         (if (= n 0)
             1        ;Base case: return 1
             (* n (fact (- n 1))))))

Other notations
===============

For a description of the notations used for numbers, see section
Numbers.

. + -
     These are used in numbers, and may also occur anywhere in an
     identifier except as the first character.  A delimited plus or
     minus sign by itself is also an identifier.  A delimited period
     (not occurring within a number or identifier) is used in the
     notation for pairs (section Pairs and lists.), and to
     indicate a rest-parameter in a  formal parameter list (section
     Procedures.).  A delimited sequence of three successive
     periods is also an identifier.

( )
     Parentheses are used for grouping and to notate lists (section
     Pairs and lists.).

'
     The single quote character is used to indicate literal data
     (section Literal expressions.).

`
     The backquote character is used to indicate almost-constant data
     (section Quasiquotation.).

, ,@
     The character comma and the sequence comma at-sign are used in
     conjunction with backquote (section Quasiquotation.).

"
     The double quote character is used to delimit strings (section
     Strings.).

\
     Backslash is used in the syntax for character constants (section
     Characters.) and as an escape character within string
     constants (section Strings.).

[ ] { } |
     Left and right square brackets and curly braces and vertical bar
     are reserved for possible future extensions to the language.

#
     Sharp sign is used for a variety of purposes depending on the
     character that immediately follows it:

#t #f
     These are the boolean constants (section Booleans.).

#\
     This introduces a character constant (section Characters.).

#(
     This introduces a vector constant (section Vectors.).
     Vector constants are terminated by ) .

#e #i #b #o #d #x
     These are used in the notation for numbers (section Syntax of numerical constants.).

Basic concepts
**************

Variables; syntactic keywords; and regions
==========================================

An identifier may name a type of syntax, or it may name a location
where a value can be stored.  An identifier that names a type of syntax
is called a *syntactic keyword* and is said to be *bound* to that
syntax.  An identifier that names a location is called a *variable* and
is said to be *bound* to that location.  The set of all visible
bindings in effect at some point in a program is known as the
*environment* in effect at that point.  The value stored in the
location to which a variable is bound is called the variable's value.
By abuse of terminology, the variable is sometimes said to name the
value or to be bound to the value.  This is not quite accurate, but
confusion rarely results from this practice.

Certain expression types are used to create new kinds of syntax and
bind syntactic keywords to those new syntaxes, while other expression
types create new locations and bind variables to those locations.
These expression types are called *binding constructs*.

Those that bind syntactic keywords are listed in section Macros.
The most fundamental of the variable binding constructs is the `lambda'
expression, because all other variable binding constructs can be
explained in terms of `lambda' expressions.  The other variable binding
constructs are `let', `let*', `letrec', and `do' expressions (see
sections Procedures., see Binding constructs., and
Iteration.).

Like Algol and Pascal, and unlike most other dialects of Lisp except
for Common Lisp, Scheme is a statically scoped language with block
structure.  To each place where an identifier is bound in a program
there corresponds a "region" of the program text within which the
binding is visible.  The region is determined by the particular binding
construct that establishes the binding; if the binding is established
by a `lambda' expression, for example, then its region is the entire
`lambda' expression.  Every mention of an identifier refers to the
binding of the identifier that established the innermost of the regions
containing the use.  If there is no binding of the identifier whose
region contains the use, then the use refers to the binding for the
variable in the top level environment, if any (chapters
Expressions. and Standard procedures.); if there is no
binding for the identifier, it is said to be "unbound".

Disjointness of types
=====================

No object satisfies more than one of the following predicates:

     boolean?          pair?
     symbol?           number?
     char?             string?
     vector?           port?
     procedure?

These predicates define the types *boolean*, *pair*, *symbol*,
*number*, *char* (or *character*), *string*, *vector*, *port*, and
*procedure*.  The empty list is a special object of its own type; it
satisfies none of the above predicates.

Although there is a separate boolean type, any Scheme value can be used
as a boolean value for the purpose of a conditional test.  As explained
in section Booleans, all values count as true in such a test
except for #f.  This report uses the word "true" to refer to any Scheme
value except #f, and the word "false" to refer to #f.

External representations
========================

An important concept in Scheme (and Lisp) is that of the *external
representation* of an object as a sequence of characters.  For example,
an external representation of the integer 28 is the sequence of
characters "28", and an external representation of a list consisting of
the integers 8 and 13 is the sequence of characters "(8 13)".

The external representation of an object is not necessarily unique.  The
integer 28 also has representations "#e28.000" and "#x1c", and the list
in the previous paragraph also has the representations "( 08 13 )" and
"(8 . (13 . ()))" (see section Pairs and lists.).

Many objects have standard external representations, but some, such as
procedures, do not have standard representations (although particular
implementations may define representations for them).

An external representation may be written in a program to obtain the
corresponding object (see `quote', section Literal expressions.).

External representations can also be used for input and output.  The
procedure `read' (section Input.) parses external
representations, and the procedure `write' (section Output.)
generates them.  Together, they provide an elegant and powerful
input/output facility.

Note that the sequence of characters "(+ 2 6)" is *not* an external
representation of the integer 8, even though it *is* an expression
evaluating to the integer 8; rather, it is an external representation
of a three-element list, the elements of which are the symbol + and the
integers 2 and 6.  Scheme's syntax has the property that any sequence
of characters that is an expression is also the external representation
of some object.  This can lead to confusion, since it may not be
obvious out of context whether a given sequence of characters is
intended to denote data or program, but it is also a source of power,
since it facilitates writing programs such as interpreters and
compilers that treat programs as data (or vice versa).

The syntax of external representations of various kinds of objects
accompanies the description of the primitives for manipulating the
objects in the appropriate sections of chapter Standard procedures.

Storage model
=============

Variables and objects such as pairs, vectors, and strings implicitly
denote locations or sequences of locations.  A string, for example,
denotes as many locations as there are characters in the string.
(These locations need not correspond to a full machine word.) A new
value may be stored into one of these locations using the string-set!
procedure, but the string continues to denote the same locations as
before.

An object fetched from a location, by a variable reference or by a
procedure such as `car', `vector-ref', or `string-ref', is equivalent
in the sense of `eqv?' (section Equivalence predicates.) to the
object last stored in the location before the fetch.

Every location is marked to show whether it is in use.  No variable or
object ever refers to a location that is not in use.  Whenever this
report speaks of storage being allocated for a variable or object, what
is meant is that an appropriate number of locations are chosen from the
set of locations that are not in use, and the chosen locations are
marked to indicate that they are now in use before the variable or
object is made to denote them.

In many systems it is desirable for constants (i.e. the values of
literal expressions) to reside in read-only-memory.  To express this,
it is convenient to imagine that every object that denotes locations is
associated with a flag telling whether that object is mutable or
immutable.  In such systems literal constants and the strings returned
by `symbol->string' are immutable objects, while all objects created by
the other procedures listed in this report are mutable.  It is an error
to attempt to store a new value into a location that is denoted by an
immutable object.

Proper tail recursion
=====================

Implementations of Scheme are required to be *properly tail-recursive*.
Procedure calls that occur in certain syntactic contexts defined below
are `tail calls'.  A Scheme implementation is properly tail-recursive
if it supports an unbounded number of active tail calls.  A call is
*active* if the called procedure may still return.  Note that this
includes calls that may be returned from either by the current
continuation or by continuations captured earlier by
`call-with-current-continuation' that are later invoked.  In the
absence of captured continuations, calls could return at most once and
the active calls would be those that had not yet returned.  A formal
definition of proper tail recursion can be found in
[propertailrecursion].

     *Rationale:*

     Intuitively, no space is needed for an active tail call because the
     continuation that is used in the tail call has the same semantics
     as the continuation passed to the procedure containing the call.
     Although an improper implementation might use a new continuation
     in the call, a return to this new continuation would be followed
     immediately by a return to the continuation passed to the
     procedure.  A properly tail-recursive implementation returns to
     that continuation directly.

     Proper tail recursion was one of the central ideas in Steele and
     Sussman's original version of Scheme.  Their first Scheme
     interpreter implemented both functions and actors.  Control flow
     was expressed using actors, which differed from functions in that
     they passed their results on to another actor instead of returning
     to a caller.  In the terminology of this section, each actor
     finished with a tail call to another actor.

     Steele and Sussman later observed that in their interpreter the
     code for dealing with actors was identical to that for functions
     and thus there was no need to include both in the language.

A *tail call* is a procedure call that occurs in a *tail context*.
Tail contexts are defined inductively.  Note that a tail context is
always determined with respect to a particular lambda expression.

   * The last expression within the body of a lambda expression, shown
     as <tail expression> below, occurs in a tail context.

     (lambda <formals>
       <definition>* <expression>* <tail expression>)

   * If one of the following expressions is in a tail context, then the
     subexpressions shown as <tail expression> are in a tail context.
     These were derived from rules in the grammar given in chapter
     Formal syntax and semantics by replacing some occurrences
     of <expression> with <tail expression>.  Only those rules that
     contain tail contexts are shown here.

     (if <expression> <tail expression> <tail expression>)
     (if <expression> <tail expression>)

     (cond <cond clause>+)
     (cond <cond clause>* (else <tail sequence>))

     (case <expression>
       <case clause>+)
     (case <expression>
       <case clause>*
       (else <tail sequence>))

     (and <expression>* <tail expression>)
     (or <expression>* <tail expression>)

     (let (<binding spec>*) <tail body>)
     (let <variable> (<binding spec>*) <tail body>)
     (let* (<binding spec>*) <tail body>)
     (letrec (<binding spec>*) <tail body>)

     (let-syntax (<syntax spec>*) <tail body>)
     (letrec-syntax (<syntax spec>*) <tail body>)

     (begin <tail sequence>)

     (do (<iteration spec>*)
         (<test> <tail sequence>)
       <expression>*)

     where

     <cond clause> --> (<test> <tail sequence>)
     <case clause> --> ((<datum>*) <tail sequence>)

     <tail body> --> <definition>* <tail sequence>
     <tail sequence> --> <expression>* <tail expression>

   * If a `cond' expression is in a tail context, and has a clause of
     the form `(<expression1> => <expression2>)' then the (implied)
     call to the procedure that results from the evaluation of
     <expression2> is in a tail context.  <expression2> itself is not
     in a tail context.

Certain built-in procedures are also required to perform tail calls.
The first argument passed to `apply' and to
`call-with-current-continuation', and the second argument passed to
`call-with-values', must be called via a tail call.  Similarly, `eval'
must evaluate its argument as if it were in tail position within the
`eval' procedure.

In the following example the only tail call is the call to `f'.  None
of the calls to `g' or `h' are tail calls.  The reference to `x' is in
a tail context, but it is not a call and thus is not a tail call.

     (lambda ()
       (if (g)
           (let ((x (h)))
             x)
           (and (g) (f))))

     *Note:* Implementations are allowed, but not required, to
     recognize that some non-tail calls, such as the call to `h' above,
     can be evaluated as though they were tail calls.  In the example
     above, the `let' expression could be compiled as a tail call to
     `h'. (The possibility of `h' returning an unexpected number of
     values can be ignored, because in that case the effect of the
     `let' is explicitly unspecified and implementation-dependent.)

Expressions
***********

Expression types are categorized as *primitive* or *derived*.
Primitive expression types include variables and procedure calls.
Derived expression types are not semantically primitive, but can instead
be defined as macros.  With the exception of `quasiquote', whose macro
definition is complex, the derived expressions are classified as
library features.  Suitable definitions are given in section
Derived expression type.

Primitive expression types
==========================

Variable references
-------------------

 - syntax: <variable>
     An expression consisting of a variable (section Variables; syntactic keywords; and regions.)
     is a variable reference.  The
     value of the variable reference is the value stored in the
     location to which the variable is bound.  It is an error to
     reference an unbound variable.

     (define x 28)
     x                                      ==>  28

Literal expressions
-------------------

 - syntax: quote <datum>
 - syntax: '<datum>
 - syntax: <constant>
     `(quote <datum>)' evaluates to <datum>.  <Datum> may be any
     external representation of a Scheme object (see section
     External representations.).  This notation is used to include
     literal constants in Scheme code.

     (quote a)                              ==>  a
     (quote #(a b c))                       ==>  #(a b c)
     (quote (+ 1 2))                        ==>  (+ 1 2)

     `(quote <datum>)' may be abbreviated as '<datum>.  The two
     notations are equivalent in all respects.

     'a                                     ==>  a
     '#(a b c)                              ==>  #(a b c)
     '()                                    ==>  ()
     '(+ 1 2)                               ==>  (+ 1 2)
     '(quote a)                             ==>  (quote a)
     ''a                                    ==>  (quote a)

     Numerical constants, string constants, character constants, and
     boolean constants evaluate "to themselves"; they need not be
     quoted.

     '"abc"                                 ==>  "abc"
     "abc"                                  ==>  "abc"
     '145932                                ==>  145932
     145932                                 ==>  145932
     '#t                                    ==>  #t
     #t                                     ==>  #t

     As noted in section Storage model, it is an error to alter
     a constant (i.e. the value of a literal expression) using a
     mutation procedure like `set-car!' or `string-set!'.

Procedure calls
---------------

 - syntax: (<operator> <operand1> ...,)
     A procedure call is written by simply enclosing in parentheses
     expressions for the procedure to be called and the arguments to be
     passed to it.  The operator and operand expressions are evaluated
     (in an unspecified order) and the resulting procedure is passed
     the resulting arguments.

     (+ 3 4)                                ==>  7
     ((if #f + *) 3 4)                      ==>  12

     A number of procedures are available as the values of variables in
     the initial environment; for example, the addition and
     multiplication procedures in the above examples are the values of
     the variables `+' and `*'.  New procedures are created by
     evaluating lambda expressions (see section Procedures.).

     Procedure calls may return any number of values (see `values' in
     section Control features.).  With the exception of `values'
     the procedures available in the initial environment return one
     value or, for procedures such as `apply', pass on the values
     returned by a call to one of their arguments.

     Procedure calls are also called *combinations*.

          *Note:* In contrast to other dialects of Lisp, the order of
          evaluation is unspecified, and the operator expression and
          the operand expressions are always evaluated with the same
          evaluation rules.

          *Note:* Although the order of evaluation is otherwise
          unspecified, the effect of any concurrent evaluation of the
          operator and operand expressions is constrained to be
          consistent with some sequential order of evaluation.  The
          order of evaluation may be chosen differently for each
          procedure call.

          *Note:* In many dialects of Lisp, the empty combination, (),
          is a legitimate expression.  In Scheme, combinations must
          have at least one subexpression, so () is not a syntactically
          valid expression.

Procedures
----------

 - syntax: lambda <formals> <body>
     *Syntax:* <Formals> should be a formal arguments list as described
     below, and <body> should be a sequence of one or more expressions.

     *Semantics:* A lambda expression evaluates to a procedure.  The
     environment in effect when the lambda expression was evaluated is
     remembered as part of the procedure.  When the procedure is later
     called with some actual arguments, the environment in which the
     lambda expression was evaluated will be extended by binding the
     variables in the formal argument list to fresh locations, the
     corresponding actual argument values will be stored in those
     locations, and the expressions in the body of the lambda expression
     will be evaluated sequentially in the extended environment.  The
     result(s) of the last expression in the body will be returned as
     the result(s) of the procedure call.

     (lambda (x) (+ x x))                   ==>  **a procedure
     ((lambda (x) (+ x x)) 4)               ==>  8

     (define reverse-subtract
       (lambda (x y) (- y x)))
     (reverse-subtract 7 10)                ==>  3

     (define add4
       (let ((x 4))
         (lambda (y) (+ x y))))
     (add4 6)                               ==>  10

     <Formals> should have one of the following forms:

        * (<variable1> ...,): The procedure takes a fixed number of
          arguments; when the procedure is called, the arguments will
          be stored in the bindings of the corresponding variables.

        * <variable>: The procedure takes any number of arguments; when
          the procedure is called, the sequence of actual arguments is
          converted into a newly allocated list, and the list is stored
          in the binding of the <variable>.

        * (<variable1> ..., <variable_n> .  <variable_n+1>): If a
          space-delimited period precedes the last variable, then the
          procedure takes n or more arguments, where n is the number of
          formal arguments before the period (there must be at least
          one).  The value stored in the binding of the last variable
          will be a newly allocated list of the actual arguments left
          over after all the other actual arguments have been matched
          up against the other formal arguments.

     It is an error for a <variable> to appear more than once in
     <formals>.

     ((lambda x x) 3 4 5 6)                 ==>  (3 4 5 6)
     ((lambda (x y . z) z)
      3 4 5 6)                              ==>  (5 6)

     Each procedure created as the result of evaluating a lambda
     expression is (conceptually) tagged with a storage location, in
     order to make `eqv?' and `eq?' work on procedures (see section
     Equivalence predicates.).

Conditionals
------------

 - syntax: if <test> <consequent> <alternate>
 - syntax: if <test> <consequent>
     *Syntax:* <Test>, <consequent>, and <alternate> may be arbitrary
     expressions.

     *Semantics:* An `if' expression is evaluated as follows: first,
     <test> is evaluated.  If it yields a true value (see section
     Booleans.), then <consequent> is evaluated and its value(s)
     is(are) returned.  Otherwise <alternate> is evaluated and its
     value(s) is(are) returned.  If <test> yields a false value and no
     <alternate> is specified, then the result of the expression is
     unspecified.

     (if (> 3 2) 'yes 'no)                  ==>  yes
     (if (> 2 3) 'yes 'no)                  ==>  no
     (if (> 3 2)
         (- 3 2)
         (+ 3 2))                           ==>  1

Assignments
-----------

 - syntax: set! <variable> <expression>
     <Expression> is evaluated, and the resulting value is stored in
     the location to which <variable> is bound.  <Variable> must be
     bound either in some region enclosing the `set!' expression or at
     top level.  The result of the `set!' expression is unspecified.

     (define x 2)
     (+ x 1)                                ==>  3
     (set! x 4)                             ==>  *unspecified*
     (+ x 1)                                ==>  5

Derived expression types
========================

The constructs in this section are hygienic, as discussed in section
Macros.  For reference purposes, section Derived expression type
gives macro definitions that will convert most of the
constructs described in this section into the primitive constructs
described in the previous section.