% Still to do: % list utilities % rest of big-util % destructure % format (?) \chapter{Libraries} Use the \link*{\code{,open} command} [\code{,open} command (section~\Ref{})]{module-command-guide} or \link*{the module language} [the module language (chapter~\Ref)]{module-guide} to open the structures described below. \section{ASCII character encoding} \label{ascii-procedures} These are in the structure \code{ascii}. \begin{protos} \proto{char->ascii}{ char}{integer} \proto{ascii->char}{ integer}{char} \end{protos} \noindent These are identical to \code{char->integer} and \code{integer->char} except that they use the \link{ASCII encoding}[ASCII encoding (appendix~\Ref)]{ascii-chart}. \begin{protos} \constproto{ascii-limit}{integer} \constproto{ascii-whitespaces}{list of integers} \end{protos} \code{Ascii-limit} is one more than the largest value that \code{char->ascii} may return. \code{Ascii-whitespaces} is a list of the ASCII values of whitespace characters (space, horizontal tab, line feed (= newline), vertical tab, form feed, and carriage return). \section{Bitwise integer operations} These functions use the two's-complement representation for integers. There is no limit to the number of bits in an integer. They are in the structures \code{bitwise} and \code{big-scheme}. \begin{protos} \proto{bitwise-and}{ integer integer}{integer} \proto{bitwise-ior}{ integer integer}{integer} \proto{bitwise-xor}{ integer integer}{integer} \proto{bitwise-not}{ integer} {integer} \end{protos} \noindent These perform various logical operations on integers on a bit-by-bit basis. `\code{ior}' is inclusive OR and `\code{xor}' is exclusive OR. \begin{protos} \proto{arithmetic-shift}{ integer bit-count}{integer} \end{protos} \noindent Shifts the integer by the given bit count, which must be an integer, shifting left for positive counts and right for negative ones. Shifting preserves the integer's sign. \begin{protos} \proto{bit-count}{ integer}{integer} \end{protos} \noindent Counts the number of bits set in the integer. If the argument is negative a bitwise NOT operation is performed before counting. \section{Byte vectors} These are homogeneous vectors of small integers ($0 \le i \le 255$). The functions that operate on them are analogous to those for vectors. They are in the structure \code{byte-vectors}. \begin{protos} \proto{byte-vector?}{ value}{boolean} \proto{make-byte-vector}{ k fill}{byte-vector} \proto{byte-vector}{ i \ldots}{byte-vector} \proto{byte-vector-length}{ byte-vector}{integer} \proto{byte-vector-ref}{ byte-vector k}{integer} \protonoresult{byte-vector-set!}{ byte-vector k i} \end{protos} \section{Cells} These hold a single value and are useful when a simple indirection is required. The system uses these to hold the values of lexical variables that may be \code{set!}. \begin{protos} \proto{cell?}{ value}{boolean} \proto{make-cell}{ value}{cell} \proto{cell-ref}{ cell}{value} \protonoresult{cell-set!}{ cell value} \end{protos} \section{Queues} These are ordinary first-in, first-out queues. The procedures are in structure \code{queues}. \begin{protos} \proto{make-queue}{}{queue} \proto{queue?}{ value}{boolean} \proto{queue-empty?}{ queue}{boolean} \protonoresult{enqueue!}{ queue value} \proto{dequeue!}{ queue}{value} \end{protos} \noindent \code{Make-queue} creates an empty queue, \code{queue?} is a predicate for identifying queues, \code{queue-empty?} tells you if a queue is empty, \code{enqueue!} and \code{dequeue!} add and remove values. \begin{protos} \proto{queue-length}{ queue}{integer} \proto{queue->list}{ queue}{values} \proto{list->queue}{ values}{queue} \proto{delete-from-queue!}{ queue value}{boolean} \end{protos} \noindent \code{Queue-length} returns the number of values in \var{queue}. \code{Queue->list} returns the values in \var{queue} as a list, in the order in which the values were added. \code{List->queue} returns a queue containing \var{values}, preserving their order. \code{Delete-from-queue} removes the first instance of \var{value} from \code{queue}, using \code{eq?} for comparisons. \code{Delete-from-queue} returns \code{\#t} if \var{value} is found and \code{\#f} if it is not. \section{Arrays} These provide N-dimensional, zero-based arrays and are in the structure \code{arrays}. The array interface is derived from one invented by Alan Bawden. \begin{protos} \proto{make-array}{ value dimension$_0$ \ldots}{array} \proto{array}{ dimensions element$_0$ \ldots}{array} \proto{copy-array}{ array}{array} \end{protos} \noindent \code{Make-array} makes a new array with the given dimensions, each of which must be a non-negative integer. Every element is initially set to \cvar{value}. \code{Array} Returns a new array with the given dimensions and elements. \cvar{Dimensions} must be a list of non-negative integers, The number of elements should be the equal to the product of the dimensions. The elements are stored in row-major order. \begin{example} (make-array 'a 2 3) \evalsto \{Array 2 3\} (array '(2 3) 'a 'b 'c 'd 'e 'f) \evalsto \{Array 2 3\} \end{example} \code{Copy-array} returns a copy of \cvar{array}. The copy is identical to the \cvar{array} but does not share storage with it. \begin{protos} \proto{array?}{ value}{boolean} \end{protos} \noindent Returns \code{\#t} if \cvar{value} is an array. \begin{protos} \proto{array-ref}{ array index$_0$ \ldots}{value} \protonoresult{array-set!}{ array value index$_0$ \ldots} \proto{array->vector}{ array}{vector} \proto{array-dimensions}{ array}{list} \end{protos} \noindent \code{Array-ref} returns the specified array element and \code{array-set!} replaces the element with \cvar{value}. \begin{example} (let ((a (array '(2 3) 'a 'b 'c 'd 'e 'f))) (let ((x (array-ref a 0 1))) (array-set! a 'g 0 1) (list x (array-ref a 0 1)))) \evalsto '(b g) \end{example} \code{Array->vector} returns a vector containing the elements of \cvar{array} in row-major order. \code{Array-dimensions} returns the dimensions of the array as a list. \begin{protos} \proto{make-shared-array}{ array linear-map dimension$_0$ \ldots}{array} \end{protos} \noindent \code{Make-shared-array} makes a new array that shares storage with \cvar{array} and uses \cvar{linear-map} to map indexes to elements. \cvar{Linear-map} must accept as many arguments as the number of \cvar{dimension}s given and must return a list of non-negative integers that are valid indexes into \cvar{array}. <\begin{example} (array-ref (make-shared-array a f i0 i1 ...) j0 j1 ...) \end{example} is equivalent to \begin{example} (apply array-ref a (f j0 j1 ...)) \end{example} As an example, the following function makes the transpose of a two-dimensional array: \begin{example} (define (transpose array) (let ((dimensions (array-dimensions array))) (make-shared-array array (lambda (x y) (list y x)) (cadr dimensions) (car dimensions)))) (array->vector (transpose (array '(2 3) 'a 'b 'c 'd 'e 'f))) \evalsto '(a d b e c f) \end{example} \section{Records} \label{records} New types can be constructed using the \code{define-record-type} macro from the \code{define-record-types} structure The general syntax is: \begin{example} (define-record-type \cvar{tag} \cvar{type-name} (\cvar{constructor-name} \cvar{field-tag} \ldots) \cvar{predicate-name} (\cvar{field-tag} \cvar{accessor-name} [\cvar{modifier-name}]) \ldots) \end{example} This makes the following definitions: \begin{protos} \constprotonoindex{\cvar{type-name}}{type} \protonoindex{\cvar{constructor-name}}{ field-init \ldots}{type-name} \protonoindex{\cvar{predicate-name}}{ value}{boolean} \protonoindex{\cvar{accessor-name}}{ type-name}{value} \protonoresultnoindex{\cvar{modifier-name}}{ type-name value} \end{protos} \noindent \cvar{Type-name} is the record type itself, and can be used to specify a print method (see below). \cvar{Constructor-name} is a constructor that accepts values for the fields whose tags are specified. \cvar{Predicate-name} is a predicate that returns \code{\#t} for elements of the type and \code{\#f} for everything else. The \cvar{accessor-name}s retrieve the values of fields, and the \cvar{modifier-name}'s update them. \cvar{Tag} is used in printing instances of the record type and the \cvar{field-tag}s are used in the inspector and to match constructor arguments with fields. \begin{protos} \protonoresult{define-record-discloser}{ type discloser} \end{protos} \noindent \code{Define-record-discloser} determines how records of type \cvar{type} are printed. \cvar{Discloser} should be procedure which takes a single record of type \cvar{type} and returns a list whose car is a symbol. The record will be printed as the value returned by \cvar{discloser} with curly braces used instead of the usual parenthesis. For example \begin{example} (define-record-type pare :pare (kons x y) pare? (x kar set-kar!) (y kdr)) \end{example} defines \code{kons} to be a constructor, \code{kar} and \code{kdr} to be accessors, \code{set-kar!} to be a modifier, and \code{pare?} to be a predicate for a new type of object. The type itself is named \code{:pare}. \code{Pare} is a tag used in printing the new objects. By default, the new objects print as \code{\#\{Pare\}}. The print method can be modified using \code{define-record-discloser}: \begin{example} (define-record-discloser :pare (lambda (p) `(pare ,(kar p) ,(kdr p)))) \end{example} will cause the result of \code{(kons 1 2)} to print as \code{\#\{Pare 1 2\}}. \link*{\code{Define-record-resumer}} [\code{Define-record-resumer} (section~\Ref{})] {sec:hibernation} can be used to control how records are stored in heap images. \subsection{Low-level access to records} Records are implemented using primitive objects exactly analogous to vectors. Every record has a record type (which is another record) in the first slot. Note that use of these procedures, especially \code{record-set!}, breaks the record abstraction described above; caution is advised. These procedures are in the structure \code{records}. \begin{protos} \proto{make-record}{ n value}{record} \proto{record}{ value \ldots}{record-vector} \proto{record?}{ value}{boolean} \proto{record-length}{ record}{integer} \proto{record-type}{ record}{value} \proto{record-ref}{ record i}{value} \protonoresult{record-set!}{ record i value} \end{protos} \noindent These the same as the standard \code{vector-} procedures except that they operate on records. The value returned by \code{record-length} includes the slot holding the record's type. \code{(record-type \cvar{x})} is equivalent to \code{(record-ref \cvar{x} 0)}. \subsection{Record types} Record types are themselves records of a particular type (the first slot of \code{:record-type} points to itself). A record type contains four values: the name of the record type, a list of the names its fields, and procedures for disclosing and resuming records of that type. Procedures for manipulating them are in the structure \code{record-types}. \begin{protos} \proto{make-record-type}{ name field-names}{record-type} \proto{record-type?}{ value}{boolean} \proto{record-type-name}{ record-type}{symbol} \proto{record-type-field-names}{ record-type}{symbols} \end{protos} \noindent \begin{protos} \proto{record-constructor}{ record-type field-names}{procedure} \proto{record-predicate}{ record-type}{procedure} \proto{record-accessor}{ record-type field-name}{procedure} \proto{record-modifier}{ record-type field-name}{procedure} \end{protos} \noindent These procedures construct the usual record-manipulating procedures. \code{Record-constructor} returns a constructor that is passed the initial values for the fields specified and returns a new record. \code{Record-predicate} returns a predicate that return true when passed a record of type \cvar{record-type} and false otherwise. \code{Record-accessor} and \code{record-modifier} return procedures that reference and set the given field in records of the approriate type. \begin{protos} \protonoresult{define-record-discloser}{ record-type discloser} \protonoresult{define-record-resumer}{ record-type resumer} \end{protos} \noindent \noindent \code{Record-types} is the initial exporter of \code{define-record-discloser} (re-exported by \code{define-record-types} described above) and \code{define-record-resumer} (re-exported by \link*{\code{external-calls}} [\code{external-calls} (section~\Ref{})] {sec:hibernation}). The procedures described in this section can be used to define new record-type-defining macros. \begin{example} (define-record-type pare :pare (kons x y) pare? (x kar set-kar!) (y kdr)) \end{example} is (sematically) equivalent to \begin{example} (define :pare (make-record-type 'pare '(x y))) (define kons (record-constructor :pare '(x y))) (define kar (record-accessor :pare 'x)) (define set-kar! (record-modifier :pare 'x)) (define kdr (record-accessor :pare 'y)) \end{example} The ``(semantically)'' above is because \code{define-record-type} adds declarations, which allows the type checker to detect some misuses of records, and uses more efficient definitions for the constructor, accessors, and modifiers. Ignoring the declarations, which will have to wait for another edition of the manual, what the above example actually expands into is: \begin{example} (define :pare (make-record-type 'pare '(x y))) (define (kons x y) (record :pare x y)) (define (kar r) (checked-record-ref r :pare 1)) (define (set-kar! r new) (checked-record-set! r :pare 1 new)) (define (kdr r) (checked-record-ref r :pare 2)) \end{example} \code{Checked-record-ref} and \code{Checked-record-set!} are low-level procedures that check the type of the record and access or modify it using a single VM instruction. \section{Finite record types} The structure \code{finite-types} has two macros for defining `finite' record types. These are record types for which there are a fixed number of instances, all of which are created at the same time as the record type itself. The syntax for defining an enumerated type is: \begin{example} (define-enumerated-type \cvar{tag} \cvar{type-name} \cvar{predicate-name} \cvar{vector-of-instances-name} \cvar{name-accessor} \cvar{index-accessor} (\cvar{instance-name} \ldots)) \end{example} This defines a new record type, bound to \cvar{type-name}, with as many instances as there are \cvar{instance-name}'s. \cvar{Vector-of-instances-name} is bound to a vector containing the instances of the type in the same order as the \cvar{instance-name} list. \cvar{Tag} is bound to a macro that when given an \cvar{instance-name} expands into an expression that returns corresponding instance. The name lookup is done at macro expansion time. \cvar{Predicate-name} is a predicate for the new type. \cvar{Name-accessor} and \cvar{index-accessor} are accessors for the name and index (in \cvar{vector-of-instances}) of instances of the type. \begin{example} (define-enumerated-type color :color color? colors color-name color-index (black white purple maroon)) (color-name (vector-ref colors 0)) \evalsto black (color-name (color white)) \evalsto white (color-index (color purple)) \evalsto 2 \end{example} Finite types are enumerations that allow the user to add additional fields in the type. The syntax for defining a finite type is: \begin{example} (define-finite-type \cvar{tag} \cvar{type-name} (\cvar{field-tag} \ldots) \cvar{predicate-name} \cvar{vector-of-instances-name} \cvar{name-accessor} \cvar{index-accessor} (\cvar{field-tag} \cvar{accessor-name} [\cvar{modifier-name}]) \ldots ((\cvar{instance-name} \cvar{field-value} \ldots) \ldots)) \end{example} The additional fields are specified exactly as with \code{define-record-type}. The field arguments to the constructor are listed after the \cvar{type-name}; these do not include the name and index fields. The form ends with the names and the initial field values for the instances of the type. The instances are constructed by applying the (unnamed) constructor to these initial field values. The name must be first and the remaining values must match the \cvar{field-tag}s in the constructor's argument list. %This differs from \code{define-record-type} in the following ways: %\begin{itemize} %\item No name is specified for the constructor, but the field arguments % to the constructor are listed. %\item The \cvar{vector-of-instances-name} is added; it will be bound % to a vector containing all of the instances of the type. %These are constructed by applying the (unnamed) constructor to the % initial field values at the end of the form. %\item There are names for accessors for two required fields, name % and index. %These fields are not settable, and are not to be included % in the argument list for the constructor. %\item The form ends with the names and the initial field values for % the instances of the type. %The name must be first. %The remaining values must match the \cvar{field-tag}s in the constructor's % argument list. %\item \cvar{Tag} is bound to a macro that maps \cvar{instance-name}s to the % the corresponding instance of the vector. %The name lookup is done at macro-expansion time. %\end{itemize} \begin{example} (define-finite-type color :color (red green blue) color? colors color-name color-index (red color-red) (green color-green) (blue color-blue) ((black 0 0 0) (white 255 255 255) (purple 160 32 240) (maroon 176 48 96))) (color-name (color black)) \evalsto black (color-name (vector-ref colors 1)) \evalsto white (color-index (color purple)) \evalsto 2 (color-red (color maroon)) \evalsto 176 \end{example} \section{Hash tables} These are generic hash tables, and are in the structure \code{tables}. Strictly speaking they are more maps than tables, as every table has a value for every possible key (for that type of table). All but a finite number of those values are \code{\#f}. \begin{protos} \proto{make-table}{}{table} \proto{make-symbol-table}{}{symbol-table} \proto{make-string-table}{}{string-table} \proto{make-integer-table}{}{integer-table} \proto{make-table-maker}{ compare-proc hash-proc}{procedure} \protonoresult{make-table-immutable!}{ table} \end{protos} \noindent The first four functions listed make various kinds of tables. \code{Make-table} returns a table whose keys may be symbols, integer, characters, booleans, or the empty list (these are also the values that may be used in \code{case} expressions). As with \code{case}, comparison is done using \code{eqv?}. The comparison procedures used in symbol, string, and integer tables are \code{eq?}, \code{string=?}, and \code{=}. \code{Make-table-maker} takes two procedures as arguments and returns a nullary table-making procedure. \cvar{Compare-proc} should be a two-argument equality predicate. \cvar{Hash-proc} should be a one argument procedure that takes a key and returns a non-negative integer hash value. If \code{(\cvar{compare-proc} \cvar{x} \cvar{y})} returns true, then \code{(= (\cvar{hash-proc} \cvar{x}) (\cvar{hash-proc} \cvar{y}))} must also return true. For example, \code{make-integer-table} could be defined as \code{(make-table-maker = abs)}. \code{Make-table-immutable!} prohibits future modification to its argument. \begin{protos} \proto{table?}{ value}{boolean} \proto{table-ref}{ table key}{value or {\tt \#f}} \protonoresult{table-set!}{ table key value} \protonoresult{table-walk}{ procedure table} \end{protos} \noindent \code{Table?} is the predicate for tables. \code{Table-ref} and \code{table-set!} access and modify the value of \cvar{key} in \cvar{table}. \code{Table-walk} applies \cvar{procedure}, which must accept two arguments, to every associated key and non-\code{\#f} value in \code{table}. \begin{protos} \proto{default-hash-function}{ value}{integer} \proto{string-hash}{ string}{integer} \end{protos} \noindent \code{Default-hash-function} is the hash function used in the tables returned by \code{make-table}, and \code{string-hash} it the one used by \code{make-string-table}. \section{Port extensions} These procedures are in structure \code{extended-ports}. \begin{protos} \proto{make-string-input-port}{ string}{input-port} \proto{make-string-output-port}{}{output-port} \proto{string-output-port-output}{ string-output-port}{string} \end{protos} \noindent \code{Make-string-input-port} returns an input port that that reads characters from the supplied string. An end-of-file object is returned if the user reads past the end of the string. \code{Make-string-output-port} returns an output port that saves the characters written to it. These are then returned as a string by \code{string-output-port-output}. \begin{example} (read (make-string-input-port "(a b)")) \evalsto '(a b) (let ((p (make-string-output-port))) (write '(a b) p) (let ((s (string-output-port-output p))) (display "c" p) (list s (string-output-port-output p)))) \evalsto '("(a b)" "(a b)c") \end{example} \begin{protos} \protonoresult{limit-output}{ output-port n procedure} \end{protos} \noindent \var{Procedure} is called on an output port. Output written to that port is copied to \var{output-port} until \var{n} characters have been written, at which point \code{limit-output} returns. If \var{procedure} returns before writing \var{n} characters, then \code{limit-output} also returns at that time, regardless of how many characters have been written. \begin{protos} \proto{make-tracking-input-port}{ input-port}{input-port} \proto{make-tracking-output-port}{ output-port}{output-port} \proto{current-row}{ port}{integer or {\tt \#f}} \proto{current-column}{ port}{integer or {\tt \#f}} \protonoresult{fresh-line}{ output-port} \end{protos} \noindent \code{Make-tracking-input-port} and \code{make-tracking-output-port} return ports that keep track of the current row and column and are otherwise identical to their arguments. Closing a tracking port does not close the underlying port. \code{Current-row} and \code{current-column} return \var{port}'s current read or write location. They return \code{\#f} if \var{port} does not keep track of its location. \code{Fresh-line} writes a newline character to \var{output-port} if \code{(current-row \cvar{port})} is not 0. \begin{example} (define p (open-output-port "/tmp/temp")) (list (current-row p) (current-column p)) \evalsto '(0 0) (display "012" p) (list (current-row p) (current-column p)) \evalsto '(0 3) (fresh-line p) (list (current-row p) (current-column p)) \evalsto '(1 0) (fresh-line p) (list (current-row p) (current-column p)) \evalsto '(1 0) \end{example} \section{Fluid bindings} These procedures implement dynamic binding and are in structure \code{fluids}. A \cvar{fluid} is a cell whose value can be bound dynamically. Each fluid has a top-level value that is used when the fluid is unbound in the current dynamic environment. \begin{protos} \proto{make-fluid}{ value}{fluid} \proto{fluid}{ fluid}{value} \proto{let-fluid}{ fluid value thunk}{value(s)} \proto{let-fluids}{ fluid$_0$ value$_0$ fluid$_1$ value$_1$ \ldots thunk}{value(s)} \end{protos} \noindent \code{Make-fluid} returns a new fluid with \cvar{value} as its initial top-level value. \code{Fluid} returns \code{fluid}'s current value. \code{Let-fluid} calls \code{thunk}, with \cvar{fluid} bound to \cvar{value} until \code{thunk} returns. Using a continuation to throw out of the call to \code{thunk} causes \cvar{fluid} to revert to its original value, while throwing back in causes \cvar{fluid} to be rebound to \cvar{value}. \code{Let-fluid} returns the value(s) returned by \cvar{thunk}. \code{Let-fluids} is identical to \code{let-fluid} except that it binds an arbitrary number of fluids to new values. \begin{example} (let* ((f (make-fluid 'a)) (v0 (fluid f)) (v1 (let-fluid f 'b (lambda () (fluid f)))) (v2 (fluid f))) (list v0 v1 v2)) \evalsto '(a b a) \end{example} \begin{example} (let ((f (make-fluid 'a)) (path '()) (c \#f)) (let ((add (lambda () (set! path (cons (fluid f) path))))) (add) (let-fluid f 'b (lambda () (call-with-current-continuation (lambda (c0) (set! c c0))) (add))) (add) (if (< (length path) 5) (c) (reverse path)))) \evalsto '(a b a b a) \end{example} \section{Shell commands} Structure \code{c-system-function} provides access to the C \code{system()} function. \begin{protos} \proto{have-system?}{}{boolean} \proto{system}{ string}{integer} \end{protos} \noindent \code{Have-system?} returns true if the underlying C implementation has a command processor. \code{(System \cvar{string})} passes \cvar{string} to the C \code{system()} function and returns the result. \begin{example} (begin (system "echo foo > test-file") (call-with-input-file "test-file" read)) \evalsto 'foo \end{example} \section{SRFIs} `SRFI' stands for `Scheme Request For Implementation'. An SRFI is a description of an extension to standard Scheme. Draft and final SRFI documents, a FAQ, and other information about SRFIs can be found at the \xlink{SRFI web site}[ at \code{http://srfi.schemers.org}] {http://srfi.schemers.org}. Scheme~48 includes implementations of the following (final) SRFIs: \begin{itemize} \item SRFI 1 -- List Library \item SRFI 2 -- \code{and-let*} \item SRFI 5 -- \code{let} with signatures and rest arguments \item SRFI 6 -- Basic string ports \item SRFI 7 -- Program configuration \item SRFI 8 -- \code{receive} \item SRFI 9 -- Defining record types \item SRFI 11 -- Syntax for receiving multiple values \item SRFI 13 -- String Library \item SRFI 14 -- Character-Set Library (see note below) \item SRFI 16 -- Syntax for procedures of variable arity \item SRFI 17 -- Generalized \code{set!} \item SRFI 23 -- Error reporting mechanism \end{itemize} Documentation on these can be found at the web site mentioned above. SRFI~14 includes the procedure \code{->char-set} which is not a standard Scheme identifier (in R$^5$RS the only required identifier starting with \code{-} is \code{-} itself). In the Scheme~48 version of SRFI~14 we have renamed \code{->char-set} as \code{x->char-set}. The SRFI bindings can be accessed either by opening the appropriate structure (the structure \code{srfi-}\cvar{n} contains SRFI \cvar{n}) or by loading structure \code{srfi-7} and then using the \code{,load-srfi-7-program} command to load an SRFI 7-style program. The syntax for the command is \begin{example} \code{,load-srfi-7-program \cvar{name} \cvar{filename}} \end{example} This creates a new structure and associated package, binds the structure to \cvar{name} in the configuration package, and then loads the program found in \cvar{filename} into the package. As an example, if the file \code{test.scm} contains \begin{example} (program (code (define x 10))) \end{example} this program can be loaded as follows: \begin{example} > ,load-package srfi-7 > ,load-srfi-7-program test test.scm [test] > ,in test test> x 10 test> \end{example} %\W \chapter*{Index} %\W \htmlprintindex %\T \input{doc.ind}