aboutsummaryrefslogtreecommitdiffstats
path: root/slib_7.html
diff options
context:
space:
mode:
authorThomas Bushnell, BSG <tb@debian.org>2005-11-02 14:55:21 -0800
committerBryan Newbold <bnewbold@robocracy.org>2017-02-20 00:05:32 -0800
commit34c54a22ff7818bb8b38ef4d9c87dbbcb221ba73 (patch)
tree1189d06a81277bcf8539b0260a69a19f6038effb /slib_7.html
parent611b3db17894e5fdc0db3d49eaf6743d27b44233 (diff)
parent5145dd3aa0c02c9fc496d1432fc4410674206e1d (diff)
downloadslib-34c54a22ff7818bb8b38ef4d9c87dbbcb221ba73.tar.gz
slib-34c54a22ff7818bb8b38ef4d9c87dbbcb221ba73.zip
Import Debian changes 3a2-1debian/3a2-1
slib (3a2-1) unstable; urgency=low * New upstream release. * Acknowledge NMU. (Closes: #281809) * Makefile: Don't hack Makefile; use rules instead. * debian/rules: Set on make invocations: prefix, htmldir, TEXI2HTML. * debian/rules (clean): Clean more stuff here. * Makefile: Comment out old rule for $(htmldir)slib_toc.html. Instead, specify directly that the texi2html invocation produces that file. * debian/rules (binary-indep): Find web files in slib subdir. * debian/control (Build-Depends-Indep): Go back to using scm.
Diffstat (limited to 'slib_7.html')
-rw-r--r--slib_7.html8218
1 files changed, 0 insertions, 8218 deletions
diff --git a/slib_7.html b/slib_7.html
deleted file mode 100644
index 932a042..0000000
--- a/slib_7.html
+++ /dev/null
@@ -1,8218 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html40/loose.dtd">
-<HTML>
-<!-- Created on January, 10 2005 by texi2html 1.66 -->
-<!--
-Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
- Karl Berry <karl@freefriends.org>
- Olaf Bachmann <obachman@mathematik.uni-kl.de>
- and many others.
-Maintained by: Many creative people <dev@texi2html.cvshome.org>
-Send bugs and suggestions to <users@texi2html.cvshome.org>
-
--->
-<HEAD>
-<TITLE>SLIB: Other Packages</TITLE>
-
-<META NAME="description" CONTENT="SLIB: Other Packages">
-<META NAME="keywords" CONTENT="SLIB: Other Packages">
-<META NAME="resource-type" CONTENT="document">
-<META NAME="distribution" CONTENT="global">
-<META NAME="Generator" CONTENT="texi2html 1.66">
-
-</HEAD>
-
-<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
-
-<A NAME="SEC183"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC182"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H1> 7. Other Packages </H1>
-<!--docid::SEC183::-->
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC184">7.1 Data Structures</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Various data structures.</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC207">7.2 Sorting and Searching</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC225">7.3 Procedures</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Miscellaneous utility procedures.</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC235">7.4 Standards Support</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Support for Scheme Standards.</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC263">7.5 Session Support</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">REPL and Debugging.</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC269">7.6 System Interface</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'system, 'getenv, and other programs.</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC276">7.7 Extra-SLIB Packages</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Outside the envelope.</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Data Structures"></A>
-<HR SIZE="6">
-<A NAME="SEC184"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC185"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 7.1 Data Structures </H2>
-<!--docid::SEC184::-->
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'array</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'subarray</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'array-for-each</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'alist</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'byte</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'byte-number</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'matfile</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'pnm</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'collect</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'dynamic</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'hash-table</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC197">7.1.12 Macroless Object System</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'object</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'priority-queue</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'queue</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'record</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Arrays"></A>
-<HR SIZE="6">
-<A NAME="SEC185"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC186"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.1 Arrays </H3>
-<!--docid::SEC185::-->
-<P>
-
-<CODE>(require 'array)</CODE>
-<A NAME="IDX1094"></A>
-</P>
-<P>
-
-<A NAME="IDX1095"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array?</B> <I>obj</I>
-<DD><P>
-
-Returns <CODE>#t</CODE> if the <VAR>obj</VAR> is an array, and <CODE>#f</CODE> if not.
-</P>
-</DL>
-<EM>Note:</EM> Arrays are not disjoint from other Scheme types. Strings
-and vectors also satisfy <CODE>array?</CODE>. A disjoint array predicate can
-be written:
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (strict-array? obj)
- (and (array? obj) (not (string? obj)) (not (vector? obj))))
-</pre></td></tr></table><P>
-
-<A NAME="IDX1096"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array=?</B> <I>array1 array2</I>
-<DD><P>
-
-Returns <CODE>#t</CODE> if <VAR>array1</VAR> and <VAR>array2</VAR> have the same rank and shape and the
-corresponding elements of <VAR>array1</VAR> and <VAR>array2</VAR> are <CODE>equal?</CODE>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(array=? (create-array '#(foo) 3 3)
- (create-array '#(foo) '(0 2) '(0 2)))
- => #t
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1097"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>create-array</B> <I>prototype bound1 bound2 <small>...</small></I>
-<DD><P>
-
-Creates and returns an array of type <VAR>prototype</VAR> with dimensions <VAR>bound1</VAR>, <VAR>bound2</VAR>,
-<small>...</small> and filled with elements from <VAR>prototype</VAR>. <VAR>prototype</VAR> must be an array,
-vector, or string. The implementation-dependent type of the returned
-array will be the same as the type of <VAR>prototype</VAR>; except if that would be a
-vector or string with non-zero origin, in which case some variety of
-array will be returned.
-</P>
-<P>
-
-If the <VAR>prototype</VAR> has no elements, then the initial contents of the returned
-array are unspecified. Otherwise, the returned array will be filled
-with the element at the origin of <VAR>prototype</VAR>.
-</P>
-</DL>
-These functions return a prototypical uniform-array enclosing the
-optional argument (which must be of the correct type). If the
-uniform-array type is supported by the implementation, then it is
-returned; defaulting to the next larger precision type; resorting
-finally to vector.
-<P>
-
-<A NAME="IDX1098"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ac64</B> <I>z</I>
-<DD><P>
-
-<A NAME="IDX1099"></A>
-<DT><U>Function:</U> <B>ac64</B>
-<DD>Returns a high-precision complex uniform-array prototype.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1100"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ac32</B> <I>z</I>
-<DD><P>
-
-<A NAME="IDX1101"></A>
-<DT><U>Function:</U> <B>ac32</B>
-<DD>Returns a complex uniform-array prototype.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1102"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ar64</B> <I>x</I>
-<DD><P>
-
-<A NAME="IDX1103"></A>
-<DT><U>Function:</U> <B>ar64</B>
-<DD>Returns a high-precision real uniform-array prototype.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1104"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ar32</B> <I>x</I>
-<DD><P>
-
-<A NAME="IDX1105"></A>
-<DT><U>Function:</U> <B>ar32</B>
-<DD>Returns a real uniform-array prototype.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1106"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>as64</B> <I>n</I>
-<DD><P>
-
-<A NAME="IDX1107"></A>
-<DT><U>Function:</U> <B>as64</B>
-<DD>Returns an exact signed integer uniform-array prototype with at least
-64 bits of precision.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1108"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>as32</B> <I>n</I>
-<DD><P>
-
-<A NAME="IDX1109"></A>
-<DT><U>Function:</U> <B>as32</B>
-<DD>Returns an exact signed integer uniform-array prototype with at least
-32 bits of precision.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1110"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>as16</B> <I>n</I>
-<DD><P>
-
-<A NAME="IDX1111"></A>
-<DT><U>Function:</U> <B>as16</B>
-<DD>Returns an exact signed integer uniform-array prototype with at least
-16 bits of precision.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1112"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>as8</B> <I>n</I>
-<DD><P>
-
-<A NAME="IDX1113"></A>
-<DT><U>Function:</U> <B>as8</B>
-<DD>Returns an exact signed integer uniform-array prototype with at least
-8 bits of precision.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1114"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>au64</B> <I>k</I>
-<DD><P>
-
-<A NAME="IDX1115"></A>
-<DT><U>Function:</U> <B>au64</B>
-<DD>Returns an exact non-negative integer uniform-array prototype with at
-least 64 bits of precision.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1116"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>au32</B> <I>k</I>
-<DD><P>
-
-<A NAME="IDX1117"></A>
-<DT><U>Function:</U> <B>au32</B>
-<DD>Returns an exact non-negative integer uniform-array prototype with at
-least 32 bits of precision.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1118"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>au16</B> <I>k</I>
-<DD><P>
-
-<A NAME="IDX1119"></A>
-<DT><U>Function:</U> <B>au16</B>
-<DD>Returns an exact non-negative integer uniform-array prototype with at
-least 16 bits of precision.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1120"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>au8</B> <I>k</I>
-<DD><P>
-
-<A NAME="IDX1121"></A>
-<DT><U>Function:</U> <B>au8</B>
-<DD>Returns an exact non-negative integer uniform-array prototype with at
-least 8 bits of precision.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1122"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>at1</B> <I>bool</I>
-<DD><P>
-
-<A NAME="IDX1123"></A>
-<DT><U>Function:</U> <B>at1</B>
-<DD>Returns a boolean uniform-array prototype.
-</P>
-</DL>
-When constructing an array, <VAR>bound</VAR> is either an inclusive range of
-indices expressed as a two element list, or an upper bound expressed as
-a single integer. So
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(create-array '#(foo) 3 3) == (create-array '#(foo) '(0 2) '(0 2))
-</pre></td></tr></table><P>
-
-<A NAME="IDX1124"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-shared-array</B> <I>array mapper bound1 bound2 <small>...</small></I>
-<DD><P>
-
-<CODE>make-shared-array</CODE> can be used to create shared subarrays of other
-arrays. The <VAR>mapper</VAR> is a function that translates coordinates in
-the new array into coordinates in the old array. A <VAR>mapper</VAR> must be
-linear, and its range must stay within the bounds of the old array, but
-it can be otherwise arbitrary. A simple example:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define fred (create-array '#(#f) 8 8))
-(define freds-diagonal
- (make-shared-array fred (lambda (i) (list i i)) 8))
-(array-set! freds-diagonal 'foo 3)
-(array-ref fred 3 3)
- => FOO
-(define freds-center
- (make-shared-array fred (lambda (i j) (list (+ 3 i) (+ 3 j)))
- 2 2))
-(array-ref freds-center 0 0)
- => FOO
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1125"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array-rank</B> <I>obj</I>
-<DD><P>
-
-Returns the number of dimensions of <VAR>obj</VAR>. If <VAR>obj</VAR> is not an array, 0 is
-returned.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1126"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array-shape</B> <I>array</I>
-<DD><P>
-
-Returns a list of inclusive bounds.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(array-shape (create-array '#() 3 5))
- => ((0 2) (0 4))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1127"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array-dimensions</B> <I>array</I>
-<DD><P>
-
-<CODE>array-dimensions</CODE> is similar to <CODE>array-shape</CODE> but replaces
-elements with a 0 minimum with one greater than the maximum.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(array-dimensions (create-array '#() 3 5))
- => (3 5)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1128"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array-in-bounds?</B> <I>array index1 index2 <small>...</small></I>
-<DD><P>
-
-Returns <CODE>#t</CODE> if its arguments would be acceptable to
-<CODE>array-ref</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1129"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array-ref</B> <I>array index1 index2 <small>...</small></I>
-<DD><P>
-
-Returns the (<VAR>index1</VAR>, <VAR>index2</VAR>, <small>...</small>) element of <VAR>array</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1130"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>array-set!</B> <I>array obj index1 index2 <small>...</small></I>
-<DD><P>
-
-Stores <VAR>obj</VAR> in the (<VAR>index1</VAR>, <VAR>index2</VAR>, <small>...</small>) element of <VAR>array</VAR>. The value returned
-by <CODE>array-set!</CODE> is unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="Subarrays"></A>
-<HR SIZE="6">
-<A NAME="SEC186"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC185"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC187"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.2 Subarrays </H3>
-<!--docid::SEC186::-->
-<P>
-
-<CODE>(require 'subarray)</CODE>
-<A NAME="IDX1131"></A>
-</P>
-<P>
-
-<A NAME="IDX1132"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>subarray</B> <I>array select <small>...</small></I>
-<DD><P>
-
-selects a subset of an array. For <VAR>array</VAR> of rank n, there must be at least
-n <VAR>selects</VAR> arguments. For 0 &lt;= <I>j</I> &lt; n, <VAR>selects</VAR><I>j</I> is either an integer, a
-list of two integers within the range for the <I>j</I>th index, or #f.
-</P>
-<P>
-
-When <VAR>selects</VAR><I>j</I> is a list of two integers, then the <I>j</I>th index is
-restricted to that subrange in the returned array.
-</P>
-<P>
-
-When <VAR>selects</VAR><I>j</I> is #f, then the full range of the <I>j</I>th index is
-accessible in the returned array. An elided argument is equivalent to #f.
-</P>
-<P>
-
-When <VAR>selects</VAR><I>j</I> is an integer, then the rank of the returned array is
-less than <VAR>array</VAR>, and only elements whose <I>j</I>th index equals <VAR>selects</VAR><I>j</I> are
-shared.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>&gt; (define ra '#2A((a b c) (d e f)))
-#&lt;unspecified&gt;
-&gt; (subarray ra 0 #f)
-#1A(a b c)
-&gt; (subarray ra 1 #f)
-#1A(d e f)
-&gt; (subarray ra #f 1)
-#1A(b e)
-&gt; (subarray ra '(0 1) #f)
-#2A((a b c) (d e f))
-&gt; (subarray ra #f '(0 1))
-#2A((a b) (d e))
-&gt; (subarray ra #f '(1 2))
-#2A((b c) (e f))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1133"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>subarray0</B> <I>array select <small>...</small></I>
-<DD><P>
-
-Behaves like subarray, but aligns the returned array origin to
-0 <small>...</small>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1134"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array-align</B> <I>array coord <small>...</small></I>
-<DD><P>
-
-Returns an array shared with <VAR>array</VAR> but with a different origin. The <VAR>coords</VAR>
-are the exact integer coordinates of the new origin. Indexes
-corresponding to missing or #f coordinates are not realigned.
-</P>
-<P>
-
-For example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define ra2 (create-array '#(5) '(5 9) '(-4 0)))
-(array-shape ra2) => ((5 9) (-4 0))
-(array-shape (array-align ra2 0 0)) => ((0 4) (0 4))
-(array-shape (array-align ra2 0)) => ((0 4) (-4 0))
-(array-shape (array-align ra2)) => ((5 9) (-4 0))
-(array-shape (array-align ra2 0 #f)) => ((0 4) (-4 0))
-(array-shape (array-align ra2 #f 0)) => ((5 9) (0 4))
-</pre></td></tr></table></DL>
-
-<A NAME="IDX1135"></A>
-<DL>
-<DT><U>Function:</U> <B>array-trim</B> <I>array trim <small>...</small></I>
-<DD><P>
-
-Returns a subarray sharing contents with <VAR>array</VAR> except for slices removed
-from either side of each dimension. Each of the <VAR>trims</VAR> is an exact
-integer indicating how much to trim. A positive <VAR>s</VAR> trims the
-data from the lower end and reduces the upper bound of the result; a
-negative <VAR>s</VAR> trims from the upper end and increases the lower
-bound.
-</P>
-<P>
-
-For example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(array-trim '#(0 1 2 3 4) 1) => #1A(1 2 3 4) ;; shape is ((0 3))
-(array-trim '#(0 1 2 3 4) -1) => #1A(0 1 2 3) ;; shape is ((1 4))
-
-(require 'array-for-each)
-(define (centered-difference ra)
- (array-map - (array-trim ra 1) (array-trim ra -1)))
-(define (forward-difference ra)
- (array-map - (array-trim ra 1) ra))
-(define (backward-difference ra)
- (array-map - ra (array-trim ra -1)))
-
-(centered-difference '#(0 1 3 5 9 22))
- => #1A(3 4 6 17) ;;shape is ((1 4))
-(backward-difference '#(0 1 3 5 9 22))
- => #1A(1 2 2 4 13) ;; shape is ((1 5))
-(forward-difference '#(0 1 3 5 9 22))
- => #(1 2 2 4 13) ;; shape is ((0 4))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Array Mapping"></A>
-<HR SIZE="6">
-<A NAME="SEC187"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC186"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC188"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.3 Array Mapping </H3>
-<!--docid::SEC187::-->
-<P>
-
-<CODE>(require 'array-for-each)</CODE>
-<A NAME="IDX1136"></A>
-</P>
-<P>
-
-<A NAME="IDX1137"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>array-map!</B> <I>array0 proc array1 <small>...</small></I>
-<DD><P>
-
-<VAR>array1</VAR>, <small>...</small> must have the same number of dimensions as
-<VAR>array0</VAR> and have a range for each index which includes the range
-for the corresponding index in <VAR>array0</VAR>. <VAR>proc</VAR> is applied to
-each tuple of elements of <VAR>array1</VAR> <small>...</small> and the result is stored
-as the corresponding element in <VAR>array0</VAR>. The value returned is
-unspecified. The order of application is unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1138"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array-map</B> <I>prototype proc array1 array2 <small>...</small></I>
-<DD><P>
-
-<VAR>array2</VAR>, <small>...</small> must have the same number of dimensions as
-<VAR>array1</VAR> and have a range for each index which includes the
-range for the corresponding index in <VAR>array1</VAR>. <VAR>proc</VAR> is
-applied to each tuple of elements of <VAR>array1</VAR>, <VAR>array2</VAR>,
-<small>...</small> and the result is stored as the corresponding element in a
-new array of type <VAR>prototype</VAR>. The new array is returned. The
-order of application is unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1139"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array-for-each</B> <I>proc array0 <small>...</small></I>
-<DD><P>
-
-<VAR>proc</VAR> is applied to each tuple of elements of <VAR>array0</VAR> <small>...</small>
-in row-major order. The value returned is unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1140"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>array-indexes</B> <I>array</I>
-<DD><P>
-
-Returns an array of lists of indexes for <VAR>array</VAR> such that, if
-<VAR>li</VAR> is a list of indexes for which <VAR>array</VAR> is defined,
-(equal? <VAR>li</VAR> (apply array-ref (array-indexes <VAR>array</VAR>)
-<VAR>li</VAR>)).
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1141"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>array-index-map!</B> <I>array proc</I>
-<DD><P>
-
-applies <VAR>proc</VAR> to the indices of each element of <VAR>array</VAR> in
-turn, storing the result in the corresponding element. The value
-returned and the order of application are unspecified.
-</P>
-<P>
-
-One can implement <VAR>array-indexes</VAR> as
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (array-indexes array)
- (let ((ra (apply create-array '#() (array-shape array))))
- (array-index-map! ra (lambda x x))
- ra))
-</pre></td></tr></table>Another example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (apl:index-generator n)
- (let ((v (make-vector n 1)))
- (array-index-map! v (lambda (i) i))
- v))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1142"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>array-copy!</B> <I>source destination</I>
-<DD><P>
-
-Copies every element from vector or array <VAR>source</VAR> to the
-corresponding element of <VAR>destination</VAR>. <VAR>destination</VAR> must
-have the same rank as <VAR>source</VAR>, and be at least as large in each
-dimension. The order of copying is unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="Association Lists"></A>
-<HR SIZE="6">
-<A NAME="SEC188"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC187"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC189"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.4 Association Lists </H3>
-<!--docid::SEC188::-->
-<P>
-
-<CODE>(require 'alist)</CODE>
-<A NAME="IDX1143"></A>
-</P>
-<P>
-
-Alist functions provide utilities for treating a list of key-value pairs
-as an associative database. These functions take an equality predicate,
-<VAR>pred</VAR>, as an argument. This predicate should be repeatable,
-symmetric, and transitive.
-</P>
-<P>
-
-Alist functions can be used with a secondary index method such as hash
-tables for improved performance.
-</P>
-<P>
-
-<A NAME="IDX1144"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>predicate-&gt;asso</B> <I>pred</I>
-<DD><P>
-
-Returns an <EM>association function</EM> (like <CODE>assq</CODE>, <CODE>assv</CODE>, or
-<A NAME="IDX1145"></A>
-<CODE>assoc</CODE>) corresponding to <VAR>pred</VAR>. The returned function
-returns a key-value pair whose key is <CODE>pred</CODE>-equal to its first
-argument or <CODE>#f</CODE> if no key in the alist is <VAR>pred</VAR>-equal to the
-first argument.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1146"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>alist-inquirer</B> <I>pred</I>
-<DD><P>
-
-Returns a procedure of 2 arguments, <VAR>alist</VAR> and <VAR>key</VAR>, which
-returns the value associated with <VAR>key</VAR> in <VAR>alist</VAR> or <CODE>#f</CODE> if
-<VAR>key</VAR> does not appear in <VAR>alist</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1147"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>alist-associator</B> <I>pred</I>
-<DD><P>
-
-Returns a procedure of 3 arguments, <VAR>alist</VAR>, <VAR>key</VAR>, and
-<VAR>value</VAR>, which returns an alist with <VAR>key</VAR> and <VAR>value</VAR>
-associated. Any previous value associated with <VAR>key</VAR> will be
-lost. This returned procedure may or may not have side effects on its
-<VAR>alist</VAR> argument. An example of correct usage is:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define put (alist-associator string-ci=?))
-(define alist '())
-(set! alist (put alist &quot;Foo&quot; 9))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1148"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>alist-remover</B> <I>pred</I>
-<DD><P>
-
-Returns a procedure of 2 arguments, <VAR>alist</VAR> and <VAR>key</VAR>, which
-returns an alist with an association whose <VAR>key</VAR> is key removed.
-This returned procedure may or may not have side effects on its
-<VAR>alist</VAR> argument. An example of correct usage is:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define rem (alist-remover string-ci=?))
-(set! alist (rem alist &quot;foo&quot;))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1149"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>alist-map</B> <I>proc alist</I>
-<DD><P>
-
-Returns a new association list formed by mapping <VAR>proc</VAR> over the
-keys and values of <VAR>alist</VAR>. <VAR>proc</VAR> must be a function of 2
-arguments which returns the new value part.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1150"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>alist-for-each</B> <I>proc alist</I>
-<DD><P>
-
-Applies <VAR>proc</VAR> to each pair of keys and values of <VAR>alist</VAR>.
-<VAR>proc</VAR> must be a function of 2 arguments. The returned value is
-unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="Byte"></A>
-<HR SIZE="6">
-<A NAME="SEC189"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC188"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC190"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.5 Byte </H3>
-<!--docid::SEC189::-->
-<P>
-
-<CODE>(require 'byte)</CODE>
-<A NAME="IDX1151"></A>
-</P>
-<P>
-
-Some algorithms are expressed in terms of arrays of small integers.
-Using Scheme strings to implement these arrays is not portable vis-a-vis
-the correspondence between integers and characters and non-ascii
-character sets. These functions abstract the notion of a <EM>byte</EM>.
-<A NAME="IDX1152"></A>
-<A NAME="IDX1153"></A>
-</P>
-<P>
-
-<A NAME="IDX1154"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>byte-ref</B> <I>bytes k</I>
-<DD><P>
-
-<VAR>k</VAR> must be a valid index of <VAR>bytes</VAR>. <CODE>byte-ref</CODE> returns byte <VAR>k</VAR> of <VAR>bytes</VAR> using
-zero-origin indexing.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1155"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>byte-set!</B> <I>bytes k byte</I>
-<DD><P>
-
-<VAR>k</VAR> must be a valid index of <VAR>bytes</VAR>, and <VAR>byte</VAR> must be a small
-nonnegative integer. <CODE>byte-set!</CODE> stores <VAR>byte</VAR> in element <VAR>k</VAR> of <VAR>bytes</VAR> and
-returns an unspecified value.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1156"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-bytes</B> <I>k byte</I>
-<DD><P>
-
-<A NAME="IDX1157"></A>
-<DT><U>Function:</U> <B>make-bytes</B> <I>k</I>
-<DD><CODE>make-bytes</CODE> returns a newly allocated byte-array of length <VAR>k</VAR>. If <VAR>byte</VAR> is
-given, then all elements of the byte-array are initialized to <VAR>byte</VAR>,
-otherwise the contents of the byte-array are unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1158"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bytes-length</B> <I>bytes</I>
-<DD><P>
-
-<CODE>bytes-length</CODE> returns length of byte-array <VAR>bytes</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1159"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bytes</B> <I>byte <small>...</small></I>
-<DD><P>
-
-Returns a newly allocated byte-array composed of the small
-nonnegative arguments.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1160"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bytes-&gt;list</B> <I>bytes</I>
-<DD><P>
-
-<CODE>bytes-&gt;list</CODE> returns a newly allocated list of the bytes that make up the
-given byte-array.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1161"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list-&gt;bytes</B> <I>bytes</I>
-<DD><P>
-
-<CODE>list-&gt;bytes</CODE> returns a newly allocated byte-array formed from the small
-nonnegative integers in the list <VAR>bytes</VAR>.
-</P>
-</DL>
-<CODE>Bytes-&gt;list</CODE> and <CODE>list-&gt;bytes</CODE> are inverses so far as
-<CODE>equal?</CODE> is concerned.
-<A NAME="IDX1162"></A>
-<P>
-
-<A NAME="IDX1163"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bytes-copy</B> <I>bytes</I>
-<DD><P>
-
-Returns a newly allocated copy of the given <VAR>bytes</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1164"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>bytes-reverse!</B> <I>bytes</I>
-<DD><P>
-
-Reverses the order of byte-array <VAR>bytes</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1165"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bytes-reverse</B> <I>bytes</I>
-<DD><P>
-
-Returns a newly allocated bytes-array consisting of the elements of
-<VAR>bytes</VAR> in reverse order.
-</P>
-</DL>
-<A NAME="IDX1166"></A>
-Input and output of bytes should be with ports opened in <EM>binary</EM>
-<A NAME="IDX1167"></A>
-mode (see section <A HREF="slib_2.html#SEC16">2.3 Input/Output</A>). Calling <CODE>open-file</CODE> with 'rb or
-<A NAME="IDX1168"></A>
-'wb modes argument will return a binary port if the Scheme
-implementation supports it.
-<P>
-
-<A NAME="IDX1169"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>write-byte</B> <I>byte port</I>
-<DD><P>
-
-<A NAME="IDX1170"></A>
-<DT><U>Function:</U> <B>write-byte</B> <I>byte</I>
-<DD>Writes the byte <VAR>byte</VAR> (not an external representation of the byte) to
-the given <VAR>port</VAR> and returns an unspecified value. The <VAR>port</VAR> argument may
-be omitted, in which case it defaults to the value returned by
-<CODE>current-output-port</CODE>.
-<A NAME="IDX1171"></A>
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1172"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>read-byte</B> <I>port</I>
-<DD><P>
-
-<A NAME="IDX1173"></A>
-<DT><U>Function:</U> <B>read-byte</B>
-<DD>Returns the next byte available from the input <VAR>port</VAR>, updating the <VAR>port</VAR>
-to point to the following byte. If no more bytes are available, an
-end-of-file object is returned. <VAR>port</VAR> may be omitted, in which case it
-defaults to the value returned by <CODE>current-input-port</CODE>.
-<A NAME="IDX1174"></A>
-</P>
-</DL>
-When reading and writing binary numbers with <CODE>read-bytes</CODE> and
-<CODE>write-bytes</CODE>, the sign of the length argument determines the
-endianness (order) of bytes. Positive treats them as big-endian,
-the first byte input or output is highest order. Negative treats
-them as little-endian, the first byte input or output is the lowest
-order.
-<P>
-
-Once read in, SLIB treats byte sequences as big-endian. The
-multi-byte sequences produced and used by number conversion routines
-see section <A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A> are always big-endian.
-</P>
-<P>
-
-<A NAME="IDX1175"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>read-bytes</B> <I>n port</I>
-<DD><P>
-
-<A NAME="IDX1176"></A>
-<DT><U>Function:</U> <B>read-bytes</B> <I>n</I>
-<DD><CODE>read-bytes</CODE> returns a newly allocated bytes-array filled with
-<CODE>(abs <VAR>n</VAR>)</CODE> bytes read from <VAR>port</VAR>. If <VAR>n</VAR> is positive, then
-the first byte read is stored at index 0; otherwise the last byte
-read is stored at index 0. Note that the length of the returned
-string will be less than <CODE>(abs <VAR>n</VAR>)</CODE> if <VAR>port</VAR> reaches
-end-of-file.
-</P>
-<P>
-
-<VAR>port</VAR> may be omitted, in which case it defaults to the value returned
-by <CODE>current-input-port</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1177"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>write-bytes</B> <I>bytes n port</I>
-<DD><P>
-
-<A NAME="IDX1178"></A>
-<DT><U>Function:</U> <B>write-bytes</B> <I>bytes n</I>
-<DD><CODE>write-bytes</CODE> writes <CODE>(abs <VAR>n</VAR>)</CODE> bytes to output-port <VAR>port</VAR>. If <VAR>n</VAR> is
-positive, then the first byte written is index 0 of <VAR>bytes</VAR>; otherwise
-the last byte written is index 0 of <VAR>bytes</VAR>. <CODE>write-bytes</CODE> returns an unspecified
-value.
-</P>
-<P>
-
-<VAR>port</VAR> may be omitted, in which case it defaults to the value returned
-by <CODE>current-output-port</CODE>.
-</P>
-</DL>
-<CODE>substring-read!</CODE> and <CODE>substring-write</CODE> provide
-lower-level procedures for reading and writing blocks of bytes. The
-relative size of <VAR>start</VAR> and <VAR>end</VAR> determines the order of
-writing.
-<P>
-
-<A NAME="IDX1179"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>substring-read!</B> <I>string start end port</I>
-<DD><P>
-
-<A NAME="IDX1180"></A>
-<DT><U>Procedure:</U> <B>substring-read!</B> <I>string start end</I>
-<DD>Fills <VAR>string</VAR> with up to <CODE>(abs (- <VAR>start</VAR> <VAR>end</VAR>))</CODE> bytes
-read from <VAR>port</VAR>. The first byte read is stored at index <VAR>string</VAR>.
-<CODE>substring-read!</CODE> returns the number of bytes read.
-</P>
-<P>
-
-<VAR>port</VAR> may be omitted, in which case it defaults to the value returned
-by <CODE>current-input-port</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1181"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>substring-write</B> <I>string start end port</I>
-<DD><P>
-
-<A NAME="IDX1182"></A>
-<DT><U>Function:</U> <B>substring-write</B> <I>string start end</I>
-<DD><CODE>substring-write</CODE> writes <CODE>(abs (- <VAR>start</VAR> <VAR>end</VAR>))</CODE> bytes to
-output-port <VAR>port</VAR>. The first byte written is index <VAR>start</VAR> of <VAR>string</VAR>. <CODE>substring-write</CODE>
-returns the number of bytes written.
-</P>
-<P>
-
-<VAR>port</VAR> may be omitted, in which case it defaults to the value returned
-by <CODE>current-output-port</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="Byte/Number Conversions"></A>
-<HR SIZE="6">
-<A NAME="SEC190"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC189"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC192"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.6 Byte/Number Conversions </H3>
-<!--docid::SEC190::-->
-<P>
-
-<CODE>(require 'byte-number)</CODE>
-<A NAME="IDX1183"></A>
-</P>
-<P>
-
-The multi-byte sequences produced and used by numeric conversion
-routines are always big-endian. Endianness can be changed during
-reading and writing bytes using <CODE>read-bytes</CODE> and
-<CODE>write-bytes</CODE> See section <A HREF="slib_7.html#SEC189">read-bytes</A>.
-</P>
-<P>
-
-The sign of the length argument to bytes/integer conversion
-procedures determines the signedness of the number.
-</P>
-<P>
-
-<A NAME="IDX1184"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bytes-&gt;integer</B> <I>bytes n</I>
-<DD><P>
-
-Converts the first <CODE>(abs <VAR>n</VAR>)</CODE> bytes of big-endian <VAR>bytes</VAR> array
-to an integer. If <VAR>n</VAR> is negative then the integer coded by the
-bytes are treated as two's-complement (can be negative).
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(bytes-&gt;integer (bytes 0 0 0 15) -4) => 15
-(bytes-&gt;integer (bytes 0 0 0 15) 4) => 15
-(bytes-&gt;integer (bytes 255 255 255 255) -4) => -1
-(bytes-&gt;integer (bytes 255 255 255 255) 4) => 4294967295
-(bytes-&gt;integer (bytes 128 0 0 0) -4) => -2147483648
-(bytes-&gt;integer (bytes 128 0 0 0) 4) => 2147483648
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1185"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>integer-&gt;bytes</B> <I>n len</I>
-<DD><P>
-
-Converts the integer <VAR>n</VAR> to a byte-array of <CODE>(abs <VAR>n</VAR>)</CODE>
-bytes. If <VAR>n</VAR> and <VAR>len</VAR> are both negative, then the bytes in the
-returned array are coded two's-complement.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(bytes-&gt;list (integer-&gt;bytes 15 -4)) => (0 0 0 15)
-(bytes-&gt;list (integer-&gt;bytes 15 4)) => (0 0 0 15)
-(bytes-&gt;list (integer-&gt;bytes -1 -4)) => (255 255 255 255)
-(bytes-&gt;list (integer-&gt;bytes 4294967295 4)) => (255 255 255 255)
-(bytes-&gt;list (integer-&gt;bytes -2147483648 -4)) => (128 0 0 0)
-(bytes-&gt;list (integer-&gt;bytes 2147483648 4)) => (128 0 0 0)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1186"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bytes-&gt;ieee-float</B> <I>bytes</I>
-<DD><P>
-
-<VAR>bytes</VAR> must be a 4-element byte-array. <CODE>bytes-&gt;ieee-float</CODE> calculates and returns the
-value of <VAR>bytes</VAR> interpreted as a big-endian IEEE 4-byte (32-bit) number.
-</P>
-</DL>
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(bytes-&gt;ieee-float (bytes #x40 0 0 0)) => 2.0
-(bytes-&gt;ieee-float (bytes #x40 #xd0 0 0)) => 6.5
-(bytes-&gt;ieee-float (bytes #xc0 #xd0 0 0)) => -6.5
-
-(bytes-&gt;ieee-float (bytes 0 #x80 0 0)) => 11.754943508222875e-39
-(bytes-&gt;ieee-float (bytes 0 #x40 0 0)) => 5.877471754111437e-39
-(bytes-&gt;ieee-float (bytes 0 0 0 1)) => 1.401298464324817e-45
-
-(bytes-&gt;ieee-float (bytes #xff #x80 0 0)) => -1/0
-(bytes-&gt;ieee-float (bytes #x7f #x80 0 0)) => 1/0
-(bytes-&gt;ieee-float (bytes #x7f #x80 0 1)) => 0/0
-</pre></td></tr></table><P>
-
-<A NAME="IDX1187"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>bytes-&gt;ieee-double</B> <I>bytes</I>
-<DD><P>
-
-<VAR>bytes</VAR> must be a 8-element byte-array. <CODE>bytes-&gt;ieee-double</CODE> calculates and returns the
-value of <VAR>bytes</VAR> interpreted as a big-endian IEEE 8-byte (64-bit) number.
-</P>
-</DL>
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(bytes-&gt;ieee-double (bytes 0 0 0 0 0 0 0 0)) => 0.0
-(bytes-&gt;ieee-double (bytes #x40 0 0 0 0 0 0 0)) => 2
-(bytes-&gt;ieee-double (bytes #x40 #x1A 0 0 0 0 0 0)) => 6.5
-(bytes-&gt;ieee-double (bytes #xC0 #x1A 0 0 0 0 0 0)) => -6.5
-
-(bytes-&gt;ieee-double (bytes 0 8 0 0 0 0 0 0)) => 11.125369292536006e-309
-(bytes-&gt;ieee-double (bytes 0 4 0 0 0 0 0 0)) => 5.562684646268003e-309
-(bytes-&gt;ieee-double (bytes 0 0 0 0 0 0 0 1)) => 4.0e-324
-
-(bytes-&gt;ieee-double (bytes #xFF #xF0 0 0 0 0 0 0)) => -1/0
-(bytes-&gt;ieee-double (bytes #x7F #xF0 0 0 0 0 0 0)) => 1/0
-(bytes-&gt;ieee-double (bytes #x7F #xF8 0 0 0 0 0 0)) => 0/0
-</pre></td></tr></table><P>
-
-<A NAME="IDX1188"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ieee-float-&gt;bytes</B> <I>x</I>
-<DD><P>
-
-Returns a 4-element byte-array encoding the IEEE single-precision
-floating-point of <VAR>x</VAR>.
-</P>
-</DL>
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(bytes-&gt;list (ieee-float-&gt;bytes 2.0)) => (64 0 0 0)
-(bytes-&gt;list (ieee-float-&gt;bytes 6.5)) => (64 208 0 0)
-(bytes-&gt;list (ieee-float-&gt;bytes -6.5)) => (192 208 0 0)
-
-(bytes-&gt;list (ieee-float-&gt;bytes 11.754943508222875e-39)) => ( 0 128 0 0)
-(bytes-&gt;list (ieee-float-&gt;bytes 5.877471754111438e-39)) => ( 0 64 0 0)
-(bytes-&gt;list (ieee-float-&gt;bytes 1.401298464324817e-45)) => ( 0 0 0 1)
-
-(bytes-&gt;list (ieee-float-&gt;bytes -1/0)) => (255 128 0 0)
-(bytes-&gt;list (ieee-float-&gt;bytes 1/0)) => (127 128 0 0)
-(bytes-&gt;list (ieee-float-&gt;bytes 0/0)) => (127 128 0 1)
-</pre></td></tr></table><P>
-
-<A NAME="IDX1189"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ieee-double-&gt;bytes</B> <I>x</I>
-<DD><P>
-
-Returns a 8-element byte-array encoding the IEEE double-precision
-floating-point of <VAR>x</VAR>.
-</P>
-</DL>
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(bytes-&gt;list (ieee-double-&gt;bytes 2.0)) => (64 0 0 0 0 0 0 0)
-(bytes-&gt;list (ieee-double-&gt;bytes 6.5)) => (64 26 0 0 0 0 0 0)
-(bytes-&gt;list (ieee-double-&gt;bytes -6.5)) => (192 26 0 0 0 0 0 0)
-
-(bytes-&gt;list (ieee-double-&gt;bytes 11.125369292536006e-309))
- => ( 0 8 0 0 0 0 0 0)
-(bytes-&gt;list (ieee-double-&gt;bytes 5.562684646268003e-309))
- => ( 0 4 0 0 0 0 0 0)
-(bytes-&gt;list (ieee-double-&gt;bytes 4.0e-324))
- => ( 0 0 0 0 0 0 0 1)
-
-(bytes-&gt;list (ieee-double-&gt;bytes -1/0)) => (255 240 0 0 0 0 0 0)
-(bytes-&gt;list (ieee-double-&gt;bytes 1/0)) => (127 240 0 0 0 0 0 0)
-(bytes-&gt;list (ieee-double-&gt;bytes 0/0)) => (127 248 0 0 0 0 0 0)
-</pre></td></tr></table><P>
-
-<A NAME="SEC191"></A>
-<H4> Byte Collation Order </H4>
-<!--docid::SEC191::-->
-<P>
-
-The <CODE>string&lt;?</CODE> ordering of big-endian byte-array
-representations of fixed and IEEE floating-point numbers agrees with
-the numerical ordering only when those numbers are non-negative.
-</P>
-<P>
-
-Straighforward modification of these formats can extend the
-byte-collating order to work for their entire ranges. This
-agreement enables the full range of numbers as keys in
-<EM>indexed-sequential-access-method</EM> databases.
-<A NAME="IDX1190"></A>
-</P>
-<P>
-
-<A NAME="IDX1191"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>integer-byte-collate!</B> <I>byte-vector</I>
-<DD><P>
-
-Modifies sign bit of <VAR>byte-vector</VAR> so that <CODE>string&lt;?</CODE> ordering of
-two's-complement byte-vectors matches numerical order. <CODE>integer-byte-collate!</CODE> returns
-<VAR>byte-vector</VAR> and is its own functional inverse.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1192"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>integer-byte-collate</B> <I>byte-vector</I>
-<DD><P>
-
-Returns copy of <VAR>byte-vector</VAR> with sign bit modified so that <CODE>string&lt;?</CODE>
-ordering of two's-complement byte-vectors matches numerical order.
-<CODE>integer-byte-collate</CODE> is its own functional inverse.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1193"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>ieee-byte-collate!</B> <I>byte-vector</I>
-<DD><P>
-
-Modifies <VAR>byte-vector</VAR> so that <CODE>string&lt;?</CODE> ordering of IEEE floating-point
-byte-vectors matches numerical order. <CODE>ieee-byte-collate!</CODE> returns <VAR>byte-vector</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1194"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>ieee-byte-decollate!</B> <I>byte-vector</I>
-<DD><P>
-
-Given <VAR>byte-vector</VAR> modified by <CODE>IEEE-byte-collate!</CODE>, reverses the <VAR>byte-vector</VAR>
-modifications.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1195"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ieee-byte-collate</B> <I>byte-vector</I>
-<DD><P>
-
-Returns copy of <VAR>byte-vector</VAR> encoded so that <CODE>string&lt;?</CODE> ordering of IEEE
-floating-point byte-vectors matches numerical order.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1196"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>ieee-byte-decollate</B> <I>byte-vector</I>
-<DD><P>
-
-Given <VAR>byte-vector</VAR> returned by <CODE>IEEE-byte-collate</CODE>, reverses the <VAR>byte-vector</VAR>
-modifications.
-</P>
-</DL>
-<P>
-
-<A NAME="MAT-File Format"></A>
-<HR SIZE="6">
-<A NAME="SEC192"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC190"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC193"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.7 MAT-File Format </H3>
-<!--docid::SEC192::-->
-<P>
-
-<CODE>(require 'matfile)</CODE>
-<A NAME="IDX1197"></A>
-<A NAME="IDX1198"></A>
-</P>
-<P>
-
-<A HREF="http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/matfile_format.pdf">http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/matfile_format.pdf</A>
-</P>
-<P>
-
-This package reads MAT-File Format version 4 (MATLAB) binary data
-files. MAT-files written from big-endian or little-endian computers
-having IEEE format numbers are currently supported. Support for files
-written from VAX or Cray machines could also be added.
-</P>
-<P>
-
-The numeric and text matrix types handled; support for <EM>sparse</EM>
-<A NAME="IDX1199"></A>
-matrices awaits a sample file.
-</P>
-<P>
-
-<A NAME="IDX1200"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>matfile:read</B> <I>filename</I>
-<DD><VAR>filename</VAR> should be a string naming an existing file containing a
-MATLAB Version 4 MAT-File. The <CODE>matfile:read</CODE> procedure reads matrices from the
-file and returns a list of the results; a list of the name string and
-array for each matrix.
-</DL>
-<P>
-
-<A NAME="IDX1201"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>matfile:load</B> <I>filename</I>
-<DD><VAR>filename</VAR> should be a string naming an existing file containing a
-MATLAB Version 4 MAT-File. The <CODE>matfile:load</CODE> procedure reads matrices from the
-file and defines the <CODE>string-ci-&gt;symbol</CODE> for each matrix to its
-corresponding array. <CODE>matfile:load</CODE> returns a list of the symbols defined.
-</DL>
-<P>
-
-<A NAME="Portable Image Files"></A>
-<HR SIZE="6">
-<A NAME="SEC193"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC192"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC194"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.8 Portable Image Files </H3>
-<!--docid::SEC193::-->
-<P>
-
-<CODE>(require 'pnm)</CODE>
-<A NAME="IDX1202"></A>
-</P>
-<P>
-
-<A NAME="IDX1203"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>pnm:type-dimensions</B> <I>path</I>
-<DD><P>
-
-The string <VAR>path</VAR> must name a <EM>portable bitmap graphics</EM> file.
-<A NAME="IDX1204"></A>
-<CODE>pnm:type-dimensions</CODE> returns a list of 4 items:
-<OL>
-<LI>
-A symbol describing the type of the file named by <VAR>path</VAR>.
-<LI>
-The image width in pixels.
-<LI>
-The image height in pixels.
-<LI>
-The maximum value of pixels assume in the file.
-</OL>
-<P>
-
-The current set of file-type symbols is:
-</P>
-<DL COMPACT>
-<DT>pbm
-<DD><DT>pbm-raw
-<DD><A NAME="IDX1205"></A>
-<A NAME="IDX1206"></A>
-Black-and-White image; pixel values are 0 or 1.
-<DT>pgm
-<DD><DT>pgm-raw
-<DD><A NAME="IDX1207"></A>
-<A NAME="IDX1208"></A>
-Gray (monochrome) image; pixel values are from 0 to <VAR>maxval</VAR>
-specified in file header.
-<DT>ppm
-<DD><DT>ppm-raw
-<DD><A NAME="IDX1209"></A>
-<A NAME="IDX1210"></A>
-RGB (full color) image; red, green, and blue interleaved pixel values
-are from 0 to <VAR>maxval</VAR>
-</DL>
-</DL>
-<P>
-
-<A NAME="IDX1211"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>pnm:image-file-&gt;array</B> <I>path array</I>
-<DD><P>
-
-Reads the <EM>portable bitmap graphics</EM> file named by <VAR>path</VAR> into
-<A NAME="IDX1212"></A>
-<VAR>array</VAR>. <VAR>array</VAR> must be the correct size and type for
-<VAR>path</VAR>. <VAR>array</VAR> is returned.
-</P>
-<P>
-
-<A NAME="IDX1213"></A>
-<DT><U>Function:</U> <B>pnm:image-file-&gt;array</B> <I>path</I>
-<DD></P>
-<P>
-
-<CODE>pnm:image-file-&gt;array</CODE> creates and returns an array with the
-<EM>portable bitmap graphics</EM> file named by <VAR>path</VAR> read into it.
-<A NAME="IDX1214"></A>
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1215"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>pnm:array-write</B> <I>type array maxval path comment <small>...</small></I>
-<DD><P>
-
-Writes the contents of <VAR>array</VAR> to a <VAR>type</VAR> image file named <VAR>path</VAR>. The file
-will have pixel values between 0 and <VAR>maxval</VAR>, which must be compatible
-with <VAR>type</VAR>. For `<SAMP>pbm</SAMP>' files, <VAR>maxval</VAR> must be `<SAMP>1</SAMP>'.
-<VAR>comment</VAR>s are included in the file header.
-</P>
-</DL>
-<P>
-
-<A NAME="Collections"></A>
-<HR SIZE="6">
-<A NAME="SEC194"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC193"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC195"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.9 Collections </H3>
-<!--docid::SEC194::-->
-<P>
-
-<CODE>(require 'collect)</CODE>
-<A NAME="IDX1216"></A>
-</P>
-<P>
-
-Routines for managing collections. Collections are aggregate data
-structures supporting iteration over their elements, similar to the
-Dylan(TM) language, but with a different interface. They have
-<EM>elements</EM> indexed by corresponding <EM>keys</EM>, although the keys
-may be implicit (as with lists).
-</P>
-<P>
-
-New types of collections may be defined as YASOS objects (see section <A HREF="slib_3.html#SEC40">3.8 Yasos</A>).
-They must support the following operations:
-</P>
-<P>
-
-<UL>
-<LI>
-<CODE>(collection? <VAR>self</VAR>)</CODE> (always returns <CODE>#t</CODE>);
-<P>
-
-</P>
-<LI>
-<CODE>(size <VAR>self</VAR>)</CODE> returns the number of elements in the collection;
-<P>
-
-</P>
-<LI>
-<CODE>(print <VAR>self</VAR> <VAR>port</VAR>)</CODE> is a specialized print operation
-for the collection which prints a suitable representation on the given
-<VAR>port</VAR> or returns it as a string if <VAR>port</VAR> is <CODE>#t</CODE>;
-<P>
-
-</P>
-<LI>
-<A NAME="IDX1217"></A>
-<CODE>(gen-elts <VAR>self</VAR>)</CODE> returns a thunk which on successive
-invocations yields elements of <VAR>self</VAR> in order or gives an error if
-it is invoked more than <CODE>(size <VAR>self</VAR>)</CODE> times;
-<P>
-
-</P>
-<LI>
-<A NAME="IDX1218"></A>
-<CODE>(gen-keys <VAR>self</VAR>)</CODE> is like <CODE>gen-elts</CODE>, but yields the
-collection's keys in order.
-</UL>
-<P>
-
-They might support specialized <CODE>for-each-key</CODE> and
-<CODE>for-each-elt</CODE> operations.
-</P>
-<P>
-
-<A NAME="IDX1219"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>collection?</B> <I>obj</I>
-<DD>A predicate, true initially of lists, vectors and strings. New sorts of
-collections must answer <CODE>#t</CODE> to <CODE>collection?</CODE>.
-</DL>
-<P>
-
-<A NAME="IDX1220"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>map-elts</B> <I>proc collection1 <small>...</small></I>
-<DD><A NAME="IDX1221"></A>
-<DT><U>Procedure:</U> <B>do-elts</B> <I>proc collection1 <small>...</small></I>
-<DD><VAR>proc</VAR> is a procedure taking as many arguments as there are
-<VAR>collections</VAR> (at least one). The <VAR>collections</VAR> are iterated
-over in their natural order and <VAR>proc</VAR> is applied to the elements
-yielded by each iteration in turn. The order in which the arguments are
-supplied corresponds to te order in which the <VAR>collections</VAR> appear.
-<CODE>do-elts</CODE> is used when only side-effects of <VAR>proc</VAR> are of
-interest and its return value is unspecified. <CODE>map-elts</CODE> returns a
-collection (actually a vector) of the results of the applications of
-<VAR>proc</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(map-elts + (list 1 2 3) (vector 1 2 3))
- => #(2 4 6)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1222"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>map-keys</B> <I>proc collection1 <small>...</small></I>
-<DD><A NAME="IDX1223"></A>
-<DT><U>Procedure:</U> <B>do-keys</B> <I>proc collection1 <small>...</small></I>
-<DD>These are analogous to <CODE>map-elts</CODE> and <CODE>do-elts</CODE>, but each
-iteration is over the <VAR>collections</VAR>' <EM>keys</EM> rather than their
-elements.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(map-keys + (list 1 2 3) (vector 1 2 3))
- => #(0 2 4)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1224"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>for-each-key</B> <I>collection proc</I>
-<DD><A NAME="IDX1225"></A>
-<DT><U>Procedure:</U> <B>for-each-elt</B> <I>collection proc</I>
-<DD>These are like <CODE>do-keys</CODE> and <CODE>do-elts</CODE> but only for a single
-collection; they are potentially more efficient.
-</DL>
-<P>
-
-<A NAME="IDX1226"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>reduce</B> <I>proc seed collection1 <small>...</small></I>
-<DD>A generalization of the list-based <CODE>reduce-init</CODE>
-(see section <A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A>) to collections which will shadow the
-list-based version if <CODE>(require 'collect)</CODE> follows
-<A NAME="IDX1227"></A>
-<CODE>(require 'common-list-functions)</CODE> (see section <A HREF="slib_7.html#SEC208">7.2.1 Common List Functions</A>).
-<A NAME="IDX1228"></A>
-<P>
-
-Examples:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(reduce + 0 (vector 1 2 3))
- => 6
-(reduce union '() '((a b c) (b c d) (d a)))
- => (c b d a).
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1229"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>any?</B> <I>pred collection1 <small>...</small></I>
-<DD>A generalization of the list-based <CODE>some</CODE> (see section <A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A>) to collections.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(any? odd? (list 2 3 4 5))
- => #t
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1230"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>every?</B> <I>pred collection1 <small>...</small></I>
-<DD>A generalization of the list-based <CODE>every</CODE>
-(see section <A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A>) to collections.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(every? collection? '((1 2) #(1 2)))
- => #t
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1231"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>empty?</B> <I>collection</I>
-<DD>Returns <CODE>#t</CODE> iff there are no elements in <VAR>collection</VAR>.
-<P>
-
-<CODE>(empty? <VAR>collection</VAR>) == (zero? (size <VAR>collection</VAR>))</CODE>
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1232"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>size</B> <I>collection</I>
-<DD>Returns the number of elements in <VAR>collection</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1233"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>Setter</B> <I>list-ref</I>
-<DD>See <A HREF="slib_3.html#SEC43">3.8.3 Setters</A> for a definition of <EM>setter</EM>. N.B.
-<CODE>(setter list-ref)</CODE> doesn't work properly for element 0 of a
-list.
-</DL>
-<P>
-
-Here is a sample collection: <CODE>simple-table</CODE> which is also a
-<CODE>table</CODE>.
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-predicate TABLE?)
-(define-operation (LOOKUP table key failure-object))
-(define-operation (ASSOCIATE! table key value)) ;; returns key
-(define-operation (REMOVE! table key)) ;; returns value
-
-(define (MAKE-SIMPLE-TABLE)
- (let ( (table (list)) )
- (object
- ;; table behaviors
- ((TABLE? self) #t)
- ((SIZE self) (size table))
- ((PRINT self port) (format port &quot;#&lt;SIMPLE-TABLE&gt;&quot;))
- ((LOOKUP self key failure-object)
- (cond
- ((assq key table) =&gt; cdr)
- (else failure-object)
- ))
- ((ASSOCIATE! self key value)
- (cond
- ((assq key table)
- =&gt; (lambda (bucket) (set-cdr! bucket value) key))
- (else
- (set! table (cons (cons key value) table))
- key)
- ))
- ((REMOVE! self key);; returns old value
- (cond
- ((null? table) (slib:error &quot;TABLE:REMOVE! Key not found: &quot; key))
- ((eq? key (caar table))
- (let ( (value (cdar table)) )
- (set! table (cdr table))
- value)
- )
- (else
- (let loop ( (last table) (this (cdr table)) )
- (cond
- ((null? this)
- (slib:error &quot;TABLE:REMOVE! Key not found: &quot; key))
- ((eq? key (caar this))
- (let ( (value (cdar this)) )
- (set-cdr! last (cdr this))
- value)
- )
- (else
- (loop (cdr last) (cdr this)))
- ) ) )
- ))
- ;; collection behaviors
- ((COLLECTION? self) #t)
- ((GEN-KEYS self) (collect:list-gen-elts (map car table)))
- ((GEN-ELTS self) (collect:list-gen-elts (map cdr table)))
- ((FOR-EACH-KEY self proc)
- (for-each (lambda (bucket) (proc (car bucket))) table)
- )
- ((FOR-EACH-ELT self proc)
- (for-each (lambda (bucket) (proc (cdr bucket))) table)
- ) ) ) )
-</pre></td></tr></table><P>
-
-<A NAME="Dynamic Data Type"></A>
-<HR SIZE="6">
-<A NAME="SEC195"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC194"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC196"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.10 Dynamic Data Type </H3>
-<!--docid::SEC195::-->
-<P>
-
-<CODE>(require 'dynamic)</CODE>
-<A NAME="IDX1234"></A>
-</P>
-<P>
-
-<A NAME="IDX1235"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-dynamic</B> <I>obj</I>
-<DD>Create and returns a new <EM>dynamic</EM> whose global value is <VAR>obj</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1236"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>dynamic?</B> <I>obj</I>
-<DD>Returns true if and only if <VAR>obj</VAR> is a dynamic. No object
-satisfying <CODE>dynamic?</CODE> satisfies any of the other standard type
-predicates.
-</DL>
-<P>
-
-<A NAME="IDX1237"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>dynamic-ref</B> <I>dyn</I>
-<DD>Return the value of the given dynamic in the current dynamic
-environment.
-</DL>
-<P>
-
-<A NAME="IDX1238"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>dynamic-set!</B> <I>dyn obj</I>
-<DD>Change the value of the given dynamic to <VAR>obj</VAR> in the current
-dynamic environment. The returned value is unspecified.
-</DL>
-<P>
-
-<A NAME="IDX1239"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>call-with-dynamic-binding</B> <I>dyn obj thunk</I>
-<DD>Invoke and return the value of the given thunk in a new, nested dynamic
-environment in which the given dynamic has been bound to a new location
-whose initial contents are the value <VAR>obj</VAR>. This dynamic
-environment has precisely the same extent as the invocation of the thunk
-and is thus captured by continuations created within that invocation and
-re-established by those continuations when they are invoked.
-</DL>
-<P>
-
-The <CODE>dynamic-bind</CODE> macro is not implemented.
-</P>
-<P>
-
-<A NAME="Hash Tables"></A>
-<HR SIZE="6">
-<A NAME="SEC196"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC195"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC197"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.11 Hash Tables </H3>
-<!--docid::SEC196::-->
-<P>
-
-<CODE>(require 'hash-table)</CODE>
-<A NAME="IDX1240"></A>
-</P>
-<P>
-
-<A NAME="IDX1241"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>predicate-&gt;hash</B> <I>pred</I>
-<DD><P>
-
-Returns a hash function (like <CODE>hashq</CODE>, <CODE>hashv</CODE>, or
-<CODE>hash</CODE>) corresponding to the equality predicate <VAR>pred</VAR>.
-<VAR>pred</VAR> should be <CODE>eq?</CODE>, <CODE>eqv?</CODE>, <CODE>equal?</CODE>, <CODE>=</CODE>,
-<CODE>char=?</CODE>, <CODE>char-ci=?</CODE>, <CODE>string=?</CODE>, or
-<CODE>string-ci=?</CODE>.
-</P>
-</DL>
-A hash table is a vector of association lists.
-<P>
-
-<A NAME="IDX1242"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-hash-table</B> <I>k</I>
-<DD><P>
-
-Returns a vector of <VAR>k</VAR> empty (association) lists.
-</P>
-</DL>
-Hash table functions provide utilities for an associative database.
-These functions take an equality predicate, <VAR>pred</VAR>, as an argument.
-<VAR>pred</VAR> should be <CODE>eq?</CODE>, <CODE>eqv?</CODE>, <CODE>equal?</CODE>, <CODE>=</CODE>,
-<CODE>char=?</CODE>, <CODE>char-ci=?</CODE>, <CODE>string=?</CODE>, or
-<CODE>string-ci=?</CODE>.
-<P>
-
-<A NAME="IDX1243"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>predicate-&gt;hash-asso</B> <I>pred</I>
-<DD><P>
-
-Returns a hash association function of 2 arguments, <VAR>key</VAR> and
-<VAR>hashtab</VAR>, corresponding to <VAR>pred</VAR>. The returned function
-returns a key-value pair whose key is <VAR>pred</VAR>-equal to its first
-argument or <CODE>#f</CODE> if no key in <VAR>hashtab</VAR> is <VAR>pred</VAR>-equal to
-the first argument.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1244"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>hash-inquirer</B> <I>pred</I>
-<DD><P>
-
-Returns a procedure of 2 arguments, <VAR>hashtab</VAR> and <VAR>key</VAR>, which
-returns the value associated with <VAR>key</VAR> in <VAR>hashtab</VAR> or
-<CODE>#f</CODE> if <VAR>key</VAR> does not appear in <VAR>hashtab</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1245"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>hash-associator</B> <I>pred</I>
-<DD><P>
-
-Returns a procedure of 3 arguments, <VAR>hashtab</VAR>, <VAR>key</VAR>, and
-<VAR>value</VAR>, which modifies <VAR>hashtab</VAR> so that <VAR>key</VAR> and
-<VAR>value</VAR> associated. Any previous value associated with <VAR>key</VAR>
-will be lost.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1246"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>hash-remover</B> <I>pred</I>
-<DD><P>
-
-Returns a procedure of 2 arguments, <VAR>hashtab</VAR> and <VAR>key</VAR>, which
-modifies <VAR>hashtab</VAR> so that the association whose key is <VAR>key</VAR> is
-removed.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1247"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>hash-map</B> <I>proc hash-table</I>
-<DD><P>
-
-Returns a new hash table formed by mapping <VAR>proc</VAR> over the
-keys and values of <VAR>hash-table</VAR>. <VAR>proc</VAR> must be a function of 2
-arguments which returns the new value part.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1248"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>hash-for-each</B> <I>proc hash-table</I>
-<DD><P>
-
-Applies <VAR>proc</VAR> to each pair of keys and values of <VAR>hash-table</VAR>.
-<VAR>proc</VAR> must be a function of 2 arguments. The returned value is
-unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1249"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>hash-rehasher</B> <I>pred</I>
-<DD><P>
-
-<CODE>hash-rehasher</CODE> accepts a hash table predicate and returns a function of two
-arguments <VAR>hashtab</VAR> and <VAR>new-k</VAR> which is specialized for
-that predicate.
-</P>
-<P>
-
-This function is used for nondestrutively resizing a hash table.
-<VAR>hashtab</VAR> should be an existing hash-table using <VAR>pred</VAR>, <VAR>new-k</VAR>
-is the size of a new hash table to be returned. The new hash table
-will have all of the associations of the old hash table.
-</P>
-</DL>
-<P>
-
-<A NAME="Object"></A>
-<HR SIZE="6">
-<A NAME="SEC197"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC196"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC198"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.12 Macroless Object System </H3>
-<!--docid::SEC197::-->
-<P>
-
-<CODE>(require 'object)</CODE>
-<A NAME="IDX1250"></A>
-</P>
-<P>
-
-This is the Macroless Object System written by Wade Humeniuk
-(whumeniu@datap.ca). Conceptual Tributes: <A HREF="slib_3.html#SEC40">3.8 Yasos</A>, MacScheme's
-%object, CLOS, Lack of R4RS macros.
-</P>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC198"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC197"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC199"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.13 Concepts </H3>
-<!--docid::SEC198::-->
-<DL COMPACT>
-
-<DT>OBJECT
-<DD>An object is an ordered association-list (by <CODE>eq?</CODE>) of methods
-(procedures). Methods can be added (<CODE>make-method!</CODE>), deleted
-(<CODE>unmake-method!</CODE>) and retrieved (<CODE>get-method</CODE>). Objects may
-inherit methods from other objects. The object binds to the environment
-it was created in, allowing closures to be used to hide private
-procedures and data.
-<P>
-
-</P>
-<DT>GENERIC-METHOD
-<DD>A generic-method associates (in terms of <CODE>eq?</CODE>) object's method.
-This allows scheme function style to be used for objects. The calling
-scheme for using a generic method is <CODE>(generic-method object param1
-param2 ...)</CODE>.
-<P>
-
-</P>
-<DT>METHOD
-<DD>A method is a procedure that exists in the object. To use a method
-get-method must be called to look-up the method. Generic methods
-implement the get-method functionality. Methods may be added to an
-object associated with any scheme obj in terms of eq?
-<P>
-
-</P>
-<DT>GENERIC-PREDICATE
-<DD>A generic method that returns a boolean value for any scheme obj.
-<P>
-
-</P>
-<DT>PREDICATE
-<DD>A object's method asscociated with a generic-predicate. Returns
-<CODE>#t</CODE>.
-</DL>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC199"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC198"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC200"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.14 Procedures </H3>
-<!--docid::SEC199::-->
-<P>
-
-<A NAME="IDX1251"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-object</B> <I>ancestor <small>...</small></I>
-<DD>Returns an object. Current object implementation is a tagged vector.
-<VAR>ancestor</VAR>s are optional and must be objects in terms of object?.
-<VAR>ancestor</VAR>s methods are included in the object. Multiple
-<VAR>ancestor</VAR>s might associate the same generic-method with a method.
-In this case the method of the <VAR>ancestor</VAR> first appearing in the
-list is the one returned by <CODE>get-method</CODE>.
-</DL>
-<P>
-
-<A NAME="IDX1252"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>object?</B> <I>obj</I>
-<DD>Returns boolean value whether <VAR>obj</VAR> was created by make-object.
-</DL>
-<P>
-
-<A NAME="IDX1253"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-generic-method</B> <I>exception-procedure</I>
-<DD>Returns a procedure which be associated with an object's methods. If
-<VAR>exception-procedure</VAR> is specified then it is used to process
-non-objects.
-</DL>
-<P>
-
-<A NAME="IDX1254"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-generic-predicate</B>
-<DD>Returns a boolean procedure for any scheme object.
-</DL>
-<P>
-
-<A NAME="IDX1255"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-method!</B> <I>object generic-method method</I>
-<DD>Associates <VAR>method</VAR> to the <VAR>generic-method</VAR> in the object. The
-<VAR>method</VAR> overrides any previous association with the
-<VAR>generic-method</VAR> within the object. Using <CODE>unmake-method!</CODE>
-will restore the object's previous association with the
-<VAR>generic-method</VAR>. <VAR>method</VAR> must be a procedure.
-</DL>
-<P>
-
-<A NAME="IDX1256"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-predicate!</B> <I>object generic-preciate</I>
-<DD>Makes a predicate method associated with the <VAR>generic-predicate</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1257"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>unmake-method!</B> <I>object generic-method</I>
-<DD>Removes an object's association with a <VAR>generic-method</VAR> .
-</DL>
-<P>
-
-<A NAME="IDX1258"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>get-method</B> <I>object generic-method</I>
-<DD>Returns the object's method associated (if any) with the
-<VAR>generic-method</VAR>. If no associated method exists an error is
-flagged.
-</DL>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC200"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC199"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC201"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.15 Examples </H3>
-<!--docid::SEC200::-->
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'object)
-<A NAME="IDX1259"></A>
-(define instantiate (make-generic-method))
-
-(define (make-instance-object . ancestors)
- (define self (apply make-object
- (map (lambda (obj) (instantiate obj)) ancestors)))
- (make-method! self instantiate (lambda (self) self))
- self)
-
-(define who (make-generic-method))
-(define imigrate! (make-generic-method))
-(define emigrate! (make-generic-method))
-(define describe (make-generic-method))
-(define name (make-generic-method))
-(define address (make-generic-method))
-(define members (make-generic-method))
-
-(define society
- (let ()
- (define self (make-instance-object))
- (define population '())
- (make-method! self imigrate!
- (lambda (new-person)
- (if (not (eq? new-person self))
- (set! population (cons new-person population)))))
- (make-method! self emigrate!
- (lambda (person)
- (if (not (eq? person self))
- (set! population
- (comlist:remove-if (lambda (member)
- (eq? member person))
- population)))))
- (make-method! self describe
- (lambda (self)
- (map (lambda (person) (describe person)) population)))
- (make-method! self who
- (lambda (self) (map (lambda (person) (name person))
- population)))
- (make-method! self members (lambda (self) population))
- self))
-
-(define (make-person %name %address)
- (define self (make-instance-object society))
- (make-method! self name (lambda (self) %name))
- (make-method! self address (lambda (self) %address))
- (make-method! self who (lambda (self) (name self)))
- (make-method! self instantiate
- (lambda (self)
- (make-person (string-append (name self) &quot;-son-of&quot;)
- %address)))
- (make-method! self describe
- (lambda (self) (list (name self) (address self))))
- (imigrate! self)
- self)
-</pre></td></tr></table><P>
-
-<HR SIZE="6">
-<A NAME="SEC201"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC200"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC202"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.1.15.1 Inverter Documentation </H4>
-<!--docid::SEC201::-->
-Inheritance:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre> &lt;inverter&gt;::(&lt;number&gt; &lt;description&gt;)
-</pre></td></tr></table>Generic-methods
-<TABLE><tr><td>&nbsp;</td><td class=example><pre> &lt;inverter&gt;::value => &lt;number&gt;::value
- &lt;inverter&gt;::set-value! => &lt;number&gt;::set-value!
- &lt;inverter&gt;::describe => &lt;description&gt;::describe
- &lt;inverter&gt;::help
- &lt;inverter&gt;::invert
- &lt;inverter&gt;::inverter?
-</pre></td></tr></table><P>
-
-<HR SIZE="6">
-<A NAME="SEC202"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC201"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC203"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.1.15.2 Number Documention </H4>
-<!--docid::SEC202::-->
-Inheritance
-<TABLE><tr><td>&nbsp;</td><td class=example><pre> &lt;number&gt;::()
-</pre></td></tr></table>Slots
-<TABLE><tr><td>&nbsp;</td><td class=example><pre> &lt;number&gt;::&lt;x&gt;
-</pre></td></tr></table>Generic Methods
-<TABLE><tr><td>&nbsp;</td><td class=example><pre> &lt;number&gt;::value
- &lt;number&gt;::set-value!
-</pre></td></tr></table><P>
-
-<HR SIZE="6">
-<A NAME="SEC203"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC202"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC204"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.1.15.3 Inverter code </H4>
-<!--docid::SEC203::-->
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'object)
-<A NAME="IDX1260"></A>
-(define value (make-generic-method (lambda (val) val)))
-(define set-value! (make-generic-method))
-(define invert (make-generic-method
- (lambda (val)
- (if (number? val)
- (/ 1 val)
- (error &quot;Method not supported:&quot; val)))))
-(define noop (make-generic-method))
-(define inverter? (make-generic-predicate))
-(define describe (make-generic-method))
-(define help (make-generic-method))
-
-(define (make-number x)
- (define self (make-object))
- (make-method! self value (lambda (this) x))
- (make-method! self set-value!
- (lambda (this new-value) (set! x new-value)))
- self)
-
-(define (make-description str)
- (define self (make-object))
- (make-method! self describe (lambda (this) str))
- (make-method! self help (lambda (this) &quot;Help not available&quot;))
- self)
-
-(define (make-inverter)
- (let* ((self (make-object
- (make-number 1)
- (make-description &quot;A number which can be inverted&quot;)))
- (&lt;value&gt; (get-method self value)))
- (make-method! self invert (lambda (self) (/ 1 (&lt;value&gt; self))))
- (make-predicate! self inverter?)
- (unmake-method! self help)
- (make-method! self help
- (lambda (self)
- (display &quot;Inverter Methods:&quot;) (newline)
- (display &quot; (value inverter) ==&gt; n&quot;) (newline)))
- self))
-
-;;;; Try it out
-
-(define invert! (make-generic-method))
-
-(define x (make-inverter))
-
-(make-method! x invert! (lambda (x) (set-value! x (/ 1 (value x)))))
-
-(value x) => 1
-(set-value! x 33) => undefined
-(invert! x) => undefined
-(value x) => 1/33
-
-(unmake-method! x invert!) => undefined
-
-(invert! x) error--> ERROR: Method not supported: x
-</pre></td></tr></table><P>
-
-<A NAME="Priority Queues"></A>
-<HR SIZE="6">
-<A NAME="SEC204"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC203"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC205"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.16 Priority Queues </H3>
-<!--docid::SEC204::-->
-<P>
-
-<CODE>(require 'priority-queue)</CODE>
-<A NAME="IDX1261"></A>
-</P>
-<P>
-
-This algorithm for priority queues is due to
-<CITE>Introduction to Algorithms</CITE>
-by T. Cormen, C. Leiserson, R. Rivest.
-1989 MIT Press.
-</P>
-<P>
-
-<A NAME="IDX1262"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-heap</B> <I>pred&lt;?</I>
-<DD><P>
-
-Returns a binary heap suitable which can be used for priority queue
-operations.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1263"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>heap-length</B> <I>heap</I>
-<DD><P>
-
-Returns the number of elements in <VAR>heap</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1264"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>heap-insert!</B> <I>heap item</I>
-<DD><P>
-
-Inserts <VAR>item</VAR> into <VAR>heap</VAR>. <VAR>item</VAR> can be inserted multiple
-times. The value returned is unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1265"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>heap-extract-max!</B> <I>heap</I>
-<DD><P>
-
-Returns the item which is larger than all others according to the
-<VAR>pred&lt;?</VAR> argument to <CODE>make-heap</CODE>. If there are no items in
-<VAR>heap</VAR>, an error is signaled.
-</P>
-</DL>
-<P>
-
-<A NAME="Queues"></A>
-<HR SIZE="6">
-<A NAME="SEC205"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC204"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC206"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.17 Queues </H3>
-<!--docid::SEC205::-->
-<P>
-
-<CODE>(require 'queue)</CODE>
-<A NAME="IDX1266"></A>
-</P>
-<P>
-
-A <EM>queue</EM> is a list where elements can be added to both the front
-<A NAME="IDX1267"></A>
-and rear, and removed from the front (i.e., they are what are often
-called <EM>dequeues</EM>). A queue may also be used like a stack.
-<A NAME="IDX1268"></A>
-</P>
-<P>
-
-<A NAME="IDX1269"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-queue</B>
-<DD><P>
-
-Returns a new, empty queue.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1270"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>queue?</B> <I>obj</I>
-<DD><P>
-
-Returns <CODE>#t</CODE> if <VAR>obj</VAR> is a queue.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1271"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>queue-empty?</B> <I>q</I>
-<DD><P>
-
-Returns <CODE>#t</CODE> if the queue <VAR>q</VAR> is empty.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1272"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>queue-push!</B> <I>q datum</I>
-<DD><P>
-
-Adds <VAR>datum</VAR> to the front of queue <VAR>q</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1273"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>enqueue!</B> <I>q datum</I>
-<DD><P>
-
-Adds <VAR>datum</VAR> to the rear of queue <VAR>q</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1274"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>dequeue!</B> <I>q</I>
-<DD><P>
-
-<A NAME="IDX1275"></A>
-<DT><U>Procedure:</U> <B>queue-pop!</B> <I>q</I>
-<DD>Both of these procedures remove and return the datum at the front of
-the queue. <CODE>queue-pop!</CODE> is used to suggest that the queue is
-being used like a stack.
-</P>
-</DL>
-All of the following functions raise an error if the queue <VAR>q</VAR>
-is empty.
-<P>
-
-<A NAME="IDX1276"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>dequeue-all!</B> <I>q</I>
-<DD><P>
-
-Removes and returns (the list) of all contents of queue <VAR>q</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1277"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>queue-front</B> <I>q</I>
-<DD><P>
-
-Returns the datum at the front of the queue <VAR>q</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1278"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>queue-rear</B> <I>q</I>
-<DD><P>
-
-Returns the datum at the rear of the queue <VAR>q</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="Records"></A>
-<HR SIZE="6">
-<A NAME="SEC206"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC205"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.1.18 Records </H3>
-<!--docid::SEC206::-->
-<P>
-
-<CODE>(require 'record)</CODE>
-<A NAME="IDX1279"></A>
-</P>
-<P>
-
-The Record package provides a facility for user to define their own
-record data types.
-</P>
-<P>
-
-<A NAME="IDX1280"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-record-type</B> <I>type-name field-names</I>
-<DD>Returns a <EM>record-type descriptor</EM>, a value representing a new data
-type disjoint from all others. The <VAR>type-name</VAR> argument must be a
-string, but is only used for debugging purposes (such as the printed
-representation of a record of the new type). The <VAR>field-names</VAR>
-argument is a list of symbols naming the <EM>fields</EM> of a record of the
-new type. It is an error if the list contains any duplicates. It is
-unspecified how record-type descriptors are represented.
-</DL>
-<P>
-
-<A NAME="IDX1281"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>record-constructor</B> <I>rtd [field-names]</I>
-<DD>Returns a procedure for constructing new members of the type represented
-by <VAR>rtd</VAR>. The returned procedure accepts exactly as many arguments
-as there are symbols in the given list, <VAR>field-names</VAR>; these are
-used, in order, as the initial values of those fields in a new record,
-which is returned by the constructor procedure. The values of any
-fields not named in that list are unspecified. The <VAR>field-names</VAR>
-argument defaults to the list of field names in the call to
-<CODE>make-record-type</CODE> that created the type represented by <VAR>rtd</VAR>;
-if the <VAR>field-names</VAR> argument is provided, it is an error if it
-contains any duplicates or any symbols not in the default list.
-</DL>
-<P>
-
-<A NAME="IDX1282"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>record-predicate</B> <I>rtd</I>
-<DD>Returns a procedure for testing membership in the type represented by
-<VAR>rtd</VAR>. The returned procedure accepts exactly one argument and
-returns a true value if the argument is a member of the indicated record
-type; it returns a false value otherwise.
-</DL>
-<P>
-
-<A NAME="IDX1283"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>record-accessor</B> <I>rtd field-name</I>
-<DD>Returns a procedure for reading the value of a particular field of a
-member of the type represented by <VAR>rtd</VAR>. The returned procedure
-accepts exactly one argument which must be a record of the appropriate
-type; it returns the current value of the field named by the symbol
-<VAR>field-name</VAR> in that record. The symbol <VAR>field-name</VAR> must be a
-member of the list of field-names in the call to <CODE>make-record-type</CODE>
-that created the type represented by <VAR>rtd</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1284"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>record-modifier</B> <I>rtd field-name</I>
-<DD>Returns a procedure for writing the value of a particular field of a
-member of the type represented by <VAR>rtd</VAR>. The returned procedure
-accepts exactly two arguments: first, a record of the appropriate type,
-and second, an arbitrary Scheme value; it modifies the field named by
-the symbol <VAR>field-name</VAR> in that record to contain the given value.
-The returned value of the modifier procedure is unspecified. The symbol
-<VAR>field-name</VAR> must be a member of the list of field-names in the call
-to <CODE>make-record-type</CODE> that created the type represented by
-<VAR>rtd</VAR>.
-</DL>
-<P>
-
-In May of 1996, as a product of discussion on the <CODE>rrrs-authors</CODE>
-mailing list, I rewrote `<TT>record.scm</TT>' to portably implement type
-disjointness for record data types.
-</P>
-<P>
-
-As long as an implementation's procedures are opaque and the
-<CODE>record</CODE> code is loaded before other programs, this will give
-disjoint record types which are unforgeable and incorruptible by R4RS
-procedures.
-</P>
-<P>
-
-As a consequence, the procedures <CODE>record?</CODE>,
-<CODE>record-type-descriptor</CODE>, <CODE>record-type-name</CODE>.and
-<CODE>record-type-field-names</CODE> are no longer supported.
-</P>
-<P>
-
-<A NAME="Sorting and Searching"></A>
-<HR SIZE="6">
-<A NAME="SEC207"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC206"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 7.2 Sorting and Searching </H2>
-<!--docid::SEC207::-->
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC208">7.2.1 Common List Functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'common-list-functions</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'tree</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'chapter-order</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'sort</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Keep your socks on.</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'hash</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC219">7.2.7 Space-Filling Curves</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'hilbert and 'sierpinski</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC222">7.2.8 Soundex</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Dimension Reduction of Last Names</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Also Search from a Port.</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'diff and longest-common-subsequence</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Common List Functions"></A>
-<HR SIZE="6">
-<A NAME="SEC208"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC209"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.1 Common List Functions </H3>
-<!--docid::SEC208::-->
-<P>
-
-<CODE>(require 'common-list-functions)</CODE>
-<A NAME="IDX1285"></A>
-</P>
-<P>
-
-The procedures below follow the Common LISP equivalents apart from
-optional arguments in some cases.
-</P>
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-</TABLE>
-<P>
-
-<A NAME="List construction"></A>
-<HR SIZE="6">
-<A NAME="SEC209"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC210"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.2.1.1 List construction </H4>
-<!--docid::SEC209::-->
-<P>
-
-<A NAME="IDX1286"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-list</B> <I>k</I>
-<DD><A NAME="IDX1287"></A>
-<DT><U>Function:</U> <B>make-list</B> <I>k init</I>
-<DD><CODE>make-list</CODE> creates and returns a list of <VAR>k</VAR> elements. If
-<VAR>init</VAR> is included, all elements in the list are initialized to
-<VAR>init</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(make-list 3)
- => (#&lt;unspecified&gt; #&lt;unspecified&gt; #&lt;unspecified&gt;)
-(make-list 5 'foo)
- => (foo foo foo foo foo)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1288"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list*</B> <I>obj1 obj2 <small>...</small></I>
-<DD>Works like <CODE>list</CODE> except that the cdr of the last pair is the last
-argument unless there is only one argument, when the result is just that
-argument. Sometimes called <CODE>cons*</CODE>. E.g.:
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(list* 1)
- => 1
-(list* 1 2 3)
- => (1 2 . 3)
-(list* 1 2 '(3 4))
- => (1 2 3 4)
-(list* <VAR>args</VAR> '())
- == (list <VAR>args</VAR>)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1289"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>copy-list</B> <I>lst</I>
-<DD><CODE>copy-list</CODE> makes a copy of <VAR>lst</VAR> using new pairs and returns
-it. Only the top level of the list is copied, i.e., pairs forming
-elements of the copied list remain <CODE>eq?</CODE> to the corresponding
-elements of the original; the copy is, however, not <CODE>eq?</CODE> to the
-original, but is <CODE>equal?</CODE> to it.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(copy-list '(foo foo foo))
- => (foo foo foo)
-(define q '(foo bar baz bang))
-(define p q)
-(eq? p q)
- => #t
-(define r (copy-list q))
-(eq? q r)
- => #f
-(equal? q r)
- => #t
-(define bar '(bar))
-(eq? bar (car (copy-list (list bar 'foo))))
-=> #t
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Lists as sets"></A>
-<HR SIZE="6">
-<A NAME="SEC210"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC209"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC211"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.2.1.2 Lists as sets </H4>
-<!--docid::SEC210::-->
-<P>
-
-<CODE>eqv?</CODE> is used to test for membership by procedures which treat
-lists as sets.
-</P>
-<P>
-
-<A NAME="IDX1290"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>adjoin</B> <I>e l</I>
-<DD><CODE>adjoin</CODE> returns the adjoint of the element <VAR>e</VAR> and the list
-<VAR>l</VAR>. That is, if <VAR>e</VAR> is in <VAR>l</VAR>, <CODE>adjoin</CODE> returns
-<VAR>l</VAR>, otherwise, it returns <CODE>(cons <VAR>e</VAR> <VAR>l</VAR>)</CODE>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(adjoin 'baz '(bar baz bang))
- => (bar baz bang)
-(adjoin 'foo '(bar baz bang))
- => (foo bar baz bang)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1291"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>union</B> <I>l1 l2</I>
-<DD><CODE>union</CODE> returns a list of all elements that are in <VAR>l1</VAR> or
-<VAR>l2</VAR>. Duplicates between <VAR>l1</VAR> and <VAR>l2</VAR> are culled.
-Duplicates within <VAR>l1</VAR> or within <VAR>l2</VAR> may or may not be
-removed.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(union '(1 2 3 4) '(5 6 7 8))
- => (1 2 3 4 5 6 7 8)
-(union '(0 1 2 3 4) '(3 4 5 6))
- => (5 6 0 1 2 3 4)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1292"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>intersection</B> <I>l1 l2</I>
-<DD><CODE>intersection</CODE> returns a list of all elements that are in both
-<VAR>l1</VAR> and <VAR>l2</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(intersection '(1 2 3 4) '(3 4 5 6))
- => (3 4)
-(intersection '(1 2 3 4) '(5 6 7 8))
- => ()
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1293"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>set-difference</B> <I>l1 l2</I>
-<DD><CODE>set-difference</CODE> returns a list of all elements that are in
-<VAR>l1</VAR> but not in <VAR>l2</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set-difference '(1 2 3 4) '(3 4 5 6))
- => (1 2)
-(set-difference '(1 2 3 4) '(1 2 3 4 5 6))
- => ()
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1294"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>subset?</B> <I>list1 list2</I>
-<DD>Returns <CODE>#t</CODE> if every element of <VAR>list1</VAR> is <CODE>eqv?</CODE> an
-element of <VAR>list2</VAR>; otherwise returns <CODE>#f</CODE>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(subset? '(1 2 3 4) '(3 4 5 6))
- => #f
-(subset? '(1 2 3 4) '(6 5 4 3 2 1 0))
- => #t
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1295"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>member-if</B> <I>pred lst</I>
-<DD><CODE>member-if</CODE> returns the list headed by the first element of
-<VAR>lst</VAR> to satisfy <CODE>(<VAR>pred</VAR> <VAR>element</VAR>)</CODE>.
-<CODE>Member-if</CODE> returns <CODE>#f</CODE> if <VAR>pred</VAR> returns <CODE>#f</CODE> for
-every <VAR>element</VAR> in <VAR>lst</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(member-if vector? '(a 2 b 4))
- => #f
-(member-if number? '(a 2 b 4))
- => (2 b 4)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1296"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>some</B> <I>pred lst1 lst2 <small>...</small></I>
-<DD><VAR>pred</VAR> is a boolean function of as many arguments as there are list
-arguments to <CODE>some</CODE> i.e., <VAR>lst</VAR> plus any optional arguments.
-<VAR>pred</VAR> is applied to successive elements of the list arguments in
-order. <CODE>some</CODE> returns <CODE>#t</CODE> as soon as one of these
-applications returns <CODE>#t</CODE>, and is <CODE>#f</CODE> if none returns
-<CODE>#t</CODE>. All the lists should have the same length.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(some odd? '(1 2 3 4))
- => #t
-
-(some odd? '(2 4 6 8))
- => #f
-
-(some &gt; '(1 3) '(2 4))
- => #f
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1297"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>every</B> <I>pred lst1 lst2 <small>...</small></I>
-<DD><CODE>every</CODE> is analogous to <CODE>some</CODE> except it returns <CODE>#t</CODE> if
-every application of <VAR>pred</VAR> is <CODE>#t</CODE> and <CODE>#f</CODE>
-otherwise.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(every even? '(1 2 3 4))
- => #f
-
-(every even? '(2 4 6 8))
- => #t
-
-(every &gt; '(2 3) '(1 4))
- => #f
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1298"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>notany</B> <I>pred lst1 <small>...</small></I>
-<DD><CODE>notany</CODE> is analogous to <CODE>some</CODE> but returns <CODE>#t</CODE> if no
-application of <VAR>pred</VAR> returns <CODE>#t</CODE> or <CODE>#f</CODE> as soon as any
-one does.
-</DL>
-<P>
-
-<A NAME="IDX1299"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>notevery</B> <I>pred lst1 <small>...</small></I>
-<DD><CODE>notevery</CODE> is analogous to <CODE>some</CODE> but returns <CODE>#t</CODE> as soon
-as an application of <VAR>pred</VAR> returns <CODE>#f</CODE>, and <CODE>#f</CODE>
-otherwise.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(notevery even? '(1 2 3 4))
- => #t
-
-(notevery even? '(2 4 6 8))
- => #f
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1300"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list-of??</B> <I>predicate</I>
-<DD>Returns a predicate which returns true if its argument is a list every
-element of which satisfies <VAR>predicate</VAR>.
-<P>
-
-<A NAME="IDX1301"></A>
-<DT><U>Function:</U> <B>list-of??</B> <I>predicate low-bound high-bound</I>
-<DD><VAR>low-bound</VAR> and <VAR>high-bound</VAR> are non-negative integers.
-<CODE>list-of??</CODE> returns a predicate which returns true if its argument
-is a list of length between <VAR>low-bound</VAR> and <VAR>high-bound</VAR>
-(inclusive); every element of which satisfies <VAR>predicate</VAR>.
-</P>
-<P>
-
-<A NAME="IDX1302"></A>
-<DT><U>Function:</U> <B>list-of??</B> <I>predicate bound</I>
-<DD><VAR>bound</VAR> is an integer. If <VAR>bound</VAR> is negative, <CODE>list-of??</CODE>
-returns a predicate which returns true if its argument is a list of
-length greater than <CODE>(- <VAR>bound</VAR>)</CODE>; every element of which
-satisfies <VAR>predicate</VAR>. Otherwise, <CODE>list-of??</CODE> returns a
-predicate which returns true if its argument is a list of length less
-than or equal to <VAR>bound</VAR>; every element of which satisfies
-<VAR>predicate</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1303"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>find-if</B> <I>pred lst</I>
-<DD><CODE>find-if</CODE> searches for the first <VAR>element</VAR> in <VAR>lst</VAR> such
-that <CODE>(<VAR>pred</VAR> <VAR>element</VAR>)</CODE> returns <CODE>#t</CODE>. If it finds
-any such <VAR>element</VAR> in <VAR>lst</VAR>, <VAR>element</VAR> is returned.
-Otherwise, <CODE>#f</CODE> is returned.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(find-if number? '(foo 1 bar 2))
- => 1
-
-(find-if number? '(foo bar baz bang))
- => #f
-
-(find-if symbol? '(1 2 foo bar))
- => foo
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1304"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>remove</B> <I>elt lst</I>
-<DD><CODE>remove</CODE> removes all occurrences of <VAR>elt</VAR> from <VAR>lst</VAR> using
-<CODE>eqv?</CODE> to test for equality and returns everything that's left.
-N.B.: other implementations (Chez, Scheme-&gt;C and T, at least) use
-<CODE>equal?</CODE> as the equality test.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(remove 1 '(1 2 1 3 1 4 1 5))
- => (2 3 4 5)
-
-(remove 'foo '(bar baz bang))
- => (bar baz bang)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1305"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>remove-if</B> <I>pred lst</I>
-<DD><CODE>remove-if</CODE> removes all <VAR>element</VAR>s from <VAR>lst</VAR> where
-<CODE>(<VAR>pred</VAR> <VAR>element</VAR>)</CODE> is <CODE>#t</CODE> and returns everything
-that's left.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(remove-if number? '(1 2 3 4))
- => ()
-
-(remove-if even? '(1 2 3 4 5 6 7 8))
- => (1 3 5 7)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1306"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>remove-if-not</B> <I>pred lst</I>
-<DD><CODE>remove-if-not</CODE> removes all <VAR>element</VAR>s from <VAR>lst</VAR> for which
-<CODE>(<VAR>pred</VAR> <VAR>element</VAR>)</CODE> is <CODE>#f</CODE> and returns everything that's
-left.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(remove-if-not number? '(foo bar baz))
- => ()
-(remove-if-not odd? '(1 2 3 4 5 6 7 8))
- => (1 3 5 7)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1307"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>has-duplicates?</B> <I>lst</I>
-<DD>returns <CODE>#t</CODE> if 2 members of <VAR>lst</VAR> are <CODE>equal?</CODE>, <CODE>#f</CODE>
-otherwise.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(has-duplicates? '(1 2 3 4))
- => #f
-
-(has-duplicates? '(2 4 3 4))
- => #t
-</pre></td></tr></table></DL>
-<P>
-
-The procedure <CODE>remove-duplicates</CODE> uses <CODE>member</CODE> (rather than
-<CODE>memv</CODE>).
-</P>
-<P>
-
-<A NAME="IDX1308"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>remove-duplicates</B> <I>lst</I>
-<DD>returns a copy of <VAR>lst</VAR> with its duplicate members removed.
-Elements are considered duplicate if they are <CODE>equal?</CODE>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(remove-duplicates '(1 2 3 4))
- => (1 2 3 4)
-
-(remove-duplicates '(2 4 3 4))
- => (2 4 3)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Lists as sequences"></A>
-<HR SIZE="6">
-<A NAME="SEC211"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC210"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC212"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.2.1.3 Lists as sequences </H4>
-<!--docid::SEC211::-->
-<P>
-
-<A NAME="IDX1309"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>position</B> <I>obj lst</I>
-<DD><CODE>position</CODE> returns the 0-based position of <VAR>obj</VAR> in <VAR>lst</VAR>,
-or <CODE>#f</CODE> if <VAR>obj</VAR> does not occur in <VAR>lst</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(position 'foo '(foo bar baz bang))
- => 0
-(position 'baz '(foo bar baz bang))
- => 2
-(position 'oops '(foo bar baz bang))
- => #f
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1310"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>reduce</B> <I>p lst</I>
-<DD><CODE>reduce</CODE> combines all the elements of a sequence using a binary
-operation (the combination is left-associative). For example, using
-<CODE>+</CODE>, one can add up all the elements. <CODE>reduce</CODE> allows you to
-apply a function which accepts only two arguments to more than 2
-objects. Functional programmers usually refer to this as <EM>foldl</EM>.
-<CODE>collect:reduce</CODE> (see section <A HREF="slib_7.html#SEC194">7.1.9 Collections</A>) provides a version of
-<CODE>collect</CODE> generalized to collections.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(reduce + '(1 2 3 4))
- => 10
-(define (bad-sum . l) (reduce + l))
-(bad-sum 1 2 3 4)
- == (reduce + (1 2 3 4))
- == (+ (+ (+ 1 2) 3) 4)
-=> 10
-(bad-sum)
- == (reduce + ())
- => ()
-(reduce string-append '(&quot;hello&quot; &quot;cruel&quot; &quot;world&quot;))
- == (string-append (string-append &quot;hello&quot; &quot;cruel&quot;) &quot;world&quot;)
- => &quot;hellocruelworld&quot;
-(reduce anything '())
- => ()
-(reduce anything '(x))
- => x
-</pre></td></tr></table><P>
-
-What follows is a rather non-standard implementation of <CODE>reverse</CODE>
-in terms of <CODE>reduce</CODE> and a combinator elsewhere called
-<EM>C</EM>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>;;; Contributed by Jussi Piitulainen (jpiitula @ ling.helsinki.fi)
-
-(define commute
- (lambda (f)
- (lambda (x y)
- (f y x))))
-
-(define reverse
- (lambda (args)
- (reduce-init (commute cons) '() args)))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1311"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>reduce-init</B> <I>p init lst</I>
-<DD><CODE>reduce-init</CODE> is the same as reduce, except that it implicitly
-inserts <VAR>init</VAR> at the start of the list. <CODE>reduce-init</CODE> is
-preferred if you want to handle the null list, the one-element, and
-lists with two or more elements consistently. It is common to use the
-operator's idempotent as the initializer. Functional programmers
-usually call this <EM>foldl</EM>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (sum . l) (reduce-init + 0 l))
-(sum 1 2 3 4)
- == (reduce-init + 0 (1 2 3 4))
- == (+ (+ (+ (+ 0 1) 2) 3) 4)
- => 10
-(sum)
- == (reduce-init + 0 '())
- => 0
-
-(reduce-init string-append &quot;@&quot; '(&quot;hello&quot; &quot;cruel&quot; &quot;world&quot;))
-==
-(string-append (string-append (string-append &quot;@&quot; &quot;hello&quot;)
- &quot;cruel&quot;)
- &quot;world&quot;)
-=> &quot;@hellocruelworld&quot;
-</pre></td></tr></table><P>
-
-Given a differentiation of 2 arguments, <CODE>diff</CODE>, the following will
-differentiate by any number of variables.
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (diff* exp . vars)
- (reduce-init diff exp vars))
-</pre></td></tr></table><P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>;;; Real-world example: Insertion sort using reduce-init.
-
-(define (insert l item)
- (if (null? l)
- (list item)
- (if (&lt; (car l) item)
- (cons (car l) (insert (cdr l) item))
- (cons item l))))
-(define (insertion-sort l) (reduce-init insert '() l))
-
-(insertion-sort '(3 1 4 1 5)
- == (reduce-init insert () (3 1 4 1 5))
- == (insert (insert (insert (insert (insert () 3) 1) 4) 1) 5)
- == (insert (insert (insert (insert (3)) 1) 4) 1) 5)
- == (insert (insert (insert (1 3) 4) 1) 5)
- == (insert (insert (1 3 4) 1) 5)
- == (insert (1 1 3 4) 5)
- => (1 1 3 4 5)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1312"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>last</B> <I>lst n</I>
-<DD><CODE>last</CODE> returns the last <VAR>n</VAR> elements of <VAR>lst</VAR>. <VAR>n</VAR>
-must be a non-negative integer.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(last '(foo bar baz bang) 2)
- => (baz bang)
-(last '(1 2 3) 0)
- => 0
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1313"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>butlast</B> <I>lst n</I>
-<DD><CODE>butlast</CODE> returns all but the last <VAR>n</VAR> elements of
-<VAR>lst</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(butlast '(a b c d) 3)
- => (a)
-(butlast '(a b c d) 4)
- => ()
-</pre></td></tr></table></DL>
-<P>
-
-<CODE>last</CODE> and <CODE>butlast</CODE> split a list into two parts when given
-identical arugments.
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(last '(a b c d e) 2)
- => (d e)
-(butlast '(a b c d e) 2)
- => (a b c)
-</pre></td></tr></table><P>
-
-<A NAME="IDX1314"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>nthcdr</B> <I>n lst</I>
-<DD><CODE>nthcdr</CODE> takes <VAR>n</VAR> <CODE>cdr</CODE>s of <VAR>lst</VAR> and returns the
-result. Thus <CODE>(nthcdr 3 <VAR>lst</VAR>)</CODE> == <CODE>(cdddr
-<VAR>lst</VAR>)</CODE>
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(nthcdr 2 '(a b c d))
- => (c d)
-(nthcdr 0 '(a b c d))
- => (a b c d)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1315"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>butnthcdr</B> <I>n lst</I>
-<DD><CODE>butnthcdr</CODE> returns all but the nthcdr <VAR>n</VAR> elements of
-<VAR>lst</VAR>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(butnthcdr 3 '(a b c d))
- => (a b c)
-(butnthcdr 4 '(a b c d))
- => (a b c d)
-</pre></td></tr></table></DL>
-<P>
-
-<CODE>nthcdr</CODE> and <CODE>butnthcdr</CODE> split a list into two parts when
-given identical arugments.
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(nthcdr 2 '(a b c d e))
- => (c d e)
-(butnthcdr 2 '(a b c d e))
- => (a b)
-</pre></td></tr></table><P>
-
-<A NAME="Destructive list operations"></A>
-<HR SIZE="6">
-<A NAME="SEC212"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC211"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC213"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.2.1.4 Destructive list operations </H4>
-<!--docid::SEC212::-->
-<P>
-
-These procedures may mutate the list they operate on, but any such
-mutation is undefined.
-</P>
-<P>
-
-<A NAME="IDX1316"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>nconc</B> <I>args</I>
-<DD><CODE>nconc</CODE> destructively concatenates its arguments. (Compare this
-with <CODE>append</CODE>, which copies arguments rather than destroying them.)
-Sometimes called <CODE>append!</CODE> (see section <A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A>).
-<P>
-
-Example: You want to find the subsets of a set. Here's the obvious way:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (subsets set)
- (if (null? set)
- '(())
- (append (map (lambda (sub) (cons (car set) sub))
- (subsets (cdr set)))
- (subsets (cdr set)))))
-</pre></td></tr></table>But that does way more consing than you need. Instead, you could
-replace the <CODE>append</CODE> with <CODE>nconc</CODE>, since you don't have any
-need for all the intermediate results.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define x '(a b c))
-(define y '(d e f))
-(nconc x y)
- => (a b c d e f)
-x
- => (a b c d e f)
-</pre></td></tr></table><P>
-
-<CODE>nconc</CODE> is the same as <CODE>append!</CODE> in `<TT>sc2.scm</TT>'.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1317"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>nreverse</B> <I>lst</I>
-<DD><CODE>nreverse</CODE> reverses the order of elements in <VAR>lst</VAR> by mutating
-<CODE>cdr</CODE>s of the list. Sometimes called <CODE>reverse!</CODE>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define foo '(a b c))
-(nreverse foo)
- => (c b a)
-foo
- => (a)
-</pre></td></tr></table><P>
-
-Some people have been confused about how to use <CODE>nreverse</CODE>,
-thinking that it doesn't return a value. It needs to be pointed out
-that
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! lst (nreverse lst))
-</pre></td></tr></table>is the proper usage, not
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(nreverse lst)
-</pre></td></tr></table>The example should suffice to show why this is the case.
-</DL>
-<P>
-
-<A NAME="IDX1318"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>delete</B> <I>elt lst</I>
-<DD><A NAME="IDX1319"></A>
-<DT><U>Procedure:</U> <B>delete-if</B> <I>pred lst</I>
-<DD><A NAME="IDX1320"></A>
-<DT><U>Procedure:</U> <B>delete-if-not</B> <I>pred lst</I>
-<DD>Destructive versions of <CODE>remove</CODE> <CODE>remove-if</CODE>, and
-<CODE>remove-if-not</CODE>.
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define lst (list 'foo 'bar 'baz 'bang))
-(delete 'foo lst)
- => (bar baz bang)
-lst
- => (foo bar baz bang)
-
-(define lst (list 1 2 3 4 5 6 7 8 9))
-(delete-if odd? lst)
- => (2 4 6 8)
-lst
- => (1 2 4 6 8)
-</pre></td></tr></table><P>
-
-Some people have been confused about how to use <CODE>delete</CODE>,
-<CODE>delete-if</CODE>, and <CODE>delete-if</CODE>, thinking that they don't return
-a value. It needs to be pointed out that
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! lst (delete el lst))
-</pre></td></tr></table>is the proper usage, not
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(delete el lst)
-</pre></td></tr></table>The examples should suffice to show why this is the case.
-</DL>
-<P>
-
-<A NAME="Non-List functions"></A>
-<HR SIZE="6">
-<A NAME="SEC213"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC212"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC214"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.2.1.5 Non-List functions </H4>
-<!--docid::SEC213::-->
-<P>
-
-<A NAME="IDX1321"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>and?</B> <I>arg1 <small>...</small></I>
-<DD><CODE>and?</CODE> checks to see if all its arguments are true. If they are,
-<CODE>and?</CODE> returns <CODE>#t</CODE>, otherwise, <CODE>#f</CODE>. (In contrast to
-<CODE>and</CODE>, this is a function, so all arguments are always evaluated
-and in an unspecified order.)
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(and? 1 2 3)
- => #t
-(and #f 1 2)
- => #f
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1322"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>or?</B> <I>arg1 <small>...</small></I>
-<DD><CODE>or?</CODE> checks to see if any of its arguments are true. If any is
-true, <CODE>or?</CODE> returns <CODE>#t</CODE>, and <CODE>#f</CODE> otherwise. (To
-<CODE>or</CODE> as <CODE>and?</CODE> is to <CODE>and</CODE>.)
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(or? 1 2 #f)
- => #t
-(or? #f #f #f)
- => #f
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1323"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>atom?</B> <I>object</I>
-<DD>Returns <CODE>#t</CODE> if <VAR>object</VAR> is not a pair and <CODE>#f</CODE> if it is
-pair. (Called <CODE>atom</CODE> in Common LISP.)
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(atom? 1)
- => #t
-(atom? '(1 2))
- => #f
-(atom? #(1 2)) ; dubious!
- => #t
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Tree Operations"></A>
-<HR SIZE="6">
-<A NAME="SEC214"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC213"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC215"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.2 Tree operations </H3>
-<!--docid::SEC214::-->
-<P>
-
-<CODE>(require 'tree)</CODE>
-<A NAME="IDX1324"></A>
-</P>
-<P>
-
-These are operations that treat lists a representations of trees.
-</P>
-<P>
-
-<A NAME="IDX1325"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>subst</B> <I>new old tree</I>
-<DD><A NAME="IDX1326"></A>
-<DT><U>Function:</U> <B>substq</B> <I>new old tree</I>
-<DD><A NAME="IDX1327"></A>
-<DT><U>Function:</U> <B>substv</B> <I>new old tree</I>
-<DD><P>
-
-<A NAME="IDX1328"></A>
-<DT><U>Function:</U> <B>subst</B> <I>new old tree equ?</I>
-<DD><CODE>subst</CODE> makes a copy of <VAR>tree</VAR>, substituting <VAR>new</VAR> for
-every subtree or leaf of <VAR>tree</VAR> which is <CODE>equal?</CODE> to <VAR>old</VAR>
-and returns a modified tree. The original <VAR>tree</VAR> is unchanged, but
-may share parts with the result.
-</P>
-<P>
-
-<CODE>substq</CODE> and <CODE>substv</CODE> are similar, but test against <VAR>old</VAR>
-using <CODE>eq?</CODE> and <CODE>eqv?</CODE> respectively. If <CODE>subst</CODE> is
-called with a fourth argument, <VAR>equ?</VAR> is the equality predicate.
-</P>
-<P>
-
-Examples:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(substq 'tempest 'hurricane '(shakespeare wrote (the hurricane)))
- => (shakespeare wrote (the tempest))
-(substq 'foo '() '(shakespeare wrote (twelfth night)))
- => (shakespeare wrote (twelfth night . foo) . foo)
-(subst '(a . cons) '(old . pair)
- '((old . spice) ((old . shoes) old . pair) (old . pair)))
- => ((old . spice) ((old . shoes) a . cons) (a . cons))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1329"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>copy-tree</B> <I>tree</I>
-<DD><P>
-
-Makes a copy of the nested list structure <VAR>tree</VAR> using new pairs and
-returns it. All levels are copied, so that none of the pairs in the
-tree are <CODE>eq?</CODE> to the original ones -- only the leaves are.
-</P>
-<P>
-
-Example:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define bar '(bar))
-(copy-tree (list bar 'foo))
- => ((bar) foo)
-(eq? bar (car (copy-tree (list bar 'foo))))
- => #f
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Chapter Ordering"></A>
-<HR SIZE="6">
-<A NAME="SEC215"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC214"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC216"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.3 Chapter Ordering </H3>
-<!--docid::SEC215::-->
-<P>
-
-<CODE>(require 'chapter-order)</CODE>
-<A NAME="IDX1330"></A>
-</P>
-<P>
-
-The `<SAMP>chap:</SAMP>' functions deal with strings which are ordered like
-chapter numbers (or letters) in a book. Each section of the string
-consists of consecutive numeric or consecutive aphabetic characters of
-like case.
-</P>
-<P>
-
-<A NAME="IDX1331"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>chap:string&lt;?</B> <I>string1 string2</I>
-<DD><P>
-
-Returns #t if the first non-matching run of alphabetic upper-case or
-the first non-matching run of alphabetic lower-case or the first
-non-matching run of numeric characters of <VAR>string1</VAR> is
-<CODE>string&lt;?</CODE> than the corresponding non-matching run of
-characters of <VAR>string2</VAR>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(chap:string&lt;? &quot;a.9&quot; &quot;a.10&quot;) => #t
-(chap:string&lt;? &quot;4c&quot; &quot;4aa&quot;) => #t
-(chap:string&lt;? &quot;Revised^{3.99}&quot; &quot;Revised^{4}&quot;) => #t
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1332"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>chap:string&gt;?</B> <I>string1 string2</I>
-<DD><A NAME="IDX1333"></A>
-<DT><U>Function:</U> <B>chap:string&lt;=?</B> <I>string1 string2</I>
-<DD><A NAME="IDX1334"></A>
-<DT><U>Function:</U> <B>chap:string&gt;=?</B> <I>string1 string2</I>
-<DD><P>
-
-Implement the corresponding chapter-order predicates.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1335"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>chap:next-string</B> <I>string</I>
-<DD><P>
-
-Returns the next string in the <EM>chapter order</EM>. If <VAR>string</VAR>
-has no alphabetic or numeric characters,
-<CODE>(string-append <VAR>string</VAR> &quot;0&quot;)</CODE> is returnd. The argument to
-chap:next-string will always be <CODE>chap:string&lt;?</CODE> than the result.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(chap:next-string &quot;a.9&quot;) => &quot;a.10&quot;
-(chap:next-string &quot;4c&quot;) => &quot;4d&quot;
-(chap:next-string &quot;4z&quot;) => &quot;4aa&quot;
-(chap:next-string &quot;Revised^{4}&quot;) => &quot;Revised^{5}&quot;
-
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Sorting"></A>
-<HR SIZE="6">
-<A NAME="SEC216"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC215"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC217"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.4 Sorting </H3>
-<!--docid::SEC216::-->
-<P>
-
-<CODE>(require 'sort)</CODE>
-<A NAME="IDX1336"></A>
-</P>
-<P>
-
-Many Scheme systems provide some kind of sorting functions. They do
-not, however, always provide the <EM>same</EM> sorting functions, and
-those that I have had the opportunity to test provided inefficient ones
-(a common blunder is to use quicksort which does not perform well).
-</P>
-<P>
-
-Because <CODE>sort</CODE> and <CODE>sort!</CODE> are not in the standard, there is
-very little agreement about what these functions look like. For
-example, Dybvig says that Chez Scheme provides
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(merge predicate list1 list2)
-(merge! predicate list1 list2)
-(sort predicate list)
-(sort! predicate list)
-</pre></td></tr></table>while MIT Scheme 7.1, following Common LISP, offers unstable
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(sort list predicate)
-</pre></td></tr></table>TI PC Scheme offers
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(sort! list/vector predicate?)
-</pre></td></tr></table>and Elk offers
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(sort list/vector predicate?)
-(sort! list/vector predicate?)
-</pre></td></tr></table><P>
-
-Here is a comprehensive catalogue of the variations I have found.
-</P>
-<P>
-
-<OL>
-<LI>
-Both <CODE>sort</CODE> and <CODE>sort!</CODE> may be provided.
-<LI>
-<CODE>sort</CODE> may be provided without <CODE>sort!</CODE>.
-<LI>
-<CODE>sort!</CODE> may be provided without <CODE>sort</CODE>.
-<LI>
-Neither may be provided.
-<LI>
-The sequence argument may be either a list or a vector.
-<LI>
-The sequence argument may only be a list.
-<LI>
-The sequence argument may only be a vector.
-<LI>
-The comparison function may be expected to behave like <CODE>&lt;</CODE>.
-<LI>
-The comparison function may be expected to behave like <CODE>&lt;=</CODE>.
-<LI>
-The interface may be <CODE>(sort predicate? sequence)</CODE>.
-<LI>
-The interface may be <CODE>(sort sequence predicate?)</CODE>.
-<LI>
-The interface may be <CODE>(sort sequence &amp;optional (predicate? &lt;))</CODE>.
-<LI>
-The sort may be stable.
-<LI>
-The sort may be unstable.
-</OL>
-<P>
-
-All of this variation really does not help anybody. A nice simple merge
-sort is both stable and fast (quite a lot faster than <EM>quick</EM> sort).
-</P>
-<P>
-
-I am providing this source code with no restrictions at all on its use
-(but please retain D.H.D.Warren's credit for the original idea). You
-may have to rename some of these functions in order to use them in a
-system which already provides incompatible or inferior sorts. For each
-of the functions, only the top-level define needs to be edited to do
-that.
-</P>
-<P>
-
-I could have given these functions names which would not clash with any
-Scheme that I know of, but I would like to encourage implementors to
-converge on a single interface, and this may serve as a hint. The
-argument order for all functions has been chosen to be as close to
-Common LISP as made sense, in order to avoid NIH-itis.
-</P>
-<P>
-
-Each of the five functions has a required <EM>last</EM> parameter which is
-a comparison function. A comparison function <CODE>f</CODE> is a function of
-2 arguments which acts like <CODE>&lt;</CODE>. For example,
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(not (f x x))
-(and (f x y) (f y z)) == (f x z)
-</pre></td></tr></table><P>
-
-The standard functions <CODE>&lt;</CODE>, <CODE>&gt;</CODE>, <CODE>char&lt;?</CODE>, <CODE>char&gt;?</CODE>,
-<CODE>char-ci&lt;?</CODE>, <CODE>char-ci&gt;?</CODE>, <CODE>string&lt;?</CODE>, <CODE>string&gt;?</CODE>,
-<CODE>string-ci&lt;?</CODE>, and <CODE>string-ci&gt;?</CODE> are suitable for use as
-comparison functions. Think of <CODE>(less? x y)</CODE> as saying when
-<CODE>x</CODE> must <EM>not</EM> precede <CODE>y</CODE>.
-</P>
-<P>
-
-<A NAME="IDX1337"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>sorted?</B> <I>sequence less?</I>
-<DD>Returns <CODE>#t</CODE> when the sequence argument is in non-decreasing order
-according to <VAR>less?</VAR> (that is, there is no adjacent pair <CODE><small>...</small> x
-y <small>...</small></CODE> for which <CODE>(less? y x)</CODE>).
-<P>
-
-Returns <CODE>#f</CODE> when the sequence contains at least one out-of-order
-pair. It is an error if the sequence is not a list, vector, or
-string.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1338"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>merge</B> <I>list1 list2 less?</I>
-<DD>This merges two lists, producing a completely new list as result. I
-gave serious consideration to producing a Common-LISP-compatible
-version. However, Common LISP's <CODE>sort</CODE> is our <CODE>sort!</CODE> (well,
-in fact Common LISP's <CODE>stable-sort</CODE> is our <CODE>sort!</CODE>, merge sort
-is <EM>fast</EM> as well as stable!) so adapting CL code to Scheme takes a
-bit of work anyway. I did, however, appeal to CL to determine the
-<EM>order</EM> of the arguments.
-</DL>
-<P>
-
-<A NAME="IDX1339"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>merge!</B> <I>list1 list2 less?</I>
-<DD>Merges two lists, re-using the pairs of <VAR>list1</VAR> and <VAR>list2</VAR> to
-build the result. If the code is compiled, and <VAR>less?</VAR> constructs
-no new pairs, no pairs at all will be allocated. The first pair of the
-result will be either the first pair of <VAR>list1</VAR> or the first pair of
-<VAR>list2</VAR>, but you can't predict which.
-<P>
-
-The code of <CODE>merge</CODE> and <CODE>merge!</CODE> could have been quite a bit
-simpler, but they have been coded to reduce the amount of work done per
-iteration. (For example, we only have one <CODE>null?</CODE> test per
-iteration.)
-</P>
-<P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1340"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>sort</B> <I>sequence less?</I>
-<DD>Accepts either a list, vector, or string; and returns a new sequence
-which is sorted. The new sequence is the same type as the input.
-Always <CODE>(sorted? (sort sequence less?) less?)</CODE>. The original
-sequence is not altered in any way. The new sequence shares its
-<EM>elements</EM> with the old one; no elements are copied.
-</DL>
-<P>
-
-<A NAME="IDX1341"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>sort!</B> <I>sequence less?</I>
-<DD>Returns its sorted result in the original boxes. If the original
-sequence is a list, no new storage is allocated at all. If the
-original sequence is a vector or string, the sorted elements are put
-back in the same vector or string.
-<P>
-
-Some people have been confused about how to use <CODE>sort!</CODE>, thinking
-that it doesn't return a value. It needs to be pointed out that
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! slist (sort! slist &lt;))
-</pre></td></tr></table>is the proper usage, not
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(sort! slist &lt;)
-</pre></td></tr></table></DL>
-<P>
-
-Note that these functions do <EM>not</EM> accept a CL-style `<SAMP>:key</SAMP>'
-argument. A simple device for obtaining the same expressiveness is to
-define
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (keyed less? key)
- (lambda (x y) (less? (key x) (key y))))
-</pre></td></tr></table>and then, when you would have written
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(sort a-sequence #'my-less :key #'my-key)
-</pre></td></tr></table>in Common LISP, just write
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(sort! a-sequence (keyed my-less? my-key))
-</pre></td></tr></table>in Scheme.
-<P>
-
-<A NAME="Topological Sort"></A>
-<HR SIZE="6">
-<A NAME="SEC217"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC216"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC218"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.5 Topological Sort </H3>
-<!--docid::SEC217::-->
-<P>
-
-<CODE>(require 'topological-sort)</CODE> or <CODE>(require 'tsort)</CODE>
-<A NAME="IDX1342"></A>
-<A NAME="IDX1343"></A>
-</P>
-<P>
-
-The algorithm is inspired by Cormen, Leiserson and Rivest (1990)
-<CITE>Introduction to Algorithms</CITE>, chapter 23.
-</P>
-<P>
-
-<A NAME="IDX1344"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>tsort</B> <I>dag pred</I>
-<DD><P>
-
-<A NAME="IDX1345"></A>
-<DT><U>Function:</U> <B>topological-sort</B> <I>dag pred</I>
-<DD>where
-</P>
-<DL COMPACT>
-<DT><VAR>dag</VAR>
-<DD>is a list of sublists. The car of each sublist is a vertex. The cdr is
-the adjacency list of that vertex, i.e. a list of all vertices to which
-there exists an edge from the car vertex.
-<DT><VAR>pred</VAR>
-<DD>is one of <CODE>eq?</CODE>, <CODE>eqv?</CODE>, <CODE>equal?</CODE>, <CODE>=</CODE>,
-<CODE>char=?</CODE>, <CODE>char-ci=?</CODE>, <CODE>string=?</CODE>, or <CODE>string-ci=?</CODE>.
-</DL>
-<P>
-
-Sort the directed acyclic graph <VAR>dag</VAR> so that for every edge from
-vertex <VAR>u</VAR> to <VAR>v</VAR>, <VAR>u</VAR> will come before <VAR>v</VAR> in the
-resulting list of vertices.
-</P>
-<P>
-
-Time complexity: O (|V| + |E|)
-</P>
-<P>
-
-Example (from Cormen):
-<BLOCKQUOTE>
-Prof. Bumstead topologically sorts his clothing when getting
-dressed. The first argument to <CODE>tsort</CODE> describes which
-garments he needs to put on before others. (For example,
-Prof Bumstead needs to put on his shirt before he puts on his
-tie or his belt.) <CODE>tsort</CODE> gives the correct order of dressing:
-</BLOCKQUOTE>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'tsort)
-<A NAME="IDX1346"></A>(tsort '((shirt tie belt)
- (tie jacket)
- (belt jacket)
- (watch)
- (pants shoes belt)
- (undershorts pants shoes)
- (socks shoes))
- eq?)
-=>
-(socks undershorts pants shoes watch shirt belt tie jacket)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Hashing"></A>
-<HR SIZE="6">
-<A NAME="SEC218"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC217"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC219"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.6 Hashing </H3>
-<!--docid::SEC218::-->
-<P>
-
-<CODE>(require 'hash)</CODE>
-<A NAME="IDX1347"></A>
-</P>
-<P>
-
-These hashing functions are for use in quickly classifying objects.
-Hash tables use these functions.
-</P>
-<P>
-
-<A NAME="IDX1348"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>hashq</B> <I>obj k</I>
-<DD><A NAME="IDX1349"></A>
-<DT><U>Function:</U> <B>hashv</B> <I>obj k</I>
-<DD><A NAME="IDX1350"></A>
-<DT><U>Function:</U> <B>hash</B> <I>obj k</I>
-<DD>Returns an exact non-negative integer less than <VAR>k</VAR>. For each
-non-negative integer less than <VAR>k</VAR> there are arguments <VAR>obj</VAR> for
-which the hashing functions applied to <VAR>obj</VAR> and <VAR>k</VAR> returns
-that integer.
-<P>
-
-For <CODE>hashq</CODE>, <CODE>(eq? obj1 obj2)</CODE> implies <CODE>(= (hashq obj1 k)
-(hashq obj2))</CODE>.
-</P>
-<P>
-
-For <CODE>hashv</CODE>, <CODE>(eqv? obj1 obj2)</CODE> implies <CODE>(= (hashv obj1 k)
-(hashv obj2))</CODE>.
-</P>
-<P>
-
-For <CODE>hash</CODE>, <CODE>(equal? obj1 obj2)</CODE> implies <CODE>(= (hash obj1 k)
-(hash obj2))</CODE>.
-</P>
-<P>
-
-<CODE>hash</CODE>, <CODE>hashv</CODE>, and <CODE>hashq</CODE> return in time bounded by a
-constant. Notice that items having the same <CODE>hash</CODE> implies the
-items have the same <CODE>hashv</CODE> implies the items have the same
-<CODE>hashq</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="Space-Filling Curves"></A>
-<HR SIZE="6">
-<A NAME="SEC219"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC218"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC220"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.7 Space-Filling Curves </H3>
-<!--docid::SEC219::-->
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC221">7.2.7.2 Sierpinski Curve</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Peano-Hilbert Space-Filling Curve"></A>
-<HR SIZE="6">
-<A NAME="SEC220"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC219"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC221"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC219"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.2.7.1 Peano-Hilbert Space-Filling Curve </H4>
-<!--docid::SEC220::-->
-<P>
-
-<CODE>(require 'hilbert-fill)</CODE>
-<A NAME="IDX1351"></A>
-</P>
-<P>
-
-<A NAME="IDX1352"></A>
-<A NAME="IDX1353"></A>
-<A NAME="IDX1354"></A>
-The <EM>Peano-Hilbert Space-Filling Curve</EM> is a one-to-one mapping
-<A NAME="IDX1355"></A>
-between a unit line segment and an <VAR>n</VAR>-dimensional unit cube.
-</P>
-<P>
-
-The integer procedures map the non-negative integers to an
-arbitrarily large <VAR>n</VAR>-dimensional cube with its corner at the
-origin and all coordinates are non-negative.
-</P>
-<P>
-
-For any exact nonnegative integers <VAR>scalar</VAR> and <VAR>rank</VAR>,
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(= <VAR>scalar</VAR> (hilbert-coordinates-&gt;integer
- (integer-&gt;hilbert-coordinates <VAR>scalar</VAR> <VAR>rank</VAR>)))
- => #t
-</pre></td></tr></table><P>
-
-<A NAME="IDX1356"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>integer-&gt;hilbert-coordinates</B> <I>scalar rank</I>
-<DD><P>
-
-Returns a list of <VAR>rank</VAR> integer coordinates corresponding to exact
-non-negative integer <VAR>scalar</VAR>. The lists returned by <CODE>integer-&gt;hilbert-coordinates</CODE> for <VAR>scalar</VAR> arguments
-0 and 1 will differ in the first element.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1357"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>hilbert-coordinates-&gt;integer</B> <I>coords</I>
-<DD><P>
-
-Returns an exact non-negative integer corresponding to <VAR>coords</VAR>, a list
-of non-negative integer coordinates.
-</P>
-</DL>
-<P>
-
-<A NAME="Sierpinski Curve"></A>
-<HR SIZE="6">
-<A NAME="SEC221"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC220"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC222"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC219"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.2.7.2 Sierpinski Curve </H4>
-<!--docid::SEC221::-->
-<P>
-
-<CODE>(require 'sierpinski)</CODE>
-<A NAME="IDX1358"></A>
-</P>
-<P>
-
-<A NAME="IDX1359"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-sierpinski-indexer</B> <I>max-coordinate</I>
-<DD>Returns a procedure (eg hash-function) of 2 numeric arguments which
-preserves <EM>nearness</EM> in its mapping from NxN to N.
-<P>
-
-<VAR>max-coordinate</VAR> is the maximum coordinate (a positive integer) of a
-population of points. The returned procedures is a function that takes
-the x and y coordinates of a point, (non-negative integers) and returns
-an integer corresponding to the relative position of that point along a
-Sierpinski curve. (You can think of this as computing a (pseudo-)
-inverse of the Sierpinski spacefilling curve.)
-</P>
-<P>
-
-Example use: Make an indexer (hash-function) for integer points lying in
-square of integer grid points [0,99]x[0,99]:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define space-key (make-sierpinski-indexer 100))
-</pre></td></tr></table>Now let's compute the index of some points:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(space-key 24 78) => 9206
-(space-key 23 80) => 9172
-</pre></td></tr></table><P>
-
-Note that locations (24, 78) and (23, 80) are near in index and
-therefore, because the Sierpinski spacefilling curve is continuous, we
-know they must also be near in the plane. Nearness in the plane does
-not, however, necessarily correspond to nearness in index, although it
-<EM>tends</EM> to be so.
-</P>
-<P>
-
-Example applications:
-<UL>
-
-<LI>
-Sort points by Sierpinski index to get heuristic solution to
-<EM>travelling salesman problem</EM>. For details of performance,
-see L. Platzman and J. Bartholdi, &quot;Spacefilling curves and the
-Euclidean travelling salesman problem&quot;, JACM 36(4):719--737
-(October 1989) and references therein.
-<P>
-
-</P>
-<LI>
-Use Sierpinski index as key by which to store 2-dimensional data
-in a 1-dimensional data structure (such as a table). Then
-locations that are near each other in 2-d space will tend to
-be near each other in 1-d data structure; and locations that
-are near in 1-d data structure will be near in 2-d space. This
-can significantly speed retrieval from secondary storage because
-contiguous regions in the plane will tend to correspond to
-contiguous regions in secondary storage. (This is a standard
-technique for managing CAD/CAM or geographic data.)
-<P>
-
-</UL>
-</DL>
-<P>
-
-<A NAME="Soundex"></A>
-<HR SIZE="6">
-<A NAME="SEC222"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC221"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC223"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.8 Soundex </H3>
-<!--docid::SEC222::-->
-<P>
-
-<CODE>(require 'soundex)</CODE>
-<A NAME="IDX1360"></A>
-</P>
-<P>
-
-<A NAME="IDX1361"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>soundex</B> <I>name</I>
-<DD>Computes the <EM>soundex</EM> hash of <VAR>name</VAR>. Returns a string of an
-initial letter and up to three digits between 0 and 6. Soundex
-supposedly has the property that names that sound similar in normal
-English pronunciation tend to map to the same key.
-<P>
-
-Soundex was a classic algorithm used for manual filing of personal
-records before the advent of computers. It performs adequately for
-English names but has trouble with other languages.
-</P>
-<P>
-
-See Knuth, Vol. 3 <CITE>Sorting and searching</CITE>, pp 391--2
-</P>
-<P>
-
-To manage unusual inputs, <CODE>soundex</CODE> omits all non-alphabetic
-characters. Consequently, in this implementation:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(soundex &lt;string of blanks&gt;) => &quot;&quot;
-(soundex &quot;&quot;) => &quot;&quot;
-</pre></td></tr></table><P>
-
-Examples from Knuth:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(map soundex '(&quot;Euler&quot; &quot;Gauss&quot; &quot;Hilbert&quot; &quot;Knuth&quot;
- &quot;Lloyd&quot; &quot;Lukasiewicz&quot;))
- => (&quot;E460&quot; &quot;G200&quot; &quot;H416&quot; &quot;K530&quot; &quot;L300&quot; &quot;L222&quot;)
-
-(map soundex '(&quot;Ellery&quot; &quot;Ghosh&quot; &quot;Heilbronn&quot; &quot;Kant&quot;
- &quot;Ladd&quot; &quot;Lissajous&quot;))
- => (&quot;E460&quot; &quot;G200&quot; &quot;H416&quot; &quot;K530&quot; &quot;L300&quot; &quot;L222&quot;)
-</pre></td></tr></table><P>
-
-Some cases in which the algorithm fails (Knuth):
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(map soundex '(&quot;Rogers&quot; &quot;Rodgers&quot;)) => (&quot;R262&quot; &quot;R326&quot;)
-
-(map soundex '(&quot;Sinclair&quot; &quot;St. Clair&quot;)) => (&quot;S524&quot; &quot;S324&quot;)
-
-(map soundex '(&quot;Tchebysheff&quot; &quot;Chebyshev&quot;)) => (&quot;T212&quot; &quot;C121&quot;)
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="String Search"></A>
-<HR SIZE="6">
-<A NAME="SEC223"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC222"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC224"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.9 String Search </H3>
-<!--docid::SEC223::-->
-<P>
-
-<CODE>(require 'string-search)</CODE>
-<A NAME="IDX1362"></A>
-</P>
-<P>
-
-<A NAME="IDX1363"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>string-index</B> <I>string char</I>
-<DD><A NAME="IDX1364"></A>
-<DT><U>Procedure:</U> <B>string-index-ci</B> <I>string char</I>
-<DD>Returns the index of the first occurence of <VAR>char</VAR> within
-<VAR>string</VAR>, or <CODE>#f</CODE> if the <VAR>string</VAR> does not contain a
-character <VAR>char</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1365"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>string-reverse-index</B> <I>string char</I>
-<DD><A NAME="IDX1366"></A>
-<DT><U>Procedure:</U> <B>string-reverse-index-ci</B> <I>string char</I>
-<DD>Returns the index of the last occurence of <VAR>char</VAR> within
-<VAR>string</VAR>, or <CODE>#f</CODE> if the <VAR>string</VAR> does not contain a
-character <VAR>char</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1367"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>substring?</B> <I>pattern string</I>
-<DD><A NAME="IDX1368"></A>
-<DT><U>Procedure:</U> <B>substring-ci?</B> <I>pattern string</I>
-<DD>Searches <VAR>string</VAR> to see if some substring of <VAR>string</VAR> is equal
-to <VAR>pattern</VAR>. <CODE>substring?</CODE> returns the index of the first
-character of the first substring of <VAR>string</VAR> that is equal to
-<VAR>pattern</VAR>; or <CODE>#f</CODE> if <VAR>string</VAR> does not contain
-<VAR>pattern</VAR>.
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(substring? &quot;rat&quot; &quot;pirate&quot;) => 2
-(substring? &quot;rat&quot; &quot;outrage&quot;) => #f
-(substring? &quot;&quot; any-string) => 0
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1369"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>find-string-from-port?</B> <I>str in-port max-no-chars</I>
-<DD>Looks for a string <VAR>str</VAR> within the first <VAR>max-no-chars</VAR> chars
-of the input port <VAR>in-port</VAR>.
-<P>
-
-<A NAME="IDX1370"></A>
-<DT><U>Procedure:</U> <B>find-string-from-port?</B> <I>str in-port</I>
-<DD>When called with two arguments, the search span is limited by the end of
-the input stream.
-</P>
-<P>
-
-<A NAME="IDX1371"></A>
-<DT><U>Procedure:</U> <B>find-string-from-port?</B> <I>str in-port char</I>
-<DD>Searches up to the first occurrence of character <VAR>char</VAR> in
-<VAR>str</VAR>.
-</P>
-<P>
-
-<A NAME="IDX1372"></A>
-<DT><U>Procedure:</U> <B>find-string-from-port?</B> <I>str in-port proc</I>
-<DD>Searches up to the first occurrence of the procedure <VAR>proc</VAR>
-returning non-false when called with a character (from <VAR>in-port</VAR>)
-argument.
-</P>
-<P>
-
-When the <VAR>str</VAR> is found, <CODE>find-string-from-port?</CODE> returns the
-number of characters it has read from the port, and the port is set to
-read the first char after that (that is, after the <VAR>str</VAR>) The
-function returns <CODE>#f</CODE> when the <VAR>str</VAR> isn't found.
-</P>
-<P>
-
-<CODE>find-string-from-port?</CODE> reads the port <EM>strictly</EM>
-sequentially, and does not perform any buffering. So
-<CODE>find-string-from-port?</CODE> can be used even if the <VAR>in-port</VAR> is
-open to a pipe or other communication channel.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1373"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>string-subst</B> <I>txt old1 new1 <small>...</small></I>
-<DD>Returns a copy of string <VAR>txt</VAR> with all occurrences of string
-<VAR>old1</VAR> in <VAR>txt</VAR> replaced with <VAR>new1</VAR>; then <VAR>old2</VAR>
-replaced with <VAR>new2</VAR> <small>...</small>. Matches are found from the left.
-Matches do not overlap.
-</DL>
-<P>
-
-<A NAME="IDX1374"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>count-newlines</B> <I>str</I>
-<DD>Returns the number of `<SAMP>#\newline</SAMP>' characters in string <VAR>str</VAR>.
-</DL>
-<P>
-
-<A NAME="Sequence Comparison"></A>
-<HR SIZE="6">
-<A NAME="SEC224"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC223"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.2.10 Sequence Comparison </H3>
-<!--docid::SEC224::-->
-<P>
-
-<CODE>(require 'diff)</CODE>
-<A NAME="IDX1375"></A>
-<A NAME="IDX1376"></A>
-</P>
-<P>
-
-<CODE>diff:edit-length</CODE> implements the algorithm:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>S. Wu, E. Myers, U. Manber, and W. Miller,
- &quot;An O(NP) Sequence Comparison Algorithm,&quot;
- Information Processing Letters 35, 6 (1990), 317-323.
- <A HREF="http://www.cs.arizona.edu/people/gene/vita.html">http://www.cs.arizona.edu/people/gene/vita.html</A>
-</pre></td></tr></table>S. Wu, &lt;A HREF=&quot;http://www.cs.arizona.edu/people/gene/vita.html&quot;&gt;
-E. Myers,&lt;/A&gt; U. Manber, and W. Miller,
-&lt;A HREF=&quot;http://www.cs.arizona.edu/people/gene/PAPERS/np_diff.ps&quot;&gt;
-&quot;An O(NP) Sequence Comparison Algorithm,&quot;&lt;/A&gt;
-Information Processing Letters 35, 6 (1990), 317-323.
-<P>
-
-The values returned by <CODE>diff:edit-length</CODE> can be used to gauge
-the degree of match between two sequences.
-</P>
-<P>
-
-Surprisingly, &quot;An O(NP) Sequence Comparison Algorithm&quot; does not
-derive the edit sequence; only the sequence length. Developing this
-linear-space sub-quadratic-time algorithm for computing the edit
-sequence required hundreds of hours of work. I have submitted a
-paper describing the algorithm to the Journal of Computational
-Biology.
-</P>
-<P>
-
-If the items being sequenced are text lines, then the computed
-edit-list is equivalent to the output of the <EM>diff</EM> utility
-<A NAME="IDX1377"></A>
-program. If the items being sequenced are words, then it is like the
-lesser known <EM>spiff</EM> program.
-<A NAME="IDX1378"></A>
-</P>
-<P>
-
-<A NAME="IDX1379"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>diff:longest-common-subsequence</B> <I>array1 array2 =? p-lim</I>
-<DD><P>
-
-<A NAME="IDX1380"></A>
-<DT><U>Function:</U> <B>diff:longest-common-subsequence</B> <I>array1 array2 =?</I>
-<DD><VAR>array1</VAR> and <VAR>array2</VAR> are one-dimensional arrays. The procedure <VAR>=?</VAR> is used
-to compare sequence tokens for equality.
-</P>
-<P>
-
-The non-negative integer <VAR>p-lim</VAR>, if provided, is maximum number of
-deletions of the shorter sequence to allow. <CODE>diff:longest-common-subsequence</CODE> will return <CODE>#f</CODE>
-if more deletions would be necessary.
-</P>
-<P>
-
-<CODE>diff:longest-common-subsequence</CODE> returns a one-dimensional array of length <CODE>(quotient (- (+
-len1 len2) (diff:edit-length <VAR>array1</VAR> <VAR>array2</VAR>)) 2)</CODE> holding the longest sequence
-common to both <VAR>array</VAR>s.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1381"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>diff:edits</B> <I>array1 array2 =? p-lim</I>
-<DD><P>
-
-<A NAME="IDX1382"></A>
-<DT><U>Function:</U> <B>diff:edits</B> <I>array1 array2 =?</I>
-<DD><VAR>array1</VAR> and <VAR>array2</VAR> are one-dimensional arrays. The procedure <VAR>=?</VAR> is used
-to compare sequence tokens for equality.
-</P>
-<P>
-
-The non-negative integer <VAR>p-lim</VAR>, if provided, is maximum number of
-deletions of the shorter sequence to allow. <CODE>diff:edits</CODE> will return <CODE>#f</CODE>
-if more deletions would be necessary.
-</P>
-<P>
-
-<CODE>diff:edits</CODE> returns a vector of length <CODE>(diff:edit-length <VAR>array1</VAR> <VAR>array2</VAR>)</CODE> composed
-of a shortest sequence of edits transformaing <VAR>array1</VAR> to <VAR>array2</VAR>.
-</P>
-<P>
-
-Each edit is an integer:
-</P>
-<DL COMPACT>
-<DT><VAR>k</VAR> &gt; 0
-<DD>Inserts <CODE>(array-ref <VAR>array1</VAR> (+ -1 <VAR>j</VAR>))</CODE> into the sequence.
-<DT><VAR>k</VAR> &lt; 0
-<DD>Deletes <CODE>(array-ref <VAR>array2</VAR> (- -1 <VAR>k</VAR>))</CODE> from the sequence.
-</DL>
-</DL>
-<P>
-
-<A NAME="IDX1383"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>diff:edit-length</B> <I>array1 array2 =? p-lim</I>
-<DD><P>
-
-<A NAME="IDX1384"></A>
-<DT><U>Function:</U> <B>diff:edit-length</B> <I>array1 array2 =?</I>
-<DD><VAR>array1</VAR> and <VAR>array2</VAR> are one-dimensional arrays. The procedure <VAR>=?</VAR> is used
-to compare sequence tokens for equality.
-</P>
-<P>
-
-The non-negative integer <VAR>p-lim</VAR>, if provided, is maximum number of
-deletions of the shorter sequence to allow. <CODE>diff:edit-length</CODE> will return <CODE>#f</CODE>
-if more deletions would be necessary.
-</P>
-<P>
-
-<CODE>diff:edit-length</CODE> returns the length of the shortest sequence of edits transformaing
-<VAR>array1</VAR> to <VAR>array2</VAR>.
-</P>
-</DL>
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(diff:longest-common-subsequence &quot;fghiejcklm&quot; &quot;fgehijkpqrlm&quot; eqv?)
-=> &quot;fghijklm&quot;
-
-(diff:edit-length &quot;fghiejcklm&quot; &quot;fgehijkpqrlm&quot; eqv?)
-=> 6
-
-(diff:edits &quot;fghiejcklm&quot; &quot;fgehijkpqrlm&quot; eqv?)
-=> #As32(3 -5 -7 8 9 10)
- ; e c h p q r
-</pre></td></tr></table><P>
-
-<A NAME="Procedures"></A>
-<HR SIZE="6">
-<A NAME="SEC225"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC224"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC226"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 7.3 Procedures </H2>
-<!--docid::SEC225::-->
-<P>
-
-Anything that doesn't fall neatly into any of the other categories winds
-up here.
-</P>
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'coerce</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'string-case</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC228">7.3.3 String Ports</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'string-port</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'line-i/o</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'process</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC231">7.3.6 Metric Units</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Portable manifest types for numeric values.</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Type Coercion"></A>
-<HR SIZE="6">
-<A NAME="SEC226"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC227"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.3.1 Type Coercion </H3>
-<!--docid::SEC226::-->
-<CODE>(require 'coerce)</CODE>
-<A NAME="IDX1385"></A>
-<P>
-
-<A NAME="IDX1386"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>type-of</B> <I>obj</I>
-<DD><P>
-
-Returns a symbol name for the type of <VAR>obj</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1387"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>coerce</B> <I>obj result-type</I>
-<DD><P>
-
-Converts and returns <VAR>obj</VAR> of type <CODE>char</CODE>, <CODE>number</CODE>,
-<CODE>string</CODE>, <CODE>symbol</CODE>, <CODE>list</CODE>, or <CODE>vector</CODE> to
-<VAR>result-type</VAR> (which must be one of these symbols).
-</P>
-</DL>
-<P>
-
-<A NAME="String-Case"></A>
-<HR SIZE="6">
-<A NAME="SEC227"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC226"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC228"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.3.2 String-Case </H3>
-<!--docid::SEC227::-->
-<P>
-
-<CODE>(require 'string-case)</CODE>
-<A NAME="IDX1388"></A>
-</P>
-<P>
-
-<A NAME="IDX1389"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>string-upcase</B> <I>str</I>
-<DD><A NAME="IDX1390"></A>
-<DT><U>Procedure:</U> <B>string-downcase</B> <I>str</I>
-<DD><A NAME="IDX1391"></A>
-<DT><U>Procedure:</U> <B>string-capitalize</B> <I>str</I>
-<DD>The obvious string conversion routines. These are non-destructive.
-</DL>
-<P>
-
-<A NAME="IDX1392"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>string-upcase!</B> <I>str</I>
-<DD><A NAME="IDX1393"></A>
-<DT><U>Function:</U> <B>string-downcase!</B> <I>str</I>
-<DD><A NAME="IDX1394"></A>
-<DT><U>Function:</U> <B>string-capitalize!</B> <I>str</I>
-<DD>The destructive versions of the functions above.
-</DL>
-<P>
-
-<A NAME="IDX1395"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>string-ci-&gt;symbol</B> <I>str</I>
-<DD>Converts string <VAR>str</VAR> to a symbol having the same case as if the
-symbol had been <CODE>read</CODE>.
-</DL>
-<P>
-
-<A NAME="IDX1396"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>symbol-append</B> <I>obj1 <small>...</small></I>
-<DD>Converts <VAR>obj1</VAR> <small>...</small> to strings, appends them, and converts to a
-symbol which is returned. Strings and numbers are converted to read's
-symbol case; the case of symbol characters is not changed. #f is
-converted to the empty string (symbol).
-</DL>
-<P>
-
-<A NAME="IDX1397"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>StudlyCapsExpand</B> <I>str delimiter</I>
-<DD><A NAME="IDX1398"></A>
-<DT><U>Function:</U> <B>StudlyCapsExpand</B> <I>str</I>
-<DD><VAR>delimiter</VAR> must be a string or character. If absent,
-<VAR>delimiter</VAR> defaults to `<SAMP>-</SAMP>'. <CODE>StudlyCapsExpand</CODE> returns a
-copy of <VAR>str</VAR> where <VAR>delimiter</VAR> is inserted between each
-lower-case character immediately followed by an upper-case character;
-and between two upper-case characters immediately followed by a
-lower-case character.
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(StudlyCapsExpand &quot;aX&quot; &quot; &quot;) => &quot;a X&quot;
-(StudlyCapsExpand &quot;aX&quot; &quot;..&quot;) => &quot;a..X&quot;
-(StudlyCapsExpand &quot;AX&quot;) => &quot;AX&quot;
-(StudlyCapsExpand &quot;Ax&quot;) => &quot;Ax&quot;
-(StudlyCapsExpand &quot;AXLE&quot;) => &quot;AXLE&quot;
-(StudlyCapsExpand &quot;aAXACz&quot;) => &quot;a-AXA-Cz&quot;
-(StudlyCapsExpand &quot;AaXACz&quot;) => &quot;Aa-XA-Cz&quot;
-(StudlyCapsExpand &quot;AAaXACz&quot;) => &quot;A-Aa-XA-Cz&quot;
-(StudlyCapsExpand &quot;AAaXAC&quot;) => &quot;A-Aa-XAC&quot;
-</pre></td></tr></table><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="String Ports"></A>
-<HR SIZE="6">
-<A NAME="SEC228"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC227"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC229"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.3.3 String Ports </H3>
-<!--docid::SEC228::-->
-<P>
-
-<CODE>(require 'string-port)</CODE>
-<A NAME="IDX1399"></A>
-</P>
-<P>
-
-<A NAME="IDX1400"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>call-with-output-string</B> <I>proc</I>
-<DD><VAR>proc</VAR> must be a procedure of one argument. This procedure calls
-<VAR>proc</VAR> with one argument: a (newly created) output port. When the
-function returns, the string composed of the characters written into the
-port is returned.
-</DL>
-<P>
-
-<A NAME="IDX1401"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>call-with-input-string</B> <I>string proc</I>
-<DD><VAR>proc</VAR> must be a procedure of one argument. This procedure calls
-<VAR>proc</VAR> with one argument: an (newly created) input port from which
-<VAR>string</VAR>'s contents may be read. When <VAR>proc</VAR> returns, the port
-is closed and the value yielded by the procedure <VAR>proc</VAR> is
-returned.
-</DL>
-<P>
-
-<A NAME="Line I/O"></A>
-<HR SIZE="6">
-<A NAME="SEC229"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC228"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC230"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.3.4 Line I/O </H3>
-<!--docid::SEC229::-->
-<P>
-
-<CODE>(require 'line-i/o)</CODE>
-<A NAME="IDX1402"></A>
-</P>
-<P>
-
-<A NAME="IDX1403"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>read-line</B>
-<DD><P>
-
-<A NAME="IDX1404"></A>
-<DT><U>Function:</U> <B>read-line</B> <I>port</I>
-<DD>Returns a string of the characters up to, but not including a
-newline or end of file, updating <VAR>port</VAR> to point to the
-character following the newline. If no characters are available, an
-end of file object is returned. The <VAR>port</VAR> argument may be
-omitted, in which case it defaults to the value returned by
-<CODE>current-input-port</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1405"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>read-line!</B> <I>string</I>
-<DD><P>
-
-<A NAME="IDX1406"></A>
-<DT><U>Procedure:</U> <B>read-line!</B> <I>string port</I>
-<DD>Fills <VAR>string</VAR> with characters up to, but not including a newline or end
-of file, updating the <VAR>port</VAR> to point to the last character read
-or following the newline if it was read. If no characters are
-available, an end of file object is returned. If a newline or end
-of file was found, the number of characters read is returned.
-Otherwise, <CODE>#f</CODE> is returned. The <VAR>port</VAR> argument may be
-omitted, in which case it defaults to the value returned by
-<CODE>current-input-port</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1407"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>write-line</B> <I>string</I>
-<DD><P>
-
-<A NAME="IDX1408"></A>
-<DT><U>Function:</U> <B>write-line</B> <I>string port</I>
-<DD>Writes <VAR>string</VAR> followed by a newline to the given <VAR>port</VAR> and returns
-an unspecified value. The <VAR>Port</VAR> argument may be omitted, in
-which case it defaults to the value returned by
-<CODE>current-input-port</CODE>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1409"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>system-&gt;line</B> <I>command tmp</I>
-<DD><P>
-
-<A NAME="IDX1410"></A>
-<DT><U>Function:</U> <B>system-&gt;line</B> <I>command</I>
-<DD><VAR>command</VAR> must be a string. The string <VAR>tmp</VAR>, if supplied, is a path to use as
-a temporary file. <CODE>system-&gt;line</CODE> calls <CODE>system</CODE> with <VAR>command</VAR> as argument,
-redirecting stdout to file <VAR>tmp</VAR>. <CODE>system-&gt;line</CODE> returns a string containing the
-first line of output from <VAR>tmp</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="Multi-Processing"></A>
-<HR SIZE="6">
-<A NAME="SEC230"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC229"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC231"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.3.5 Multi-Processing </H3>
-<!--docid::SEC230::-->
-<P>
-
-<CODE>(require 'process)</CODE>
-<A NAME="IDX1411"></A>
-</P>
-<P>
-
-This module implements asynchronous (non-polled) time-sliced
-multi-processing in the SCM Scheme implementation using procedures
-<CODE>alarm</CODE> and <CODE>alarm-interrupt</CODE>.
-<A NAME="IDX1412"></A>
-<A NAME="IDX1413"></A>
-Until this is ported to another implementation, consider it an example
-of writing schedulers in Scheme.
-</P>
-<P>
-
-<A NAME="IDX1414"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>add-process!</B> <I>proc</I>
-<DD>Adds proc, which must be a procedure (or continuation) capable of
-accepting accepting one argument, to the <CODE>process:queue</CODE>. The
-value returned is unspecified. The argument to <VAR>proc</VAR> should be
-ignored. If <VAR>proc</VAR> returns, the process is killed.
-</DL>
-<P>
-
-<A NAME="IDX1415"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>process:schedule!</B>
-<DD>Saves the current process on <CODE>process:queue</CODE> and runs the next
-process from <CODE>process:queue</CODE>. The value returned is
-unspecified.
-</DL>
-<P>
-
-<A NAME="IDX1416"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>kill-process!</B>
-<DD>Kills the current process and runs the next process from
-<CODE>process:queue</CODE>. If there are no more processes on
-<CODE>process:queue</CODE>, <CODE>(slib:exit)</CODE> is called (see section <A HREF="slib_2.html#SEC17">2.4 System</A>).
-</DL>
-<P>
-
-<A NAME="Metric Units"></A>
-<HR SIZE="6">
-<A NAME="SEC231"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC230"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC232"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.3.6 Metric Units </H3>
-<!--docid::SEC231::-->
-<P>
-
-<CODE>(require 'metric-units)</CODE>
-<A NAME="IDX1417"></A>
-</P>
-<P>
-
-<A HREF="http://swissnet.ai.mit.edu/~jaffer/MIXF.html">http://swissnet.ai.mit.edu/~jaffer/MIXF.html</A>
-</P>
-<P>
-
-<EM>Metric Interchange Format</EM> is a character string encoding for
-numerical values and units which:
-</P>
-<P>
-
-<UL>
-<LI>
-is unambiguous in all locales;
-<P>
-
-</P>
-<LI>
-uses only [TOG] &quot;Portable Character Set&quot; characters matching &quot;Basic
-Latin&quot; characters in Plane 0 of the Universal Character Set [UCS];
-<P>
-
-</P>
-<LI>
-is transparent to [UTF-7] and [UTF-8] UCS transformation formats;
-<P>
-
-</P>
-<LI>
-is human readable and writable;
-<P>
-
-</P>
-<LI>
-is machine readable and writable;
-<P>
-
-</P>
-<LI>
-incorporates SI prefixes and units;
-<P>
-
-</P>
-<LI>
-incorporates [ISO 6093] numbers; and
-<P>
-
-</P>
-<LI>
-incorporates [IEC 60027-2] binary prefixes.
-</UL>
-<P>
-
-In the expression for the value of a quantity, the unit symbol is placed
-after the numerical value. A dot (PERIOD, `<SAMP>.</SAMP>') is placed between
-the numerical value and the unit symbol.
-</P>
-<P>
-
-Within a compound unit, each of the base and derived symbols can
-optionally have an attached SI prefix.
-</P>
-<P>
-
-Unit symbols formed from other unit symbols by multiplication are
-indicated by means of a dot (PERIOD, `<SAMP>.</SAMP>') placed between them.
-</P>
-<P>
-
-Unit symbols formed from other unit symbols by division are indicated by
-means of a SOLIDUS (`<SAMP>/</SAMP>') or negative exponents. The SOLIDUS must
-not be repeated in the same compound unit unless contained within a
-parenthesized subexpression.
-</P>
-<P>
-
-The grouping formed by a prefix symbol attached to a unit symbol
-constitutes a new inseparable symbol (forming a multiple or submultiple
-of the unit concerned) which can be raised to a positive or negative
-power and which can be combined with other unit symbols to form compound
-unit symbols.
-</P>
-<P>
-
-The grouping formed by surrounding compound unit symbols with
-parentheses (`<SAMP>(</SAMP>' and `<SAMP>)</SAMP>') constitutes a new inseparable symbol
-which can be raised to a positive or negative power and which can be
-combined with other unit symbols to form compound unit symbols.
-</P>
-<P>
-
-Compound prefix symbols, that is, prefix symbols formed by the
-juxtaposition of two or more prefix symbols, are not permitted.
-</P>
-<P>
-
-Prefix symbols are not used with the time-related unit symbols min
-(minute), h (hour), d (day). No prefix symbol may be used with dB
-(decibel). Only submultiple prefix symbols may be used with the unit
-symbols L (liter), Np (neper), o (degree), oC (degree Celsius), rad
-(radian), and sr (steradian). Submultiple prefix symbols may not be
-used with the unit symbols t (metric ton), r (revolution), or Bd (baud).
-</P>
-<P>
-
-A unit exponent follows the unit, separated by a CIRCUMFLEX (`<SAMP>^</SAMP>').
-Exponents may be positive or negative. Fractional exponents must be
-parenthesized.
-</P>
-<P>
-
-<HR SIZE="6">
-<A NAME="SEC232"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC231"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC233"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.3.6.1 SI Prefixes </H4>
-<!--docid::SEC232::-->
-<TABLE><tr><td>&nbsp;</td><td class=example><pre> Factor Name Symbol | Factor Name Symbol
- ====== ==== ====== | ====== ==== ======
- 1e24 yotta Y | 1e-1 deci d
- 1e21 zetta Z | 1e-2 centi c
- 1e18 exa E | 1e-3 milli m
- 1e15 peta P | 1e-6 micro u
- 1e12 tera T | 1e-9 nano n
- 1e9 giga G | 1e-12 pico p
- 1e6 mega M | 1e-15 femto f
- 1e3 kilo k | 1e-18 atto a
- 1e2 hecto h | 1e-21 zepto z
- 1e1 deka da | 1e-24 yocto y
-</pre></td></tr></table><P>
-
-<HR SIZE="6">
-<A NAME="SEC233"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC232"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC234"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.3.6.2 Binary Prefixes </H4>
-<!--docid::SEC233::-->
-<P>
-
-These binary prefixes are valid only with the units B (byte) and bit.
-However, decimal prefixes can also be used with bit; and decimal
-multiple (not submultiple) prefixes can also be used with B (byte).
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre> Factor (power-of-2) Name Symbol
- ====== ============ ==== ======
- 1.152921504606846976e18 (2^60) exbi Ei
- 1.125899906842624e15 (2^50) pebi Pi
- 1.099511627776e12 (2^40) tebi Ti
- 1.073741824e9 (2^30) gibi Gi
- 1.048576e6 (2^20) mebi Mi
- 1.024e3 (2^10) kibi Ki
-</pre></td></tr></table><P>
-
-<HR SIZE="6">
-<A NAME="SEC234"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC233"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.3.6.3 Unit Symbols </H4>
-<!--docid::SEC234::-->
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre> Type of Quantity Name Symbol Equivalent
- ================ ==== ====== ==========
-time second s
-time minute min = 60.s
-time hour h = 60.min
-time day d = 24.h
-frequency hertz Hz s^-1
-signaling rate baud Bd s^-1
-length meter m
-volume liter L dm^3
-plane angle radian rad
-solid angle steradian sr rad^2
-plane angle revolution * r = 6.283185307179586.rad
-plane angle degree * o = 2.777777777777778e-3.r
-information capacity bit bit
-information capacity byte, octet B = 8.bit
-mass gram g
-mass ton t Mg
-mass unified atomic mass unit u = 1.66053873e-27.kg
-amount of substance mole mol
-catalytic activity katal kat mol/s
-thermodynamic temperature kelvin K
-centigrade temperature degree Celsius oC
-luminous intensity candela cd
-luminous flux lumen lm cd.sr
-illuminance lux lx lm/m^2
-force newton N m.kg.s^-2
-pressure, stress pascal Pa N/m^2
-energy, work, heat joule J N.m
-energy electronvolt eV = 1.602176462e-19.J
-power, radiant flux watt W J/s
-logarithm of power ratio neper Np
-logarithm of power ratio decibel * dB = 0.1151293.Np
-electric current ampere A
-electric charge coulomb C s.A
-electric potential, EMF volt V W/A
-capacitance farad F C/V
-electric resistance ohm Ohm V/A
-electric conductance siemens S A/V
-magnetic flux weber Wb V.s
-magnetic flux density tesla T Wb/m^2
-inductance henry H Wb/A
-radionuclide activity becquerel Bq s^-1
-absorbed dose energy gray Gy m^2.s^-2
-dose equivalent sievert Sv m^2.s^-2
-</pre></td></tr></table><P>
-
-* The formulas are:
-</P>
-<P>
-
-<UL>
-<LI>
-r/rad = 8 * atan(1)
-<LI>
-o/r = 1 / 360
-<LI>
-db/Np = ln(10) / 20
-</UL>
-<P>
-
-<A NAME="IDX1418"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>si:conversion-factor</B> <I>to-unit from-unit</I>
-<DD>If the strings <VAR>from-unit</VAR> and <VAR>to-unit</VAR> express valid unit
-expressions for quantities of the same unit-dimensions, then the value
-returned by <CODE>si:conversion-factor</CODE> will be such that multiplying a
-numerical value expressed in <VAR>from-unit</VAR>s by the returned conversion
-factor yields the numerical value expressed in <VAR>to-unit</VAR>s.
-<P>
-
-Otherwise, <CODE>si:conversion-factor</CODE> returns:
-</P>
-<P>
-
-</P>
-<DL COMPACT>
-<DT>-3
-<DD>if neither <VAR>from-unit</VAR> nor <VAR>to-unit</VAR> is a syntactically valid
-unit.
-<DT>-2
-<DD>if <VAR>from-unit</VAR> is not a syntactically valid unit.
-<DT>-1
-<DD>if <VAR>to-unit</VAR> is not a syntactically valid unit.
-<DT>0
-<DD>if linear conversion (by a factor) is not possible.
-</DL>
-<P>
-
-</P>
-</DL>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(si:conversion-factor &quot;km/s&quot; &quot;m/s&quot; ) => 0.001
-(si:conversion-factor &quot;N&quot; &quot;m/s&quot; ) => 0
-(si:conversion-factor &quot;moC&quot; &quot;oC&quot; ) => 1000
-(si:conversion-factor &quot;mK&quot; &quot;oC&quot; ) => 0
-(si:conversion-factor &quot;rad&quot; &quot;o&quot; ) => 0.0174533
-(si:conversion-factor &quot;K&quot; &quot;o&quot; ) => 0
-(si:conversion-factor &quot;K&quot; &quot;K&quot; ) => 1
-(si:conversion-factor &quot;oK&quot; &quot;oK&quot; ) => -3
-(si:conversion-factor &quot;&quot; &quot;s/s&quot; ) => 1
-(si:conversion-factor &quot;km/h&quot; &quot;mph&quot; ) => -2
-</pre></td></tr></table><P>
-
-<A NAME="Standards Support"></A>
-<HR SIZE="6">
-<A NAME="SEC235"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC234"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC236"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 7.4 Standards Support </H2>
-<!--docid::SEC235::-->
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Revised Reports on Scheme</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC237">7.4.2 With-File</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'with-file</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC238">7.4.3 Transcripts</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'transcript</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'rev2-procedures</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'rev4-optional-procedures</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'multiarg/and-</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC242">7.4.7 Multi-argument Apply</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'multiarg-apply</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'rationalize</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'delay</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC245">7.4.10 Dynamic-Wind</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'dynamic-wind</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'eval</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC247">7.4.12 Values</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'values</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC248">7.4.13 SRFI</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'http://srfi.schemers.org/srfi-0/srfi-0.html</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="RnRS"></A>
-<HR SIZE="6">
-<A NAME="SEC236"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC237"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.1 RnRS </H3>
-<!--docid::SEC236::-->
-<P>
-
-The <CODE>r2rs</CODE>, <CODE>r3rs</CODE>, <CODE>r4rs</CODE>, and <CODE>r5rs</CODE> features
-attempt to provide procedures and macros to bring a Scheme
-implementation to the desired version of Scheme.
-</P>
-<P>
-
-<A NAME="IDX1419"></A>
-</P>
-<DL>
-<DT><U>Feature:</U> <B>r2rs</B>
-<DD><A NAME="IDX1420"></A>
-Requires features implementing procedures and optional procedures
-specified by <CITE>Revised^2 Report on the Algorithmic Language Scheme</CITE>;
-namely <CODE>rev3-procedures</CODE> and <CODE>rev2-procedures</CODE>.
-</DL>
-<P>
-
-<A NAME="IDX1421"></A>
-</P>
-<DL>
-<DT><U>Feature:</U> <B>r3rs</B>
-<DD><A NAME="IDX1422"></A>
-Requires features implementing procedures and optional procedures
-specified by <CITE>Revised^3 Report on the Algorithmic Language Scheme</CITE>;
-namely <CODE>rev3-procedures</CODE>.
-<P>
-
-<EM>Note:</EM> SLIB already mandates the <CODE>r3rs</CODE> procedures which can
-be portably implemented in <CODE>r4rs</CODE> implementations.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1423"></A>
-</P>
-<DL>
-<DT><U>Feature:</U> <B>r4rs</B>
-<DD><A NAME="IDX1424"></A>
-Requires features implementing procedures and optional procedures
-specified by <CITE>Revised^4 Report on the Algorithmic Language Scheme</CITE>;
-namely <CODE>rev4-optional-procedures</CODE>.
-</DL>
-<P>
-
-<A NAME="IDX1425"></A>
-</P>
-<DL>
-<DT><U>Feature:</U> <B>r5rs</B>
-<DD><A NAME="IDX1426"></A>
-Requires features implementing procedures and optional procedures
-specified by <CITE>Revised^5 Report on the Algorithmic Language Scheme</CITE>;
-namely <CODE>values</CODE>, <CODE>macro</CODE>, and <CODE>eval</CODE>.
-</DL>
-<P>
-
-<A NAME="With-File"></A>
-<HR SIZE="6">
-<A NAME="SEC237"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC236"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC238"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.2 With-File </H3>
-<!--docid::SEC237::-->
-<P>
-
-<CODE>(require 'with-file)</CODE>
-<A NAME="IDX1427"></A>
-</P>
-<P>
-
-<A NAME="IDX1428"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>with-input-from-file</B> <I>file thunk</I>
-<DD><A NAME="IDX1429"></A>
-<DT><U>Function:</U> <B>with-output-to-file</B> <I>file thunk</I>
-<DD>Description found in R4RS.
-</DL>
-<P>
-
-<A NAME="Transcripts"></A>
-<HR SIZE="6">
-<A NAME="SEC238"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC237"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC239"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.3 Transcripts </H3>
-<!--docid::SEC238::-->
-<P>
-
-<CODE>(require 'transcript)</CODE>
-<A NAME="IDX1430"></A>
-</P>
-<P>
-
-<A NAME="IDX1431"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>transcript-on</B> <I>filename</I>
-<DD><A NAME="IDX1432"></A>
-<DT><U>Function:</U> <B>transcript-off</B> <I>filename</I>
-<DD>Redefines <CODE>read-char</CODE>, <CODE>read</CODE>, <CODE>write-char</CODE>,
-<CODE>write</CODE>, <CODE>display</CODE>, and <CODE>newline</CODE>.
-</DL>
-<P>
-
-<A NAME="Rev2 Procedures"></A>
-<HR SIZE="6">
-<A NAME="SEC239"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC238"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC240"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.4 Rev2 Procedures </H3>
-<!--docid::SEC239::-->
-<P>
-
-<CODE>(require 'rev2-procedures)</CODE>
-<A NAME="IDX1433"></A>
-</P>
-<P>
-
-The procedures below were specified in the <CITE>Revised^2 Report on
-Scheme</CITE>. <STRONG>N.B.</STRONG>: The symbols <CODE>1+</CODE> and <CODE>-1+</CODE> are not
-<CITE>R4RS</CITE> syntax. Scheme-&gt;C, for instance, chokes on this
-module.
-</P>
-<P>
-
-<A NAME="IDX1434"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>substring-move-left!</B> <I>string1 start1 end1 string2 start2</I>
-<DD><A NAME="IDX1435"></A>
-<DT><U>Procedure:</U> <B>substring-move-right!</B> <I>string1 start1 end1 string2 start2</I>
-<DD><VAR>string1</VAR> and <VAR>string2</VAR> must be a strings, and <VAR>start1</VAR>,
-<VAR>start2</VAR> and <VAR>end1</VAR> must be exact integers satisfying
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">0 &lt;= <VAR>start1</VAR> &lt;= <VAR>end1</VAR> &lt;= (string-length <VAR>string1</VAR>)
-0 &lt;= <VAR>start2</VAR> &lt;= <VAR>end1</VAR> - <VAR>start1</VAR> + <VAR>start2</VAR> &lt;= (string-length <VAR>string2</VAR>)
-</pre></td></tr></table><P>
-
-<CODE>substring-move-left!</CODE> and <CODE>substring-move-right!</CODE> store
-characters of <VAR>string1</VAR> beginning with index <VAR>start1</VAR>
-(inclusive) and ending with index <VAR>end1</VAR> (exclusive) into
-<VAR>string2</VAR> beginning with index <VAR>start2</VAR> (inclusive).
-</P>
-<P>
-
-<CODE>substring-move-left!</CODE> stores characters in time order of
-increasing indices. <CODE>substring-move-right!</CODE> stores characters in
-time order of increasing indeces.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1436"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>substring-fill!</B> <I>string start end char</I>
-<DD>Fills the elements <VAR>start</VAR>--<VAR>end</VAR> of <VAR>string</VAR> with the
-character <VAR>char</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1437"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>string-null?</B> <I>str</I>
-<DD>== <CODE>(= 0 (string-length <VAR>str</VAR>))</CODE>
-</DL>
-<P>
-
-<A NAME="IDX1438"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>append!</B> <I>pair1 <small>...</small></I>
-<DD>Destructively appends its arguments. Equivalent to <CODE>nconc</CODE>.
-</DL>
-<P>
-
-<A NAME="IDX1439"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>1+</B> <I>n</I>
-<DD>Adds 1 to <VAR>n</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1440"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>-1+</B> <I>n</I>
-<DD>Subtracts 1 from <VAR>n</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1441"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>&lt;?</B>
-<DD><A NAME="IDX1442"></A>
-<DT><U>Function:</U> <B>&lt;=?</B>
-<DD><A NAME="IDX1443"></A>
-<DT><U>Function:</U> <B>=?</B>
-<DD><A NAME="IDX1444"></A>
-<DT><U>Function:</U> <B>&gt;?</B>
-<DD><A NAME="IDX1445"></A>
-<DT><U>Function:</U> <B>&gt;=?</B>
-<DD>These are equivalent to the procedures of the same name but without the
-trailing `<SAMP>?</SAMP>'.
-</DL>
-<P>
-
-<A NAME="Rev4 Optional Procedures"></A>
-<HR SIZE="6">
-<A NAME="SEC240"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC239"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC241"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.5 Rev4 Optional Procedures </H3>
-<!--docid::SEC240::-->
-<P>
-
-<CODE>(require 'rev4-optional-procedures)</CODE>
-<A NAME="IDX1446"></A>
-</P>
-<P>
-
-For the specification of these optional procedures,
-See section `Standard procedures' in <CITE>Revised(4) Scheme</CITE>.
-</P>
-<P>
-
-<A NAME="IDX1447"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list-tail</B> <I>l p</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX1448"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>string-&gt;list</B> <I>s</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX1449"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list-&gt;string</B> <I>l</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX1450"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>string-copy</B>
-<DD></DL>
-<P>
-
-<A NAME="IDX1451"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>string-fill!</B> <I>s obj</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX1452"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list-&gt;vector</B> <I>l</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX1453"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>vector-&gt;list</B> <I>s</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX1454"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>vector-fill!</B> <I>s obj</I>
-<DD></DL>
-<P>
-
-<A NAME="Multi-argument / and -"></A>
-<HR SIZE="6">
-<A NAME="SEC241"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC240"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC242"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.6 Multi-argument / and - </H3>
-<!--docid::SEC241::-->
-<P>
-
-<CODE>(require 'multiarg/and-)</CODE>
-<A NAME="IDX1455"></A>
-</P>
-<P>
-
-For the specification of these optional forms, See section `Numerical operations' in <CITE>Revised(4) Scheme</CITE>.
-</P>
-<P>
-
-<A NAME="IDX1456"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>/</B> <I>dividend divisor1 <small>...</small></I>
-<DD></DL>
-<P>
-
-<A NAME="IDX1457"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>-</B> <I>minuend subtrahend1 <small>...</small></I>
-<DD></DL>
-<P>
-
-<A NAME="Multi-argument Apply"></A>
-<HR SIZE="6">
-<A NAME="SEC242"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC241"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC243"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.7 Multi-argument Apply </H3>
-<!--docid::SEC242::-->
-<P>
-
-<CODE>(require 'multiarg-apply)</CODE>
-<A NAME="IDX1458"></A>
-</P>
-<P>
-
-For the specification of this optional form,
-See section `Control features' in <CITE>Revised(4) Scheme</CITE>.
-</P>
-<P>
-
-<A NAME="IDX1459"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>apply</B> <I>proc arg1 <small>...</small></I>
-<DD></DL>
-<P>
-
-<A NAME="Rationalize"></A>
-<HR SIZE="6">
-<A NAME="SEC243"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC242"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC244"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.8 Rationalize </H3>
-<!--docid::SEC243::-->
-<P>
-
-<CODE>(require 'rationalize)</CODE>
-<A NAME="IDX1460"></A>
-</P>
-<P>
-
-<A NAME="IDX1461"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>rationalize</B> <I>x e</I>
-<DD><P>
-
-Computes the correct result for exact arguments (provided the
-implementation supports exact rational numbers of unlimited precision);
-and produces a reasonable answer for inexact arguments when inexact
-arithmetic is implemented using floating-point.
-</P>
-<P>
-
-</P>
-</DL>
-<CODE>Rationalize</CODE> has limited use in implementations lacking exact
-(non-integer) rational numbers. The following procedures return a list
-of the numerator and denominator.
-<P>
-
-<A NAME="IDX1462"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>find-ratio</B> <I>x e</I>
-<DD><P>
-
-<CODE>find-ratio</CODE> returns the list of the <EM>simplest</EM>
-numerator and denominator whose quotient differs from <VAR>x</VAR> by no more
-than <VAR>e</VAR>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"><TT>(find-ratio 3/97 .0001) => (3 97)
-(find-ratio 3/97 .001) => (1 32)
-</TT>
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1463"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>find-ratio-between</B> <I>x y</I>
-<DD><P>
-
-<CODE>find-ratio-between</CODE> returns the list of the <EM>simplest</EM>
-numerator and denominator between <VAR>x</VAR> and <VAR>y</VAR>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"><TT>(find-ratio-between 2/7 3/5) => (1 2)
-(find-ratio-between -3/5 -2/7) => (-1 2)
-</TT>
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Promises"></A>
-<HR SIZE="6">
-<A NAME="SEC244"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC243"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC245"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.9 Promises </H3>
-<!--docid::SEC244::-->
-<P>
-
-<CODE>(require 'promise)</CODE>
-<A NAME="IDX1464"></A>
-</P>
-<P>
-
-<A NAME="IDX1465"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-promise</B> <I>proc</I>
-<DD></DL>
-<P>
-
-<A NAME="IDX1466"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>force</B> <I>promise</I>
-<DD></DL>
-<P>
-
-<CODE>(require 'delay)</CODE> provides <CODE>force</CODE> and <CODE>delay</CODE>:
-</P>
-<P>
-
-<A NAME="IDX1467"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>delay</B> <I>obj</I>
-<DD>Change occurrences of <CODE>(delay <VAR>expression</VAR>)</CODE> to
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(make-promise (lambda () <VAR>expression</VAR>))
-</pre></td></tr></table><P>
-
-</P>
-</DL>
-<P>
-
-(see section `Control features' in <CITE>Revised(4) Scheme</CITE>).
-</P>
-<P>
-
-<A NAME="Dynamic-Wind"></A>
-<HR SIZE="6">
-<A NAME="SEC245"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC244"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC246"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.10 Dynamic-Wind </H3>
-<!--docid::SEC245::-->
-<P>
-
-<CODE>(require 'dynamic-wind)</CODE>
-<A NAME="IDX1468"></A>
-</P>
-<P>
-
-This facility is a generalization of Common LISP <CODE>unwind-protect</CODE>,
-designed to take into account the fact that continuations produced by
-<CODE>call-with-current-continuation</CODE> may be reentered.
-</P>
-<P>
-
-<A NAME="IDX1469"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>dynamic-wind</B> <I>thunk1 thunk2 thunk3</I>
-<DD>The arguments <VAR>thunk1</VAR>, <VAR>thunk2</VAR>, and <VAR>thunk3</VAR> must all be
-procedures of no arguments (thunks).
-<P>
-
-<CODE>dynamic-wind</CODE> calls <VAR>thunk1</VAR>, <VAR>thunk2</VAR>, and then
-<VAR>thunk3</VAR>. The value returned by <VAR>thunk2</VAR> is returned as the
-result of <CODE>dynamic-wind</CODE>. <VAR>thunk3</VAR> is also called just before
-control leaves the dynamic context of <VAR>thunk2</VAR> by calling a
-continuation created outside that context. Furthermore, <VAR>thunk1</VAR> is
-called before reentering the dynamic context of <VAR>thunk2</VAR> by calling
-a continuation created inside that context. (Control is inside the
-context of <VAR>thunk2</VAR> if <VAR>thunk2</VAR> is on the current return stack).
-</P>
-<P>
-
-<STRONG>Warning:</STRONG> There is no provision for dealing with errors or
-interrupts. If an error or interrupt occurs while using
-<CODE>dynamic-wind</CODE>, the dynamic environment will be that in effect at
-the time of the error or interrupt.
-</P>
-</DL>
-<P>
-
-<A NAME="Eval"></A>
-<HR SIZE="6">
-<A NAME="SEC246"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC245"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC247"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.11 Eval </H3>
-<!--docid::SEC246::-->
-<P>
-
-<CODE>(require 'eval)</CODE>
-<A NAME="IDX1470"></A>
-</P>
-<P>
-
-<A NAME="IDX1471"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>eval</B> <I>expression environment-specifier</I>
-<DD><P>
-
-Evaluates <VAR>expression</VAR> in the specified environment and returns its
-value. <VAR>Expression</VAR> must be a valid Scheme expression represented
-as data, and <VAR>environment-specifier</VAR> must be a value returned by one
-of the three procedures described below. Implementations may extend
-<CODE>eval</CODE> to allow non-expression programs (definitions) as the first
-argument and to allow other values as environments, with the restriction
-that <CODE>eval</CODE> is not allowed to create new bindings in the
-environments associated with <CODE>null-environment</CODE> or
-<CODE>scheme-report-environment</CODE>.
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(eval '(* 7 3) (scheme-report-environment 5))
- => 21
-
-(let ((f (eval '(lambda (f x) (f x x))
- (null-environment))))
- (f + 10))
- => 20
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1472"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>scheme-report-environment</B> <I>version</I>
-<DD><A NAME="IDX1473"></A>
-<DT><U>Function:</U> <B>null-environment</B> <I>version</I>
-<DD><A NAME="IDX1474"></A>
-<DT><U>Function:</U> <B>null-environment</B>
-<DD><P>
-
-<VAR>Version</VAR> must be an exact non-negative integer <VAR>n</VAR>
-corresponding to a version of one of the Revised^<VAR>n</VAR> Reports on
-Scheme. <CODE>Scheme-report-environment</CODE> returns a specifier for an
-environment that contains the set of bindings specified in the
-corresponding report that the implementation supports.
-<CODE>Null-environment</CODE> returns a specifier for an environment that
-contains only the (syntactic) bindings for all the syntactic keywords
-defined in the given version of the report.
-</P>
-<P>
-
-Not all versions may be available in all implementations at all times.
-However, an implementation that conforms to version <VAR>n</VAR> of the
-Revised^<VAR>n</VAR> Reports on Scheme must accept version <VAR>n</VAR>. An error
-is signalled if the specified version is not available.
-</P>
-<P>
-
-The effect of assigning (through the use of <CODE>eval</CODE>) a variable
-bound in a <CODE>scheme-report-environment</CODE> (for example <CODE>car</CODE>) is
-unspecified. Thus the environments specified by
-<CODE>scheme-report-environment</CODE> may be immutable.
-</P>
-<P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1475"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>interaction-environment</B>
-<DD><P>
-
-This optional procedure returns a specifier for the environment that
-contains implementation-defined bindings, typically a superset of those
-listed in the report. The intent is that this procedure will return the
-environment in which the implementation would evaluate expressions
-dynamically typed by the user.
-</P>
-</DL>
-<P>
-
-Here are some more <CODE>eval</CODE> examples:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'eval)
-=> #&lt;unspecified&gt;
-(define car 'volvo)
-=> #&lt;unspecified&gt;
-car
-=> volvo
-(eval 'car (interaction-environment))
-=> volvo
-(eval 'car (scheme-report-environment 5))
-=> #&lt;primitive-procedure car&gt;
-(eval '(eval 'car (interaction-environment))
- (scheme-report-environment 5))
-=> volvo
-(eval '(eval '(set! car 'buick) (interaction-environment))
- (scheme-report-environment 5))
-=> #&lt;unspecified&gt;
-car
-=> buick
-(eval 'car (scheme-report-environment 5))
-=> #&lt;primitive-procedure car&gt;
-(eval '(eval 'car (interaction-environment))
- (scheme-report-environment 5))
-=> buick
-</pre></td></tr></table><P>
-
-<A NAME="Values"></A>
-<HR SIZE="6">
-<A NAME="SEC247"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC246"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.12 Values </H3>
-<!--docid::SEC247::-->
-<P>
-
-<CODE>(require 'values)</CODE>
-<A NAME="IDX1476"></A>
-</P>
-<P>
-
-<A NAME="IDX1477"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>values</B> <I>obj <small>...</small></I>
-<DD><CODE>values</CODE> takes any number of arguments, and passes (returns) them
-to its continuation.
-</DL>
-<P>
-
-<A NAME="IDX1478"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>call-with-values</B> <I>thunk proc</I>
-<DD><VAR>thunk</VAR> must be a procedure of no arguments, and <VAR>proc</VAR> must be
-a procedure. <CODE>call-with-values</CODE> calls <VAR>thunk</VAR> with a
-continuation that, when passed some values, calls <VAR>proc</VAR> with those
-values as arguments.
-<P>
-
-Except for continuations created by the <CODE>call-with-values</CODE>
-procedure, all continuations take exactly one value, as now; the effect
-of passing no value or more than one value to continuations that were
-not created by the <CODE>call-with-values</CODE> procedure is
-unspecified.
-</P>
-</DL>
-<P>
-
-<A NAME="SRFI"></A>
-<HR SIZE="6">
-<A NAME="SEC248"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC247"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC249"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.4.13 SRFI </H3>
-<!--docid::SEC248::-->
-<P>
-
-<CODE>(require 'srfi)</CODE>
-<A NAME="IDX1479"></A>
-</P>
-<P>
-
-Implements <EM>Scheme Request For Implementation</EM> (SRFI) as
-<A NAME="IDX1480"></A>
-described at <A HREF="http://srfi.schemers.org/">http://srfi.schemers.org/</A>
-</P>
-<P>
-
-The Copyright terms of each SRFI states:
-<BLOCKQUOTE>
-&quot;However, this document itself may not be modified in any way, ...&quot;
-</BLOCKQUOTE>
-<P>
-
-Therefore, the specification of SRFI constructs must not be
-quoted without including the complete SRFI document containing
-discussion and a sample implementation program.
-</P>
-<P>
-
-<A NAME="IDX1481"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>cond-expand</B> <I>&lt;clause1&gt; &lt;clause2&gt; <small>...</small></I>
-<DD><P>
-
-<EM>Syntax:</EM>
-Each &lt;clause&gt; should be of the form
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"><TT>(&lt;feature&gt; &lt;expression1&gt; <small>...</small>)</TT>
-</pre></td></tr></table><P>
-
-where &lt;feature&gt; is a boolean expression composed of symbols and
-`and', `or', and `not' of boolean expressions. The last &lt;clause&gt;
-may be an &quot;else clause,&quot; which has the form
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"><TT>(else &lt;expression1&gt; &lt;expression2&gt; <small>...</small>).</TT>
-</pre></td></tr></table><P>
-
-The first clause whose feature expression is satisfied is expanded.
-If no feature expression is satisfied and there is no else clause, an
-error is signaled.
-</P>
-<P>
-
-SLIB <CODE>cond-expand</CODE> is an extension of SRFI-0,
-<A HREF="http://srfi.schemers.org/srfi-0/srfi-0.html">http://srfi.schemers.org/srfi-0/srfi-0.html</A>.
-</P>
-</DL>
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">list-processing</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC260">7.4.13.2 SRFI-2</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">guarded LET* special form</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC261">7.4.13.3 SRFI-8</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Binding to multiple values</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC262">7.4.13.4 SRFI-9</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Defining Record Types</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="SRFI-1"></A>
-<HR SIZE="6">
-<A NAME="SEC249"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC260"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.4.13.1 SRFI-1 </H4>
-<!--docid::SEC249::-->
-<P>
-
-<CODE>(require 'srfi-1)</CODE>
-<A NAME="IDX1482"></A>
-</P>
-<P>
-
-Implements the <EM>SRFI-1</EM> <EM>list-processing library</EM> as described
-<A NAME="IDX1483"></A>
-<A NAME="IDX1484"></A>
-at <A HREF="http://srfi.schemers.org/srfi-1/srfi-1.html">http://srfi.schemers.org/srfi-1/srfi-1.html</A>
-</P>
-<P>
-
-<A NAME="SEC250"></A>
-<H3> Constructors </H3>
-<!--docid::SEC250::-->
-<P>
-
-<A NAME="IDX1485"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>xcons</B> <I>d a</I>
-<DD><CODE>(define (xcons d a) (cons a d))</CODE>.
-</DL>
-<P>
-
-<A NAME="IDX1486"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list-tabulate</B> <I>len proc</I>
-<DD>Returns a list of length <VAR>len</VAR>. Element <VAR>i</VAR> is <CODE>(<VAR>proc</VAR>
-<VAR>i</VAR>)</CODE> for 0 &lt;= <VAR>i</VAR> &lt; <VAR>len</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1487"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>cons*</B> <I>obj1 obj2</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1488"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list-copy</B> <I>flist</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1489"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>iota</B> <I>count start step</I>
-<DD><P>
-
-<A NAME="IDX1490"></A>
-<DT><U>Function:</U> <B>iota</B> <I>count start</I>
-<DD></P>
-<P>
-
-<A NAME="IDX1491"></A>
-<DT><U>Function:</U> <B>iota</B> <I>count</I>
-<DD>Returns a list of <VAR>count</VAR> numbers: (<VAR>start</VAR>, <VAR>start</VAR>+<VAR>step</VAR>, <small>...</small>, <VAR>start</VAR>+(<VAR>count</VAR>-1)*<VAR>step</VAR>).
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1492"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>circular-list</B> <I>obj1 obj2 <small>...</small></I>
-<DD><P>
-
-Returns a circular list of <VAR>obj1</VAR>, <VAR>obj2</VAR>, <small>...</small>.
-</P>
-</DL>
-<A NAME="SEC251"></A>
-<H3> Predicates </H3>
-<!--docid::SEC251::-->
-<P>
-
-<A NAME="IDX1493"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>proper-list?</B> <I>obj</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1494"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>circular-list?</B> <I>x</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1495"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>dotted-list?</B> <I>obj</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1496"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>null-list?</B> <I>obj</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1497"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>not-pair?</B> <I>obj</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1498"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list=</B> <I>=pred list <small>...</small></I>
-<DD><P>
-
-</P>
-</DL>
-<A NAME="SEC252"></A>
-<H3> Selectors </H3>
-<!--docid::SEC252::-->
-<P>
-
-<A NAME="IDX1499"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>first</B> <I>pair</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1500"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>second</B> <I>pair</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1501"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>third</B> <I>pair</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1502"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>fourth</B> <I>pair</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1503"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>fifth</B> <I>pair</I>
-<DD><A NAME="IDX1504"></A>
-<DT><U>Function:</U> <B>sixth</B> <I>obj</I>
-<DD><A NAME="IDX1505"></A>
-<DT><U>Function:</U> <B>seventh</B> <I>obj</I>
-<DD><A NAME="IDX1506"></A>
-<DT><U>Function:</U> <B>eighth</B> <I>obj</I>
-<DD><A NAME="IDX1507"></A>
-<DT><U>Function:</U> <B>ninth</B> <I>obj</I>
-<DD><A NAME="IDX1508"></A>
-<DT><U>Function:</U> <B>tenth</B> <I>obj</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1509"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>car+cdr</B> <I>pair</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1510"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>drop</B> <I>lst k</I>
-<DD><A NAME="IDX1511"></A>
-<DT><U>Function:</U> <B>take</B> <I>lst k</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1512"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>take!</B> <I>lst k</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1513"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>take-right</B> <I>lst k</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1514"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>drop-right</B> <I>lst k</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1515"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>drop-right!</B> <I>lst k</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1516"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>split-at</B> <I>lst k</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1517"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>split-at!</B> <I>lst k</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1518"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>last</B> <I>lst</I>
-<DD><P>
-
-(car (last-pair lst))
-</P>
-</DL>
-<A NAME="SEC253"></A>
-<H3> Miscellaneous </H3>
-<!--docid::SEC253::-->
-<P>
-
-<A NAME="IDX1519"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>length+</B> <I>obj</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1520"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>concatenate</B> <I>lists</I>
-<DD><A NAME="IDX1521"></A>
-<DT><U>Function:</U> <B>concatenate!</B> <I>lists</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1522"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>reverse!</B> <I>lst</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1523"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>append-reverse</B> <I>rev-head tail</I>
-<DD><A NAME="IDX1524"></A>
-<DT><U>Function:</U> <B>append-reverse!</B> <I>rev-head tail</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1525"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>zip</B> <I>list1 list2 <small>...</small></I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1526"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>unzip1</B> <I>lst</I>
-<DD><A NAME="IDX1527"></A>
-<DT><U>Function:</U> <B>unzip2</B> <I>lst</I>
-<DD><A NAME="IDX1528"></A>
-<DT><U>Function:</U> <B>unzip3</B> <I>lst</I>
-<DD><A NAME="IDX1529"></A>
-<DT><U>Function:</U> <B>unzip4</B> <I>lst</I>
-<DD><A NAME="IDX1530"></A>
-<DT><U>Function:</U> <B>unzip5</B> <I>lst</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1531"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>count</B> <I>pred list1 list2 <small>...</small></I>
-<DD><P>
-
-</P>
-</DL>
-<A NAME="SEC254"></A>
-<H3> Fold and Unfold </H3>
-<!--docid::SEC254::-->
-<P>
-
-<A NAME="IDX1532"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>map!</B> <I>f list1 clist2 <small>...</small></I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1533"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>pair-for-each</B> <I>f clist1 clist2 <small>...</small></I>
-<DD><P>
-
-</P>
-</DL>
-<A NAME="SEC255"></A>
-<H3> Filtering and Partitioning </H3>
-<!--docid::SEC255::-->
-<P>
-
-<A NAME="IDX1534"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>filter</B> <I>pred lis</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1535"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>filter!</B> <I>pred l</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1536"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>partition</B> <I>pred list</I>
-<DD><P>
-
-</P>
-</DL>
-<A NAME="SEC256"></A>
-<H3> Searching </H3>
-<!--docid::SEC256::-->
-<P>
-
-<A NAME="IDX1537"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>find</B> <I>pred list</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1538"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>find-tail</B> <I>pred list</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1539"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>remove</B> <I>pred l</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1540"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>remove!</B> <I>pred l</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1541"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>any</B> <I>pred clist1 clist2 <small>...</small></I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1542"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>list-index</B> <I>pred clist1 clist2 <small>...</small></I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1543"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>span</B> <I>pred list</I>
-<DD><P>
-
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1544"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>member</B> <I>obj list pred</I>
-<DD><P>
-
-<A NAME="IDX1545"></A>
-<DT><U>Function:</U> <B>member</B> <I>obj list</I>
-<DD></P>
-<P>
-
-<CODE>member</CODE> returns the first sublist of <VAR>list</VAR> whose car is <VAR>obj</VAR>, where the sublists
-of <VAR>list</VAR> are the non-empty lists returned by <TT>(list-tail <VAR>list</VAR> <VAR>k</VAR>)</TT>
-for <VAR>k</VAR> less than the length of <VAR>list</VAR>. If <VAR>obj</VAR> does not occur in <VAR>list</VAR>,
-then <TT>#f</TT> (not the empty list) is returned. The procedure <VAR>pred</VAR> is
-used for testing equality. If <VAR>pred</VAR> is not provided, `<SAMP>equal?</SAMP>' is
-used.
-</P>
-</DL>
-<A NAME="SEC257"></A>
-<H3> Deleting </H3>
-<!--docid::SEC257::-->
-<P>
-
-<A NAME="SEC258"></A>
-<H3> Association lists </H3>
-<!--docid::SEC258::-->
-<P>
-
-<A NAME="IDX1546"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>assoc</B> <I>obj alist pred</I>
-<DD><P>
-
-<A NAME="IDX1547"></A>
-<DT><U>Function:</U> <B>assoc</B> <I>obj alist</I>
-<DD></P>
-<P>
-
-<VAR>alist</VAR> (for &quot;association list&quot;) must be a list of pairs. These
-procedures find the first pair in <VAR>alist</VAR> whose car field is <VAR>obj</VAR>, and
-returns that pair. If no pair in <VAR>alist</VAR> has <VAR>obj</VAR> as its car, then <TT>#f</TT>
-(not the empty list) is returned. The procedure <VAR>pred</VAR> is used for
-testing equality. If <VAR>pred</VAR> is not provided, `<SAMP>equal?</SAMP>' is used.
-</P>
-</DL>
-<A NAME="SEC259"></A>
-<H3> Set operations </H3>
-<!--docid::SEC259::-->
-<P>
-
-<A NAME="SRFI-2"></A>
-<HR SIZE="6">
-<A NAME="SEC260"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC249"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC261"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.4.13.2 SRFI-2 </H4>
-<!--docid::SEC260::-->
-<P>
-
-<CODE>(require 'srfi-2)</CODE>
-<A NAME="IDX1548"></A>
-</P>
-<P>
-
-<A NAME="IDX1549"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>and-let*</B> <I>claws body <small>...</small></I>
-<DD><P>
-
-<A HREF="http://srfi.schemers.org/srfi-2/srfi-2.html">http://srfi.schemers.org/srfi-2/srfi-2.html</A>
-</P>
-</DL>
-<P>
-
-<A NAME="SRFI-8"></A>
-<HR SIZE="6">
-<A NAME="SEC261"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC260"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC262"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.4.13.3 SRFI-8 </H4>
-<!--docid::SEC261::-->
-<P>
-
-<CODE>(require 'srfi-8)</CODE>
-<A NAME="IDX1550"></A>
-</P>
-<P>
-
-<A NAME="IDX1551"></A>
-</P>
-<DL>
-<DT><U>Special Form:</U> <B>receive</B> <I>formals expression body <small>...</small></I>
-<DD><P>
-
-<A HREF="http://srfi.schemers.org/srfi-8/srfi-8.html">http://srfi.schemers.org/srfi-8/srfi-8.html</A>
-</P>
-</DL>
-<P>
-
-<A NAME="SRFI-9"></A>
-<HR SIZE="6">
-<A NAME="SEC262"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC261"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H4> 7.4.13.4 SRFI-9 </H4>
-<!--docid::SEC262::-->
-<P>
-
-<CODE>(require 'srfi-9)</CODE>
-<A NAME="IDX1552"></A>
-</P>
-<P>
-
-<A HREF="http://srfi.schemers.org/srfi-9/srfi-9.html">http://srfi.schemers.org/srfi-9/srfi-9.html</A>
-</P>
-<P>
-
-<A NAME="IDX1553"></A>
-</P>
-<DL>
-<DT><U>Special Form:</U> <B>define-record-type</B> <I>&lt;type-name&gt; (&lt;constructor-name&gt; &lt;field-tag&gt; ...) &lt;predicate-name&gt; &lt;field spec&gt; ...</I>
-<DD><P>
-
-Where
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>&lt;field-spec&gt; == (&lt;field-tag&gt; &lt;accessor-name&gt;)
- == (&lt;field-tag&gt; &lt;accessor-name&gt; &lt;modifier-name&gt;)
-
-</pre></td></tr></table><P>
-
-<CODE>define-record-type</CODE> is a syntax wrapper for the SLIB
-<CODE>record</CODE> module.
-</P>
-</DL>
-<P>
-
-<A NAME="Session Support"></A>
-<HR SIZE="6">
-<A NAME="SEC263"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC262"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC264"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 7.5 Session Support </H2>
-<!--docid::SEC263::-->
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Macros at top-level</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Loop-safe Output</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">To err is human ...</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Pause execution</TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'trace</TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Repl"></A>
-<HR SIZE="6">
-<A NAME="SEC264"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC265"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.5.1 Repl </H3>
-<!--docid::SEC264::-->
-<P>
-
-<CODE>(require 'repl)</CODE>
-<A NAME="IDX1554"></A>
-</P>
-<P>
-
-Here is a read-eval-print-loop which, given an eval, evaluates forms.
-</P>
-<P>
-
-<A NAME="IDX1555"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>repl:top-level</B> <I>repl:eval</I>
-<DD><CODE>read</CODE>s, <CODE>repl:eval</CODE>s and <CODE>write</CODE>s expressions from
-<CODE>(current-input-port)</CODE> to <CODE>(current-output-port)</CODE> until an
-end-of-file is encountered. <CODE>load</CODE>, <CODE>slib:eval</CODE>,
-<CODE>slib:error</CODE>, and <CODE>repl:quit</CODE> dynamically bound during
-<CODE>repl:top-level</CODE>.
-</DL>
-<P>
-
-<A NAME="IDX1556"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>repl:quit</B>
-<DD>Exits from the invocation of <CODE>repl:top-level</CODE>.
-</DL>
-<P>
-
-The <CODE>repl:</CODE> procedures establish, as much as is possible to do
-portably, a top level environment supporting macros.
-<CODE>repl:top-level</CODE> uses <CODE>dynamic-wind</CODE> to catch error conditions
-and interrupts. If your implementation supports this you are all set.
-</P>
-<P>
-
-Otherwise, if there is some way your implementation can catch error
-conditions and interrupts, then have them call <CODE>slib:error</CODE>. It
-will display its arguments and reenter <CODE>repl:top-level</CODE>.
-<CODE>slib:error</CODE> dynamically bound by <CODE>repl:top-level</CODE>.
-</P>
-<P>
-
-To have your top level loop always use macros, add any interrupt
-catching lines and the following lines to your Scheme init file:
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'macro)
-<A NAME="IDX1557"></A>(require 'repl)
-<A NAME="IDX1558"></A>(repl:top-level macro:eval)
-</pre></td></tr></table><P>
-
-<A NAME="Quick Print"></A>
-<HR SIZE="6">
-<A NAME="SEC265"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC264"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC266"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.5.2 Quick Print </H3>
-<!--docid::SEC265::-->
-<P>
-
-<CODE>(require 'qp)</CODE>
-<A NAME="IDX1559"></A>
-</P>
-<P>
-
-When displaying error messages and warnings, it is paramount that the
-output generated for circular lists and large data structures be
-limited. This section supplies a procedure to do this. It could be
-much improved.
-</P>
-<P>
-
-<BLOCKQUOTE>
-Notice that the neccessity for truncating output eliminates
-Common-Lisp's <A HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A> from consideration; even when variables
-<CODE>*print-level*</CODE> and <CODE>*print-level*</CODE> are set, huge strings and
-bit-vectors are <EM>not</EM> limited.
-</BLOCKQUOTE>
-<P>
-
-<A NAME="IDX1560"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>qp</B> <I>arg1 <small>...</small></I>
-<DD><A NAME="IDX1561"></A>
-<DT><U>Procedure:</U> <B>qpn</B> <I>arg1 <small>...</small></I>
-<DD><A NAME="IDX1562"></A>
-<DT><U>Procedure:</U> <B>qpr</B> <I>arg1 <small>...</small></I>
-<DD><CODE>qp</CODE> writes its arguments, separated by spaces, to
-<CODE>(current-output-port)</CODE>. <CODE>qp</CODE> compresses printing by
-substituting `<SAMP>...</SAMP>' for substructure it does not have sufficient
-room to print. <CODE>qpn</CODE> is like <CODE>qp</CODE> but outputs a newline
-before returning. <CODE>qpr</CODE> is like <CODE>qpn</CODE> except that it returns
-its last argument.
-</DL>
-<P>
-
-<A NAME="IDX1563"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>*qp-width*</B>
-<DD><VAR>*qp-width*</VAR> is the largest number of characters that <CODE>qp</CODE>
-should use. If <VAR>*qp-width*</VAR> is #f, then all items will be
-<CODE>write</CODE>n. If <VAR>*qp-width*</VAR> is 0, then all items except
-procedures will be <CODE>write</CODE>n; procedures will be indicated by
-`<SAMP>#[proc]</SAMP>'.
-</DL>
-<P>
-
-<A NAME="Debug"></A>
-<HR SIZE="6">
-<A NAME="SEC266"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC265"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC267"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.5.3 Debug </H3>
-<!--docid::SEC266::-->
-<P>
-
-<CODE>(require 'debug)</CODE>
-<A NAME="IDX1564"></A>
-</P>
-<P>
-
-Requiring <CODE>debug</CODE> automatically requires <CODE>trace</CODE> and
-<CODE>break</CODE>.
-</P>
-<P>
-
-An application with its own datatypes may want to substitute its own
-printer for <CODE>qp</CODE>. This example shows how to do this:
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define qpn (lambda args) <small>...</small>)
-(provide 'qp)
-(require 'debug)
-<A NAME="IDX1565"></A></pre></td></tr></table><P>
-
-<A NAME="IDX1566"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>trace-all</B> <I>file <small>...</small></I>
-<DD>Traces (see section <A HREF="slib_7.html#SEC268">7.5.5 Tracing</A>) all procedures <CODE>define</CODE>d at top-level in
-`<TT>file</TT>' <small>...</small>.
-<P>
-
-<A NAME="IDX1567"></A>
-<DT><U>Procedure:</U> <B>track-all</B> <I>file <small>...</small></I>
-<DD>Tracks (see section <A HREF="slib_7.html#SEC268">7.5.5 Tracing</A>) all procedures <CODE>define</CODE>d at top-level in
-`<TT>file</TT>' <small>...</small>.
-</P>
-<P>
-
-<A NAME="IDX1568"></A>
-<DT><U>Procedure:</U> <B>stack-all</B> <I>file <small>...</small></I>
-<DD>Stacks (see section <A HREF="slib_7.html#SEC268">7.5.5 Tracing</A>) all procedures <CODE>define</CODE>d at top-level in
-`<TT>file</TT>' <small>...</small>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1569"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>break-all</B> <I>file <small>...</small></I>
-<DD>Breakpoints (see section <A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A>) all procedures <CODE>define</CODE>d at
-top-level in `<TT>file</TT>' <small>...</small>.
-</DL>
-<P>
-
-<A NAME="Breakpoints"></A>
-<HR SIZE="6">
-<A NAME="SEC267"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC266"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC268"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.5.4 Breakpoints </H3>
-<!--docid::SEC267::-->
-<P>
-
-<CODE>(require 'break)</CODE>
-<A NAME="IDX1570"></A>
-</P>
-<P>
-
-<A NAME="IDX1571"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>init-debug</B>
-<DD>If your Scheme implementation does not support <CODE>break</CODE> or
-<CODE>abort</CODE>, a message will appear when you <CODE>(require 'break)</CODE> or
-<A NAME="IDX1572"></A>
-<CODE>(require 'debug)</CODE> telling you to type <CODE>(init-debug)</CODE>. This
-<A NAME="IDX1573"></A>
-is in order to establish a top-level continuation. Typing
-<CODE>(init-debug)</CODE> at top level sets up a continuation for
-<CODE>break</CODE>.
-</DL>
-<P>
-
-<A NAME="IDX1574"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>breakpoint</B> <I>arg1 <small>...</small></I>
-<DD>Returns from the top level continuation and pushes the continuation from
-which it was called on a continuation stack.
-</DL>
-<P>
-
-<A NAME="IDX1575"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>continue</B>
-<DD>Pops the topmost continuation off of the continuation stack and returns
-an unspecified value to it.
-<P>
-
-<A NAME="IDX1576"></A>
-<DT><U>Function:</U> <B>continue</B> <I>arg1 <small>...</small></I>
-<DD>Pops the topmost continuation off of the continuation stack and returns
-<VAR>arg1</VAR> <small>...</small> to it.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1577"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>break</B> <I>proc1 <small>...</small></I>
-<DD>Redefines the top-level named procedures given as arguments so that
-<CODE>breakpoint</CODE> is called before calling <VAR>proc1</VAR> <small>...</small>.
-<A NAME="IDX1578"></A>
-<DT><U>Macro:</U> <B>break</B>
-<DD>With no arguments, makes sure that all the currently broken identifiers
-are broken (even if those identifiers have been redefined) and returns a
-list of the broken identifiers.
-</DL>
-<P>
-
-<A NAME="IDX1579"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>unbreak</B> <I>proc1 <small>...</small></I>
-<DD>Turns breakpoints off for its arguments.
-<A NAME="IDX1580"></A>
-<DT><U>Macro:</U> <B>unbreak</B>
-<DD>With no arguments, unbreaks all currently broken identifiers and returns
-a list of these formerly broken identifiers.
-</DL>
-<P>
-
-These are <EM>procedures</EM> for breaking. If defmacros are not natively
-supported by your implementation, these might be more convenient to use.
-</P>
-<P>
-
-<A NAME="IDX1581"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>breakf</B> <I>proc</I>
-<DD><A NAME="IDX1582"></A>
-<DT><U>Function:</U> <B>breakf</B> <I>proc name</I>
-<DD>To break, type
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! <VAR>symbol</VAR> (breakf <VAR>symbol</VAR>))
-</pre></td></tr></table>or
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! <VAR>symbol</VAR> (breakf <VAR>symbol</VAR> '<VAR>symbol</VAR>))
-</pre></td></tr></table>or
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define <VAR>symbol</VAR> (breakf <VAR>function</VAR>))
-</pre></td></tr></table>or
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define <VAR>symbol</VAR> (breakf <VAR>function</VAR> '<VAR>symbol</VAR>))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1583"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>unbreakf</B> <I>proc</I>
-<DD>To unbreak, type
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! <VAR>symbol</VAR> (unbreakf <VAR>symbol</VAR>))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Trace"></A>
-<HR SIZE="6">
-<A NAME="SEC268"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC267"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.5.5 Tracing </H3>
-<!--docid::SEC268::-->
-<P>
-
-<CODE>(require 'trace)</CODE>
-<A NAME="IDX1584"></A>
-</P>
-<P>
-
-This feature provides three ways to monitor procedure invocations:
-</P>
-<P>
-
-</P>
-<DL COMPACT>
-<DT>stack
-<DD>Pushes the procedure-name when the procedure is called; pops when it
-returns.
-<DT>track
-<DD>Pushes the procedure-name and arguments when the procedure is called;
-pops when it returns.
-<DT>trace
-<DD>Pushes the procedure-name and prints `<SAMP>CALL <VAR>procedure-name</VAR>
-<VAR>arg1</VAR> <small>...</small></SAMP>' when the procdure is called; pops and prints
-`<SAMP>RETN <VAR>procedure-name</VAR> <VAR>value</VAR></SAMP>' when the procedure returns.
-</DL>
-<P>
-
-<A NAME="IDX1585"></A>
-</P>
-<DL>
-<DT><U>Variable:</U> <B>debug:max-count</B>
-<DD>If a traced procedure calls itself or untraced procedures which call it,
-stack, track, and trace will limit the number of stack pushes to
-<VAR>debug:max-count</VAR>.
-</DL>
-<P>
-
-<A NAME="IDX1586"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>print-call-stack</B>
-<DD><A NAME="IDX1587"></A>
-<DT><U>Function:</U> <B>print-call-stack</B> <I>port</I>
-<DD>Prints the call-stack to <VAR>port</VAR> or the current-error-port.
-</DL>
-<P>
-
-<A NAME="IDX1588"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>trace</B> <I>proc1 <small>...</small></I>
-<DD>Traces the top-level named procedures given as arguments.
-<A NAME="IDX1589"></A>
-<DT><U>Macro:</U> <B>trace</B>
-<DD>With no arguments, makes sure that all the currently traced identifiers
-are traced (even if those identifiers have been redefined) and returns a
-list of the traced identifiers.
-</DL>
-<P>
-
-<A NAME="IDX1590"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>track</B> <I>proc1 <small>...</small></I>
-<DD>Traces the top-level named procedures given as arguments.
-<A NAME="IDX1591"></A>
-<DT><U>Macro:</U> <B>track</B>
-<DD>With no arguments, makes sure that all the currently tracked identifiers
-are tracked (even if those identifiers have been redefined) and returns
-a list of the tracked identifiers.
-</DL>
-<P>
-
-<A NAME="IDX1592"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>stack</B> <I>proc1 <small>...</small></I>
-<DD>Traces the top-level named procedures given as arguments.
-<A NAME="IDX1593"></A>
-<DT><U>Macro:</U> <B>stack</B>
-<DD>With no arguments, makes sure that all the currently stacked identifiers
-are stacked (even if those identifiers have been redefined) and returns
-a list of the stacked identifiers.
-</DL>
-<P>
-
-<A NAME="IDX1594"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>untrace</B> <I>proc1 <small>...</small></I>
-<DD>Turns tracing, tracking, and off for its arguments.
-<A NAME="IDX1595"></A>
-<DT><U>Macro:</U> <B>untrace</B>
-<DD>With no arguments, untraces all currently traced identifiers and returns
-a list of these formerly traced identifiers.
-</DL>
-<P>
-
-<A NAME="IDX1596"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>untrack</B> <I>proc1 <small>...</small></I>
-<DD>Turns tracing, tracking, and off for its arguments.
-<A NAME="IDX1597"></A>
-<DT><U>Macro:</U> <B>untrack</B>
-<DD>With no arguments, untracks all currently tracked identifiers and returns
-a list of these formerly tracked identifiers.
-</DL>
-<P>
-
-<A NAME="IDX1598"></A>
-</P>
-<DL>
-<DT><U>Macro:</U> <B>unstack</B> <I>proc1 <small>...</small></I>
-<DD>Turns tracing, stacking, and off for its arguments.
-<A NAME="IDX1599"></A>
-<DT><U>Macro:</U> <B>unstack</B>
-<DD>With no arguments, unstacks all currently stacked identifiers and returns
-a list of these formerly stacked identifiers.
-</DL>
-<P>
-
-These are <EM>procedures</EM> for tracing. If defmacros are not natively
-supported by your implementation, these might be more convenient to use.
-</P>
-<P>
-
-<A NAME="IDX1600"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>tracef</B> <I>proc</I>
-<DD><A NAME="IDX1601"></A>
-<DT><U>Function:</U> <B>tracef</B> <I>proc name</I>
-<DD><A NAME="IDX1602"></A>
-<DT><U>Function:</U> <B>trackf</B> <I>proc</I>
-<DD><A NAME="IDX1603"></A>
-<DT><U>Function:</U> <B>trackf</B> <I>proc name</I>
-<DD><A NAME="IDX1604"></A>
-<DT><U>Function:</U> <B>stackf</B> <I>proc</I>
-<DD><A NAME="IDX1605"></A>
-<DT><U>Function:</U> <B>stackf</B> <I>proc name</I>
-<DD>To trace, type
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! <VAR>symbol</VAR> (tracef <VAR>symbol</VAR>))
-</pre></td></tr></table>or
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! <VAR>symbol</VAR> (tracef <VAR>symbol</VAR> '<VAR>symbol</VAR>))
-</pre></td></tr></table>or
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define <VAR>symbol</VAR> (tracef <VAR>function</VAR>))
-</pre></td></tr></table>or
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define <VAR>symbol</VAR> (tracef <VAR>function</VAR> '<VAR>symbol</VAR>))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="IDX1606"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>untracef</B> <I>proc</I>
-<DD>Removes tracing, tracking, or stacking for <VAR>proc</VAR>.
-To untrace, type
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! <VAR>symbol</VAR> (untracef <VAR>symbol</VAR>))
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="System Interface"></A>
-<HR SIZE="6">
-<A NAME="SEC269"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC268"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC270"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 7.6 System Interface </H2>
-<!--docid::SEC269::-->
-<P>
-
-If <CODE>(provided? 'getenv)</CODE>:
-</P>
-<P>
-
-<A NAME="IDX1607"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>getenv</B> <I>name</I>
-<DD>Looks up <VAR>name</VAR>, a string, in the program environment. If <VAR>name</VAR> is
-found a string of its value is returned. Otherwise, <CODE>#f</CODE> is returned.
-</DL>
-<P>
-
-If <CODE>(provided? 'system)</CODE>:
-</P>
-<P>
-
-<A NAME="IDX1608"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>system</B> <I>command-string</I>
-<DD>Executes the <VAR>command-string</VAR> on the computer and returns the
-integer status code.
-</DL>
-<P>
-
-<TABLE BORDER="0" CELLSPACING="0">
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC271">7.6.2 Transactions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
-</TABLE>
-<P>
-
-<A NAME="Directories"></A>
-<HR SIZE="6">
-<A NAME="SEC270"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC271"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.6.1 Directories </H3>
-<!--docid::SEC270::-->
-<P>
-
-<CODE>(require 'directory)</CODE>
-<A NAME="IDX1609"></A>
-</P>
-<P>
-
-<A NAME="IDX1610"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>current-directory</B>
-<DD><P>
-
-<CODE>current-directory</CODE> returns a string containing the absolute file
-name representing the current working directory. If this string
-cannot be obtained, #f is returned.
-</P>
-<P>
-
-If <CODE>current-directory</CODE> cannot be supported by the platform, then #f is returned.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1611"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>make-directory</B> <I>name</I>
-<DD><P>
-
-Creates a sub-directory <VAR>name</VAR> of the current-directory. If
-successful, <CODE>make-directory</CODE> returns #t; otherwise #f.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1612"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>directory-for-each</B> <I>proc directory</I>
-<DD><P>
-
-<VAR>proc</VAR> must be a procedure taking one argument.
-`<SAMP>Directory-For-Each</SAMP>' applies <VAR>proc</VAR> to the (string) name of
-each file in <VAR>directory</VAR>. The dynamic order in which <VAR>proc</VAR> is
-applied to the filenames is unspecified. The value returned by
-`<SAMP>directory-for-each</SAMP>' is unspecified.
-</P>
-<P>
-
-<A NAME="IDX1613"></A>
-<DT><U>Function:</U> <B>directory-for-each</B> <I>proc directory pred</I>
-<DD>Applies <VAR>proc</VAR> only to those filenames for which the procedure
-<VAR>pred</VAR> returns a non-false value.
-</P>
-<P>
-
-<A NAME="IDX1614"></A>
-<DT><U>Function:</U> <B>directory-for-each</B> <I>proc directory match</I>
-<DD>Applies <VAR>proc</VAR> only to those filenames for which
-<CODE>(filename:match?? <VAR>match</VAR>)</CODE> would return a non-false value
-(see section `Filenames' in <CITE>SLIB</CITE>).
-</P>
-<P>
-
-<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'directory)
-(directory-for-each print &quot;.&quot; &quot;[A-Z]*.scm&quot;)
--|
-&quot;Bev2slib.scm&quot;
-&quot;Template.scm&quot;
-</pre></td></tr></table></DL>
-<P>
-
-<A NAME="Transactions"></A>
-<HR SIZE="6">
-<A NAME="SEC271"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC270"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC275"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.6.2 Transactions </H3>
-<!--docid::SEC271::-->
-<P>
-
-If <CODE>system</CODE> is provided by the Scheme implementation, the
-<EM>transact</EM> package provides functions for file-locking and
-file-replacement transactions.
-</P>
-<P>
-
-<CODE>(require 'transact)</CODE>
-<A NAME="IDX1615"></A>
-</P>
-<P>
-
-<A NAME="SEC272"></A>
-<H4> File Locking </H4>
-<!--docid::SEC272::-->
-<P>
-
-Unix file-locking is focussed on write permissions for segments of a
-existing file. While this might be employed for (binary) database
-access, it is not used for everyday contention (between users) for
-text files.
-</P>
-<P>
-
-Microsoft has several file-locking protocols. Their model denies
-write access to a file if any reader has it open. This is too
-restrictive. Write access is denied even when the reader has
-reached end-of-file. And tracking read access (which is much more
-common than write access) causes havoc when remote hosts crash or
-disconnect.
-</P>
-<P>
-
-It is bizarre that the concept of multi-user contention for
-modifying files has not been adequately addressed by either of the
-large operating system development efforts. There is further irony
-that both camps support contention detection and resolution only
-through weak conventions of some their document editing programs.
-</P>
-<P>
-
-<A NAME="IDX1616"></A>
-The <EM>file-lock</EM> procedures implement a transaction method for file
-<A NAME="IDX1617"></A>
-replacement compatible with the methods used by the GNU <EM>emacs</EM>
-<A NAME="IDX1618"></A>
-text editor on Unix systems and the Microsoft <EM>Word</EM> editor.
-<A NAME="IDX1619"></A>
-<A NAME="IDX1620"></A>
-</P>
-<P>
-
-<A NAME="IDX1621"></A>
-Both protocols employ what I term a <EM>certificate</EM> containing the
-<A NAME="IDX1622"></A>
-user, hostname, time, and (on Unix) process-id.
-Intent to replace <VAR>file</VAR> is indicated by adding to <VAR>file</VAR>'s
-directory a certificate object whose name is derived from
-<VAR>file</VAR>.
-</P>
-<P>
-
-The Microsoft Word certificate is contained in a 162 byte file named
-for the visited <VAR>file</VAR> with a `<SAMP>~$</SAMP>' prefix.
-Emacs/Unix creates a symbolic link to a certificate named for the
-visited <VAR>file</VAR> prefixed with `<SAMP>.#</SAMP>'.
-Because Unix systems can import Microsoft file systems, these
-routines maintain and check both Emacs and Word certificates.
-</P>
-<P>
-
-<A NAME="IDX1623"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>file-lock-owner</B> <I>path</I>
-<DD><P>
-
-Returns the string `<SAMP><VAR>user</VAR>@<VAR>hostname</VAR></SAMP>' associated with
-the lock owner of file <VAR>path</VAR> if locked; and #f otherwise.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1624"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>file-lock!</B> <I>path email</I>
-<DD><P>
-
-<A NAME="IDX1625"></A>
-<DT><U>Procedure:</U> <B>file-lock!</B> <I>path</I>
-<DD></P>
-<P>
-
-<VAR>path</VAR> must be a string naming the file to be locked. If supplied, <VAR>email</VAR>
-must be a string formatted as `<SAMP><VAR>user</VAR>@<VAR>hostname</VAR></SAMP>'. If
-absent, <VAR>email</VAR> defaults to the value returned by <CODE>user-email-address</CODE>.
-</P>
-<P>
-
-If <VAR>path</VAR> is already locked, then <CODE>file-lock!</CODE> returns `<SAMP>#f</SAMP>'. If <VAR>path</VAR> is
-unlocked, then <CODE>file-lock!</CODE> returns the certificate string associated with the
-new lock for file <VAR>path</VAR>.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1626"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>file-unlock!</B> <I>path certificate</I>
-<DD><P>
-
-<VAR>path</VAR> must be a string naming the file to be unlocked. <VAR>certificate</VAR> must be the
-string returned by <CODE>file-lock!</CODE> for <VAR>path</VAR>.
-</P>
-<P>
-
-If <VAR>path</VAR> is locked with <VAR>certificate</VAR>, then <CODE>file-unlock!</CODE> removes the locks and returns
-`<SAMP>#t</SAMP>'. Otherwise, <CODE>file-unlock!</CODE> leaves the file system unaltered and returns
-`<SAMP>#f</SAMP>'.
-</P>
-</DL>
-<A NAME="SEC273"></A>
-<H4> File Transactions </H4>
-<!--docid::SEC273::-->
-<P>
-
-<A NAME="IDX1627"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>emacs:backup-name</B> <I>path backup-style</I>
-<DD><P>
-
-<VAR>path</VAR> must be a string. <VAR>backup-style</VAR> must be a symbol. Depending on <VAR>backup-style</VAR>, <CODE>emacs:backup-name</CODE>
-returns:
-</P>
-<DL COMPACT>
-<DT>none
-<DD>#f
-<DT>simple
-<DD>the string &quot;<VAR>path</VAR>~&quot;
-<DT>numbered
-<DD>the string &quot;<VAR>path</VAR>.~<VAR>n</VAR>~&quot;, where <VAR>n</VAR> is one greater than the
-highest number appearing in a filename matching &quot;<VAR>path</VAR>.~*~&quot;. <VAR>n</VAR>
-defauls to 1 when no filename matches.
-<DT>existing
-<DD>the string &quot;<VAR>path</VAR>.~<VAR>n</VAR>~&quot; if a numbered backup already exists in
-this directory; otherwise. &quot;<VAR>path</VAR>~&quot;
-<DT>orig
-<DD>the string &quot;<VAR>path</VAR>.orig&quot;
-<DT>bak
-<DD>the string &quot;<VAR>path</VAR>.bak&quot;
-</DL>
-</DL>
-<P>
-
-<A NAME="IDX1628"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>transact-file-replacement</B> <I>proc path backup-style certificate</I>
-<DD><P>
-
-<A NAME="IDX1629"></A>
-<DT><U>Function:</U> <B>transact-file-replacement</B> <I>proc path backup-style</I>
-<DD></P>
-<P>
-
-<A NAME="IDX1630"></A>
-<DT><U>Function:</U> <B>transact-file-replacement</B> <I>proc path</I>
-<DD></P>
-<P>
-
-<VAR>path</VAR> must be a string naming an existing file. <VAR>backup-style</VAR> is one of the
-symbols none, simple, numbered, existing, orig,
-bak or #f; with meanings described above; or a string naming
-the location of a backup file. <VAR>backup-style</VAR> defaults to #f. If supplied,
-<VAR>certificate</VAR> is the certificate with which <VAR>path</VAR> is locked.
-</P>
-<P>
-
-<VAR>proc</VAR> must be a procedure taking two string arguments:
-<UL>
-<LI>
-<VAR>path</VAR>, the original filename (to be read); and
-<LI>
-a temporary file-name.
-</UL>
-<P>
-
-If <VAR>path</VAR> is locked by other than <VAR>certificate</VAR>, or if <VAR>certificate</VAR> is supplied and <VAR>path</VAR> is not
-locked, then <CODE>transact-file-replacement</CODE> returns #f. If <VAR>certificate</VAR> is not supplied, then, <CODE>transact-file-replacement</CODE> creates
-temporary (Emacs and Word) locks for <VAR>path</VAR> during the transaction. The
-lock status of <VAR>path</VAR> will be restored before <CODE>transact-file-replacement</CODE> returns.
-</P>
-<P>
-
-<CODE>transact-file-replacement</CODE> calls <VAR>proc</VAR> with <VAR>path</VAR> (which should not be modified) and a temporary
-file path to be written.
-If <VAR>proc</VAR> returns any value other than #t, then the file named by <VAR>path</VAR>
-is not altered and <CODE>transact-file-replacement</CODE> returns #f.
-Otherwise, <CODE>emacs:backup-name</CODE> is called with <VAR>path</VAR> and <VAR>backup-style</VAR>. If it
-returns a string, then <VAR>path</VAR> is renamed to it.
-</P>
-<P>
-
-Finally, the temporary file is renamed <VAR>path</VAR>.
-<CODE>transact-file-replacement</CODE> returns #t if <VAR>path</VAR> was successfully replaced; and #f otherwise.
-</P>
-</DL>
-<A NAME="SEC274"></A>
-<H4> Identification </H4>
-<!--docid::SEC274::-->
-<P>
-
-<A NAME="IDX1631"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>user-email-address</B>
-<DD><P>
-
-<CODE>user-email-address</CODE> returns a string of the form `<SAMP>username@hostname</SAMP>'. If
-this e-mail address cannot be obtained, #f is returned.
-</P>
-</DL>
-<P>
-
-<A NAME="CVS"></A>
-<HR SIZE="6">
-<A NAME="SEC275"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC271"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC276"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H3> 7.6.3 CVS </H3>
-<!--docid::SEC275::-->
-<P>
-
-<CODE>(require 'cvs)</CODE>
-<A NAME="IDX1632"></A>
-</P>
-<P>
-
-<A NAME="IDX1633"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>cvs-files</B> <I>directory/</I>
-<DD>Returns a list of the local pathnames (with prefix <VAR>directory/</VAR>) of all
-CVS controlled files in <VAR>directory/</VAR> and in <VAR>directory/</VAR>'s subdirectories.
-</DL>
-<P>
-
-<A NAME="IDX1634"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>cvs-directories</B> <I>directory/</I>
-<DD>Returns a list of all of <VAR>directory/</VAR> and all <VAR>directory/</VAR>'s CVS controlled
-subdirectories.
-</DL>
-<P>
-
-<A NAME="IDX1635"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>cvs-root</B> <I>path/</I>
-<DD>Returns the (string) contents of <VAR>path/</VAR>CVS/Root;
-or <CODE>(getenv &quot;CVSROOT&quot;)</CODE> if Root doesn't exist.
-</DL>
-<P>
-
-<A NAME="IDX1636"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>cvs-repository</B> <I>directory/</I>
-<DD>Returns the (string) contents of <VAR>directory/</VAR>CVS/Root appended
-with <VAR>directory/</VAR>CVS/Repository; or #f if <VAR>directory/</VAR>CVS/Repository
-doesn't exist.
-</DL>
-<P>
-
-<A NAME="IDX1637"></A>
-</P>
-<DL>
-<DT><U>Procedure:</U> <B>cvs-set-root!</B> <I>new-root directory/</I>
-<DD><P>
-
-Writes <VAR>new-root</VAR> to file CVS/Root of <VAR>directory/</VAR> and all its subdirectories.
-</P>
-</DL>
-<P>
-
-<A NAME="IDX1638"></A>
-</P>
-<DL>
-<DT><U>Function:</U> <B>cvs-vet</B> <I>directory/</I>
-<DD><P>
-
-Signals an error if CVS/Repository or CVS/Root files in <VAR>directory/</VAR> or any
-subdirectory do not match.
-</P>
-</DL>
-<P>
-
-<A NAME="Extra-SLIB Packages"></A>
-<HR SIZE="6">
-<A NAME="SEC276"></A>
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC275"> &lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<H2> 7.7 Extra-SLIB Packages </H2>
-<!--docid::SEC276::-->
-<P>
-
-Several Scheme packages have been written using SLIB. There are several
-reasons why a package might not be included in the SLIB distribution:
-<UL>
-<LI>
-Because it requires special hardware or software which is not universal.
-<LI>
-Because it is large and of limited interest to most Scheme users.
-<LI>
-Because it has copying terms different enough from the other SLIB
-packages that its inclusion would cause confusion.
-<LI>
-Because it is an application program, rather than a library module.
-<LI>
-Because I have been too busy to integrate it.
-</UL>
-<P>
-
-Once an optional package is installed (and an entry added to
-<CODE>*catalog*</CODE>, the <CODE>require</CODE> mechanism allows it to be called up
-and used as easily as any other SLIB package. Some optional packages
-(for which <CODE>*catalog*</CODE> already has entries) available from SLIB
-sites are:
-</P>
-<P>
-
-</P>
-<DL COMPACT>
-<DT>SLIB-PSD
-<DD>is a portable debugger for Scheme (requires emacs editor).
-<P>
-
-&lt;A HREF=&quot;http://swissnet.ai.mit.edu/ftpdir/scm/slib-psd1-3.tar.gz&quot;&gt;
-http://swissnet.ai.mit.edu/ftpdir/scm/slib-psd1-3.tar.gz
-&lt;/A&gt;
-</P>
-<P>
-
-swissnet.ai.mit.edu:/pub/scm/slib-psd1-3.tar.gz
-</P>
-<P>
-
-ftp.maths.tcd.ie:pub/bosullvn/jacal/slib-psd1-3.tar.gz
-</P>
-<P>
-
-ftp.cs.indiana.edu:/pub/scheme-repository/utl/slib-psd1-3.tar.gz
-</P>
-<P>
-
-With PSD, you can run a Scheme program in an Emacs buffer, set
-breakpoints, single step evaluation and access and modify the program's
-variables. It works by instrumenting the original source code, so it
-should run with any R4RS compliant Scheme. It has been tested with SCM,
-Elk 1.5, and the sci interpreter in the Scheme-&gt;C system, but should
-work with other Schemes with a minimal amount of porting, if at
-all. Includes documentation and user's manual. Written by Pertti
-Kellom\&quot;aki, pk @ cs.tut.fi. The Lisp Pointers article describing PSD
-(Lisp Pointers VI(1):15-23, January-March 1993) is available as
-&lt;A HREF=&quot;http://www.cs.tut.fi/staff/pk/scheme/psd/article/article.html&quot;&gt;
-http://www.cs.tut.fi/staff/pk/scheme/psd/article/article.html
-&lt;/A&gt;
-</P>
-<P>
-
-</P>
-<DT>SCHELOG
-<DD>is an embedding of Prolog in Scheme.<BR>
-&lt;A HREF=&quot;http://www.ccs.neu.edu/~dorai/schelog/schelog.html&quot;&gt;
-http://www.ccs.neu.edu/~dorai/schelog/schelog.html
-&lt;/A&gt;
-<P>
-
-</P>
-<DT>JFILTER
-<DD>is a Scheme program which converts text among the JIS, EUC, and
-Shift-JIS Japanese character sets.<BR>
-&lt;A HREF=&quot;http://www.sci.toyama-u.ac.jp/~iwao/Scheme/Jfilter/index.html&quot;&gt;
-http://www.sci.toyama-u.ac.jp/~iwao/Scheme/Jfilter/index.html
-&lt;/A&gt;
-</DL>
-<P>
-
-<A NAME="About SLIB"></A>
-<HR SIZE="6">
-<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
-<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &lt;&lt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &gt;&gt; </A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
-<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
-</TR></TABLE>
-<BR>
-<FONT SIZE="-1">
-This document was generated
-by <I>Steve Langasek</I> on <I>January, 10 2005</I>
-using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A>
-</FONT>
-
-</BODY>
-</HTML>