289 lines
15 KiB
HTML
289 lines
15 KiB
HTML
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
|
|
<html>
|
|
<!-- Generated from TeX source by tex2page, v 4o4,
|
|
(c) Dorai Sitaram, http://www.cs.rice.edu/~dorai/tex2page -->
|
|
<head>
|
|
<title>
|
|
Revised^5 Report on the Algorithmic Language Scheme
|
|
</title>
|
|
<link rel="stylesheet" type="text/css" href="r5rs-Z-C.css" title=default>
|
|
<meta name=robots content="noindex,follow">
|
|
</head>
|
|
<body>
|
|
|
|
<p><div class=navigation>[Go to <span><a href="r5rs.html">first</a>, <a href="r5rs-Z-H-3.html">previous</a></span><span>, <a href="r5rs-Z-H-5.html">next</a></span> page<span>; </span><span><a href="r5rs-Z-H-2.html#%_toc_start">contents</a></span><span><span>; </span><a href="r5rs-Z-H-15.html#%_index_start">index</a></span>]</div><p>
|
|
|
|
<a name="%_chap_1"></a>
|
|
<h1 class=chapter>
|
|
<div class=chapterheading><a href="r5rs-Z-H-2.html#%_toc_%_chap_1">Chapter 1</a></div><p>
|
|
<a href="r5rs-Z-H-2.html#%_toc_%_chap_1">Overview of Scheme</a></h1><p>
|
|
|
|
<a name="%_sec_1.1"></a>
|
|
<h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_1.1">1.1 Semantics</a></h2><p>
|
|
|
|
<p>
|
|
|
|
This section gives an overview of Scheme's semantics. A
|
|
detailed informal semantics is the subject of
|
|
chapters <a href="r5rs-Z-H-6.html#%_chap_3">3</a> through <a href="r5rs-Z-H-9.html#%_chap_6">6</a>. For reference
|
|
purposes, section <a href="r5rs-Z-H-10.html#%_sec_7.2">7.2</a> provides a formal
|
|
semantics of Scheme.<p>
|
|
|
|
Following Algol, Scheme is a statically scoped programming
|
|
language. Each use of a variable is associated with a lexically
|
|
apparent binding of that variable.<p>
|
|
|
|
Scheme has latent as opposed to manifest types. Types
|
|
are associated with values (also called objects<a name="%_idx_2"></a>) 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.<p>
|
|
|
|
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.<p>
|
|
|
|
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 <a href="r5rs-Z-H-6.html#%_sec_3.5">3.5</a>.<p>
|
|
|
|
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. <p>
|
|
|
|
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 <a href="r5rs-Z-H-9.html#%_sec_6.4">6.4</a>.<p>
|
|
|
|
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.<p>
|
|
|
|
<p>
|
|
|
|
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.<p>
|
|
|
|
<a name="%_sec_1.2"></a>
|
|
<h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_1.2">1.2 Syntax</a></h2><p>
|
|
|
|
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 <tt>eval</tt> procedure evaluates a Scheme program expressed
|
|
as data.<p>
|
|
|
|
The <tt>read</tt> procedure performs syntactic as well as lexical decomposition of
|
|
the data it reads. The <tt>read</tt> procedure parses its input as data
|
|
(section <a href="r5rs-Z-H-10.html#%_sec_7.1.2">7.1.2</a>), not as program.<p>
|
|
|
|
The formal syntax of Scheme is described in section <a href="r5rs-Z-H-10.html#%_sec_7.1">7.1</a>.<p>
|
|
|
|
<a name="%_sec_1.3"></a>
|
|
<h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_1.3">1.3 Notation and terminology</a></h2><p>
|
|
|
|
<a name="%_sec_1.3.1"></a>
|
|
<h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_1.3.1">1.3.1 Primitive, library, and optional features</a></h3><p>
|
|
|
|
<p>
|
|
|
|
It is required that every implementation of Scheme support all
|
|
features that are not marked as being <a name="%_idx_4"></a><em>optional</em>. 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.<p>
|
|
|
|
To aid in understanding and implementing Scheme, some features are marked
|
|
as <a name="%_idx_6"></a><em>library</em>. 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.<p>
|
|
|
|
<a name="%_sec_1.3.2"></a>
|
|
<h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_1.3.2">1.3.2 Error situations and unspecified behavior</a></h3><p>
|
|
|
|
<a name="%_idx_8"></a>
|
|
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.''<p>
|
|
|
|
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.<p>
|
|
|
|
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.<a name="%_idx_10"></a><p>
|
|
|
|
For example, an implementation may report a violation of an
|
|
implementation restriction if it does not have enough storage to run a
|
|
program.<p>
|
|
|
|
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. <a name="%_idx_12"></a><p>
|
|
|
|
<p>
|
|
|
|
<p>
|
|
|
|
<a name="%_sec_1.3.3"></a>
|
|
<h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_1.3.3">1.3.3 Entry format</a></h3><p>
|
|
|
|
Chapters <a href="r5rs-Z-H-7.html#%_chap_4">4</a> and <a href="r5rs-Z-H-9.html#%_chap_6">6</a> 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<p>
|
|
|
|
<div align=left><u><i>category</i>:</u> <tt><i>template</i></tt> </div>
|
|
<p>
|
|
|
|
for required, primitive features, or<p>
|
|
|
|
<div align=left><u><i>qualifier</i> <i>category</i>:</u> <tt><i>template</i></tt> </div>
|
|
<p>
|
|
|
|
where <i>qualifier</i> is either ``library'' or ``optional'' as defined
|
|
in section <a href="#%_sec_1.3.1">1.3.1</a>.<p>
|
|
|
|
If <i>category</i> 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
|
|
<p>
|
|
<thing<sub>1</sub>> <tt>...</tt>
|
|
<p>
|
|
indicates zero or more occurrences of a <thing>, and
|
|
<p>
|
|
<thing<sub>1</sub>> <thing<sub>2</sub>> <tt>...</tt>
|
|
<p>
|
|
indicates one or more occurrences of a <thing>.<p>
|
|
|
|
If <i>category</i> 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 <i>italicized</i>. Thus the header line<p>
|
|
|
|
<div align=left><u>procedure:</u> <tt>(vector-ref <i>vector</i> <i>k</i>)</tt> </div>
|
|
<p>
|
|
|
|
indicates that the built-in procedure <tt>vector-ref</tt> takes
|
|
two arguments, a vector <i>vector</i> and an exact non-negative integer
|
|
<i>k</i> (see below). The header lines<p>
|
|
|
|
<div align=left><u>procedure:</u> <tt>(make-vector <i>k</i>)</tt> </div>
|
|
|
|
<div align=left><u>procedure:</u> <tt>(make-vector <i>k</i> <i>fill</i>)</tt> </div>
|
|
<p>
|
|
|
|
indicate that the <tt>make-vector</tt> procedure must be defined to take
|
|
either one or two arguments.<p>
|
|
|
|
|
|
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 <a href="r5rs-Z-H-6.html#%_sec_3.2">3.2</a>, then that argument must be of the named type.
|
|
For example, the header line for <tt>vector-ref</tt> given above dictates that the
|
|
first argument to <tt>vector-ref</tt> must be a vector. The following naming
|
|
conventions also imply type restrictions:
|
|
|
|
<p><div align=left><table><tr><td>
|
|
|
|
|
|
<table border=0><tr><td valign=top ><i>obj</i></td><td valign=top >any object</td></tr>
|
|
<tr><td valign=top ><em>l</em><em>i</em><em>s</em><em>t</em>, <em>l</em><em>i</em><em>s</em><em>t</em><sub>1</sub>, <tt>...</tt> <em>l</em><em>i</em><em>s</em><em>t</em><sub><em>j</em></sub>, <tt>...</tt></td><td valign=top >list (see section <a href="r5rs-Z-H-9.html#%_sec_6.3.2">6.3.2</a>)</td></tr>
|
|
<tr><td valign=top ><em>z</em>, <em>z</em><sub>1</sub>, <tt>...</tt> <em>z</em><sub><em>j</em></sub>, <tt>...</tt></td><td valign=top >complex number</td></tr>
|
|
<tr><td valign=top ><em>x</em>, <em>x</em><sub>1</sub>, <tt>...</tt> <em>x</em><sub><em>j</em></sub>, <tt>...</tt></td><td valign=top >real number</td></tr>
|
|
<tr><td valign=top ><em>y</em>, <em>y</em><sub>1</sub>, <tt>...</tt> <em>y</em><sub><em>j</em></sub>, <tt>...</tt></td><td valign=top >real number</td></tr>
|
|
<tr><td valign=top ><em>q</em>, <em>q</em><sub>1</sub>, <tt>...</tt> <em>q</em><sub><em>j</em></sub>, <tt>...</tt></td><td valign=top >rational number</td></tr>
|
|
<tr><td valign=top ><em>n</em>, <em>n</em><sub>1</sub>, <tt>...</tt> <em>n</em><sub><em>j</em></sub>, <tt>...</tt></td><td valign=top >integer</td></tr>
|
|
<tr><td valign=top ><em>k</em>, <em>k</em><sub>1</sub>, <tt>...</tt> <em>k</em><sub><em>j</em></sub>, <tt>...</tt></td><td valign=top >exact non-negative integer</td></tr>
|
|
<tr><td valign=top ></td></tr></table>
|
|
</td></tr></table></div><p><p>
|
|
|
|
<p>
|
|
|
|
<a name="%_sec_1.3.4"></a>
|
|
<h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_1.3.4">1.3.4 Evaluation examples</a></h3><p>
|
|
|
|
The symbol ``===>'' used in program examples should be read
|
|
``evaluates to.'' For example,<p>
|
|
|
|
<tt><p>(* 5 8) ===> 40<p></tt><p>
|
|
|
|
means that the expression <tt>(* 5 8)</tt> evaluates to the object <tt>40</tt>.
|
|
Or, more precisely: the expression given by the sequence of characters
|
|
``<tt>(* 5 8)</tt>'' evaluates, in the initial environment, to an object
|
|
that may be represented externally by the sequence of characters ``<tt>40</tt>''. See section <a href="r5rs-Z-H-6.html#%_sec_3.3">3.3</a> for a discussion of external
|
|
representations of objects.<p>
|
|
|
|
<a name="%_sec_1.3.5"></a>
|
|
<h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_1.3.5">1.3.5 Naming conventions</a></h3><p>
|
|
|
|
By convention, the names of procedures that always return a boolean
|
|
value usually end
|
|
in ``<tt>?</tt>''. Such procedures are called predicates.<p>
|
|
|
|
By convention, the names of procedures that store values into previously
|
|
allocated locations (see section <a href="r5rs-Z-H-6.html#%_sec_3.4">3.4</a>) usually end in
|
|
``<tt>!</tt>''.
|
|
Such procedures are called mutation procedures.
|
|
By convention, the value returned by a mutation procedure is unspecified.<p>
|
|
|
|
By convention, ``<tt>-></tt>'' appears within the names of procedures that
|
|
take an object of one type and return an analogous object of another type.
|
|
For example, <tt>list->vector</tt> takes a list and returns a vector whose
|
|
elements are the same as those of the list.<p>
|
|
|
|
|
|
<p>
|
|
|
|
<p><div class=navigation>[Go to <span><a href="r5rs.html">first</a>, <a href="r5rs-Z-H-3.html">previous</a></span><span>, <a href="r5rs-Z-H-5.html">next</a></span> page<span>; </span><span><a href="r5rs-Z-H-2.html#%_toc_start">contents</a></span><span><span>; </span><a href="r5rs-Z-H-15.html#%_index_start">index</a></span>]</div><p>
|
|
|
|
</body>
|
|
</html>
|