This repository has been archived on 2022-08-10. You can view files and clone it, but cannot push or open issues or pull requests.
chez-openbsd/csug/intro.stex
2022-07-29 15:12:07 +02:00

434 lines
21 KiB
Text

% Copyright 2005-2017 Cisco Systems, Inc.
%
% Licensed under the Apache License, Version 2.0 (the "License");
% you may not use this file except in compliance with the License.
% You may obtain a copy of the License at
%
% http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS,
% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
% See the License for the specific language governing permissions and
% limitations under the License.
\chapter{Introduction}
This book describes {\ChezScheme} extensions to the Revised$^6$
Report on Scheme~\cite{r6rs} (R6RS).
It contains as well a concise summary of standard and {\ChezScheme} forms
and procedures, which gives the syntax of each form and the number and
types of arguments accepted by each procedure.
Details on standard R6RS features can be found in
\index{The Scheme Programming Language, 4th Edition@\emph{The Scheme Programming Language, 4th Edition}}\hyperlink{http://www.scheme.com/tspl4/}{\emph{The
Scheme Programming Language, 4th Edition}} (TSPL4)~\cite{Dybvig:tspl4} or
the Revised$^6$ Report on Scheme.
\emph{The Scheme Programming Language, 4th Edition} also contains an
extensive introduction to the Scheme language and numerous short and
extended examples.
Most of this document also applies equally to \index{PetiteChezScheme@\PetiteChezScheme}{\PetiteChezScheme},
which is fully compatible with the complete {\ChezScheme} system but uses
a high-speed interpreter in place of {\ChezScheme}'s
incremental native-code compiler.
Programs written for {\ChezScheme} run unchanged in
{\PetiteChezScheme} as long as they do not require the
compiler to be invoked.
In fact, {\PetiteChezScheme} is built from the same sources as
{\ChezScheme}, with all but the compiler sources included.
A detailed discussion of the impact of this distinction appears in
Section~\ref{SECTUSEAPPLICATIONS}.
The remainder of this chapter covers
{\ChezScheme} extensions to Scheme syntax (Section~\ref{SECTINTROSYNTAX}),
notational conventions used in this book (Section~\ref{SECTINTRONOTATION}),
the use of parameters for system customization (Section~\ref{SECTINTROPARAMETERS}),
and where to look for more information on
{\ChezScheme} (Section~\ref{SECTINTROMOREINFO}).
Chapter~\ref{CHPTUSE} describes how one uses {\ChezScheme}
for program development, scripting, and application delivery, plus
how to get the compiler to generate the most efficient code
possible.
Chapter~\ref{CHPTDEBUG} describes debugging and object inspection
facilities.
Chapter~\ref{CHPTFOREIGN} documents facilities for interacting with
separate processes or code written in other languages.
Chapter~\ref{CHPTBINDING} describes binding forms.
Chapter~\ref{CHPTCONTROL} documents control structures.
Chapter~\ref{CHPTOBJECTS} documents operations on nonnumeric objects,
while Chapter~\ref{CHPTNUMERIC} documents various numeric operations,
including efficient type-specific operations.
Chapter~\ref{CHPTIO} describes input/output operations and
generic ports, which allow the definition of ports with arbitrary
input/output semantics.
Chapter~\ref{CHPTLIBRARIES} discusses how R6RS libraries and top-level
programs are loaded into {\ChezScheme} along with various features for
controlling and tracking the loading process.
Chapter~\ref{CHPTSYNTAX} describes syntactic extension and modules.
Chapter~\ref{CHPTSYSTEM} describes system operations, such as operations
for interacting with the operating system and customizing
{\ChezScheme}'s user interface.
Chapter~\ref{CHPTSMGMT} describes how to invoke and control the storage
management system and documents guardians and weak pairs.
Chapter~\ref{CHPTEXPEDITOR} describes {\ChezScheme}'s expression
editor and how it can be customized.
Chapter~\ref{CHPTTHREADS} documents the procedures and syntactic forms
that comprise the interface to {\ChezScheme}'s native thread system.
Finally, Chapter~\ref{CHPTCOMPAT} describes various compatibility features.
The back of this book contains a bibliography,
the summary of forms, and an index.
The page numbers appearing in the summary of forms and
the italicized page numbers appearing in the index indicate the
locations in the text where forms and procedures are formally defined.
The summary of forms and index includes entries from TSPL4, so that
they cover the entire set of {\ChezScheme} features.
A TSPL4 entry is marked by a ``t'' prefix on the page number.
Online versions and errata for this book and for TSPL4 can be found at
\hyperlink{http://www.scheme.com}{www.scheme.com}.
% Printed versions of this book may be obtained from
% \hyperlink{http://www.lulu.com/product/paperback/chez-scheme-version-9-users-guide/6516800}{www.lulu.com}.
\bigskip\noindent
\emph{Acknowledgments:}
Michael Adams, Mike Ashley, Carl Bruggeman, Bob Burger, Sam
Daniel, George Davidson, Matthew Flatt, Aziz Ghuloum, Bob Hieb, Andy Keep, and Oscar Waddell have
contributed substantially to the development of {\ChezScheme}.
{\ChezScheme}'s expression editor is based on a command-line editor for
Scheme developed from 1989 through 1994 by C.~David Boyer.
File compression is performed with the use of the lz4 compression
library developed by Yann Collet or the zlib compression library
developed by Jean-loup Gailly and Mark Adler.
Implementations of the list and vector sorting routines are based on
Olin Shiver's opportunistic merge-sort algorithm and implementation.
Michael Lenaghan provided a number of corrections for earlier drafts
of this book.
Many of the features documented in this book were suggested by
current {\ChezScheme} users, and numerous comments from users have also
led to improvements in the text.
Additional suggestions for improvements to {\ChezScheme} and to this
book are welcome.
\section{Chez Scheme Syntax\label{SECTINTROSYNTAX}}
{\ChezScheme} extends Scheme's syntax both at the object (datum) level
and at the level of syntactic forms.
At the object level, {\ChezScheme} supports additional representations for
symbols that contain nonstandard characters,
nondecimal numbers expressed in floating-point
and scientific notation, vectors with explicit lengths,
shared and cyclic structures, records, boxes, and more.
These extensions are described below.
Form-level extensions are described throughout the book and summarized
in the Summary of Forms, which also appears in the back of this book.
{\ChezScheme} extends the syntax of identifiers in several ways.
First, the sequence of characters making up an identifier's name may
start with digits, periods, plus signs, and minus
signs as long as the sequence cannot be parsed as a number.
For example, \scheme{0abc}, \scheme{+++}, and \scheme{..} are all
valid identifiers in {\ChezScheme}.
Second, the single-character sequences \scheme{\schlbrace} and
\scheme{\schrbrace} are identifiers.
Third, identifiers containing arbitrary characters may be printed by
escaping them with \scheme{\} or with \scheme{|}.
\scheme{\} is used to escape a single character (except 'x', since
\scheme{\x} marks the start of a hex scalar value),
whereas \scheme{|} is used
to escape the group of characters that follow it up through the
matching \scheme{|}.
For example, \scheme{\||\|} is an identifier with a two-character
name consisting of the character \scheme{|} followed by the
character \scheme{\}, and \scheme{|hit me!|} is an identifier whose name
contains a space.
In addition, gensyms (page~\ref{desc:gensym}) are printed with
\index{\scheme{#\schlbrace} (gensym prefix)}\scheme{#\schlbrace} and
\scheme{\schrbrace} brackets that enclose both the ``pretty'' and ``unique''
names, e.g., \scheme{#\schlbrace\raw{{}}g1426 e5g1c94g642dssw-a\schrbrace}.
They may also be printed using the pretty name only with the prefix
\index{\scheme{#:} (gensym prefix)}\scheme{#:}, e.g.,
\scheme{#:g1426}.
Arbitrary radixes from two through 36 may be specified with the prefix
\index{#r (radix prefix)@\scheme{#\var{n}r} (radix prefix)}\scheme{#\var{n}r},
where \var{n} is the radix.
Case is not significant, so \scheme{#\var{n}R} may be used as well.
Digit values from 10 through 35 are specified as either lower- or upper-case
alphabetic characters, just as for hexadecimal numbers.
For example, \scheme{#36rZZ} is $35\times36+35$, or $1295$.
{\ChezScheme} also permits nondecimal numbers
to be printed in floating-point or scientific notation.
For example, \scheme{#o1.4} is equivalent to \scheme{1.5}, and
\scheme{#b1e10} is equivalent to \scheme{4.0}.
Digits take precedence over exponent specifiers, so that
\scheme{#x1e20} is simply the four-digit hexadecimal number equivalent
to \scheme{7712}.
In addition to the standard named characters
\index{\scheme{#\alarm}}\scheme{#\alarm},
\index{\scheme{#\backspace}}\scheme{#\backspace},
\index{\scheme{#\delete}}\scheme{#\delete},
\index{\scheme{#\esc}}\scheme{#\esc},
\index{\scheme{#\linefeed}}\scheme{#\linefeed},
\index{\scheme{#\newline}}\scheme{#\newline},
\index{\scheme{#\page}}\scheme{#\page},
\index{\scheme{#\return}}\scheme{#\return},
\index{\scheme{#\space}}\scheme{#\space},
and
\index{\scheme{#\tab}}\scheme{#\tab},
{\ChezScheme} recognizes
\index{\scheme{#\bel}}\scheme{#\bel},
\index{\scheme{#\ls}}\scheme{#\ls},
\index{\scheme{#\nel}}\scheme{#\nel},
\index{\scheme{#\nul}}\scheme{#\nul},
\index{\scheme{#\rubout}}\scheme{#\rubout},
and
\index{\scheme{#\vt}}\scheme{#\vt} (or \scheme{#\vtab}).
Characters whose scalar values are less than 256 may also be printed with
an octal syntax consisting of the prefix \scheme{#\} followed by a three
octal-digit sequence.
For example, \scheme{#\000} is equivalent to \scheme{#\nul}.
{\ChezScheme}'s fxvectors, or fixnum vectors, are printed like vectors
but with the prefix \scheme{#vfx(} in place of \scheme{#(}.
Vectors, bytevectors, and fxvectors may be printed with an explicit length
prefix, and when the explicit length prefix is specified, duplicate
trailing elements may be omitted.
For example,
\index{\scheme{#(} (vector prefix)}\scheme{#(a b c)} may be printed as
\index{#( (vector prefix)@\scheme{#\var{n}(} (vector prefix)}\scheme{#3(a b c)},
and a vector of length 100 containing all zeros may be printed as
\scheme{#100(0)}.
{\ChezScheme}'s boxes are printed with a
\index{\scheme{#&} (box prefix)}\scheme{#&} prefix, e.g.,
\scheme{#&17} is a box containing the integer \scheme{17}.
Records are printed with the syntax
\index{\scheme{#[} (record prefix)}\scheme{#[\var{type-name} \var{field} \dots]},
where the symbol \var{type-name} is the name of the record
type and \scheme{\var{field} \dots} are the printed
representations for the contents of the fields of the record.
Shared and cyclic structure may be printed using the graph mark and
reference prefixes
\index{#= (graph mark)@\scheme{#\var{n}=} (graph mark)}\scheme{#\var{n}=}
and
\index{## (graph reference)@\scheme{#\var{n}#} (graph reference)}\scheme{#\var{n}#}.
\scheme{#\var{n}=} is used to mark an item in the input, and
\scheme{#\var{n}#} is used to refer to the item marked \var{n}.
For example, \scheme{'(#1=(a) . #1#)} is a pair whose car and cdr
contain the same list, and \scheme{#0=(a . #0#)} is a cyclic
list, i.e., its cdr is itself.
A \scheme{$primitive} form (see page~\pageref{desc:hash-primitive}) may
be abbreviated in the same manner as a \scheme{quote} form, using the
\index{#% ($primitive)@\scheme{#%} (\scheme{$primitive})}\scheme{#%} prefix.
For example,
\scheme{#%car} is equivalent to \scheme{($primitive car)},
\scheme{#2%car} to \scheme{($primitive 2 car)}, and
\scheme{#3%car} to \scheme{($primitive 3 car)}.
{\ChezScheme}'s end-of-file object is printed \scheme{#!eof}.
If the end-of-file object appears outside of any datum within a file
being loaded, \scheme{load} will treat it as if it were a true
end of file and stop loading at that point.
Inserting \scheme{#!eof} into the middle of a file can thus be handy
when tracking down a load-time error.
Broken pointers in weak pairs (see page~\pageref{desc:weak-cons}) are
represented by the \emph{broken weak pointer} object, which is
printed \scheme{#!bwp}.
In addition to the standard delimiters (whitespace, open and close
parentheses, open and close brackets, double quotes, semi-colon,
and \scheme{#}), {\ChezScheme} also treats as delimiters
open and close braces, single quote, backward quote, and comma.
Finally, {\ChezScheme} accepts \index{\scheme{#true}}\scheme{#true} and
\index{\scheme{#false}}\scheme{#false} as alternative spellings of the booleans
\scheme{#t} and \scheme{#f}. Like the external representation of numbers, case
is not significant; for example, \scheme{#T}, \scheme{#True} and \scheme{#TRUE}
are all equivalent.
The {\ChezScheme} lexical extensions described above are disabled in an
input stream after an \scheme{#!r6rs} comment directive has been seen,
unless a \scheme{#!chezscheme} comment directive has been seen since.
Each library loaded implicitly via \scheme{import} and each RNRS top-level
program loaded via the \scheme{--program} command-line option, the
\scheme{scheme-script} command, or the \scheme{load-program} procedure is
treated as if it begins implicitly with an \scheme{#!r6rs} comment directive.
The case of symbol and character names is normally significant,
as required by the Revised$^6$ Report.
Names are folded, as if by \scheme{string-foldcase}, following a
\scheme{#!fold-case} comment directive in the same input stream
unless a \scheme{#!no-fold-case} has been seen since.
Names are also folded if neither directive has been seen and the
parameter \scheme{case-sensitive} has been set to \scheme{#f}.
The printer invoked by \scheme{write}, \scheme{put-datum},
\scheme{pretty-print}, and the \scheme{format} \scheme{~s}
option always prints standard Revised$^6$ Report objects
using the standard syntax, unless a different behavior is
requested via the setting of one of the print parameters.
For example, it prints symbols in the extended identifier syntax
of Chez Scheme described above using hex scalar value escapes,
unless the parameter
\index{\scheme{print-extended-identifiers}}\scheme{print-extended-identifiers} is set to
true.
Similarly, it does not print the explicit length or suppress
duplicate trailing elements unless the parameter
\index{\scheme{print-vector-length}}\scheme{print-vector-length} is set to
true.
\section{Notational Conventions\label{SECTINTRONOTATION}}
This book follows essentially the same notational conventions as
\emph{The Scheme Programming Language, 4th Edition}.
These conventions are repeated below, with notes specific to
{\ChezScheme}.
When the value produced by a procedure or syntactic form is said to
be \index{unspecified}\emph{unspecified}, the form or procedure may
return any number of values, each of which may be any Scheme
object.
{\ChezScheme} usually returns a single, unique
\index{void object}\emph{void} object
(see \index{\scheme{void}}\scheme{void}) whenever
the result is unspecified; avoid counting on this behavior, however,
especially if your program may be ported to another Scheme implementation.
Printing of the void object is suppressed by {\ChezScheme}'s waiter
(read-evaluate-print loop).
% following borrowed from TSPL4
\index{exceptions}This book uses the words ``must'' and ``should'' to
describe program requirements, such as the requirement to provide an index
that is less than the length of the vector in a call to
\scheme{vector-ref}.
If the word ``must'' is used, it means that the requirement is enforced
by the implementation, i.e., an exception is raised, usually with
condition type \scheme{&assertion}.
If the word ``should'' is used, an exception may or may not be raised,
and if not, the behavior of the program is undefined.
\index{syntax violation}The phrase ``syntax violation'' is used to
describe a situation in which a program is malformed.
Syntax violations are detected prior to program execution.
When a syntax violation is detected, an exception of type \scheme{&syntax}
is raised and the program is not executed.
Scheme objects are displayed in a \scheme{typewriter} typeface just
as they are to be typed at the keyboard.
This includes identifiers, constant objects, parenthesized Scheme
expressions, and whole programs.
An \emph{italic} typeface is used to set off syntax variables in
the descriptions of syntactic forms and arguments in the descriptions of
procedures.
Italics are also used to set off technical terms the first time they
appear.
The first letter of an identifier that is not ordinarily capitalized
is not capitalized when it appears at the beginning of a sentence.
The same is true for syntax variables written in italics.
In the description of a syntactic form or procedure, a pattern shows
the syntactic form or the application of the procedure.
The syntax keyword or procedure name is given in typewriter font,
as are parentheses.
The remaining pieces of the syntax or arguments are shown in italics,
using names that imply the types of the expressions or arguments expected
by the syntactic form or procedure.
Ellipses are used to specify
zero or more occurrences of a subexpression or argument.
\section{Parameters\label{SECTINTROPARAMETERS}}
\index{parameters}All {\ChezScheme} system customization is done via
\emph{parameters}.
A parameter is a procedure that encapsulates a hidden state variable.
When invoked without arguments, a parameter returns the value of
the encapsulated variable.
When invoked with one argument, the parameter changes the value
of the variable to the value of its argument.
A parameter may raise an exception if its argument is not appropriate,
or it may filter the argument in some way.
New parameters may be created and used by programs running in
{\ChezScheme}.
Parameters are used rather than global variables for program customization
for two reasons:
First, unintentional redefinition of a customization variable can cause
unexpected problems, whereas unintentional redefinition of a
parameter simply makes the parameter inaccessible.
For example, a program that defines \scheme{*print-level*} for its own
purposes in early releases of {\ChezScheme} would have unexpected
effects on the printing of Scheme objects, whereas a program that
defines \index{\scheme{print-level}}\scheme{print-level} for its own
purposes simply loses the ability to alter the printer's behavior.
Of course, a program that invokes \scheme{print-level} by accident can
still affect the system in unintended ways, but such an occurrence is
less likely, and can only happen in an incorrect program.
Second, invalid values for parameters can be detected and rejected
immediately when the ``assignment'' is made, rather than at the point
where the first use occurs, when it is too late to recover and
reinstate the old value.
For example, an assignment of \scheme{*print-level*} to $-1$ would not
have been caught until the first call to \scheme{write} or
\scheme{pretty-print}, whereas an attempted assignment of $-1$ to the
parameter \scheme{print-level}, i.e., \scheme{(print-level -1)}, is
flagged as an error immediately, before the change is actually made.
Built-in system parameters are described in different sections
throughout this book and are listed along with other syntactic
forms and procedures in the Summary of Forms in the
back of this book.
Parameters marked ``thread parameters'' have per-thread values in threaded
versions of {\ChezScheme}, while the values of parameters marked ``global
parameters'' are shared by all threads.
Nonthreaded versions of {\ChezScheme} do not distinguish between
thread and global parameters.
See Sections~\ref{SECTPARAMETERS} and~\ref{SECTTHREADPARAMETERS} for
more information on creating and manipulating parameters.
\section{More Information\label{SECTINTROMOREINFO}}
The articles and technical reports listed below document various
features of {\ChezScheme} and its implementation:
\begin{itemize}
\item syntactic abstraction~\cite{Dybvig:expansion:jour,Dybvig:syntax-case,Dybvig:syntactic},
\item modules~\cite{waddell:modules},
\item libraries~\cite{Ghuloum:libraries},
\item storage management~\cite{Dybvig:guardians,Dybvig:sm},
\item threads~\cite{Dybvig:mitchfest-threads},
\item multiple return values~\cite{Ashley:mvalues},
\item optional arguments~\cite{Dybvig:lambdastar},
\item continuations~\cite{Dybvig:phd,Hieb:representing,Bruggeman:oneshots},
\item eq? hashtables~\cite{ghuloum:eq-hash-tables},
\item internal definitions, \scheme{letrec}, and \scheme{letrec*}~\cite{Waddell:fixing-letrec,Ghuloum:fixing-letrec},
\item \scheme{equal?}~\cite{adams:equal},
\item engines~\cite{Dybvig:engines},
\item floating-point printing~\cite{Burger:floatprinting},
\item code generation~\cite{Dybvig:destination},
\item register allocation~\cite{Burger:regalloc},
\item procedure inlining~\cite{waddell:sas97},
\item profiling~\cite{Burger:pdrtc},
and
\item history of the implementation~\cite{Dybvig:hocs}.
\end{itemize}
\noindent
Links to abstracts and electronic versions of these publications are
available at the url
\hyperlink{http://www.cs.indiana.edu/chezscheme/pubs/}{http://www.cs.indiana.edu/chezscheme/pubs/}.
% Additional resources,
% online versions of this book and of The Scheme Programming Language,
% 4th Edition, and links to various Scheme resources are available at
% \hyperlink{http://www.scheme.com}{www.scheme.com}.