summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.slibcat164
-rw-r--r--Makefile21
-rw-r--r--debian/changelog231
-rw-r--r--debian/control17
-rw-r--r--debian/copyright580
-rw-r--r--debian/doc-base10
-rw-r--r--debian/postinst31
-rw-r--r--debian/prerm16
-rwxr-xr-xdebian/rules96
-rw-r--r--debian/slibconfig7
-rw-r--r--format.scm1688
-rw-r--r--formatst.scm666
-rw-r--r--guile.init.local416
-rw-r--r--http-cgi.scm6
-rw-r--r--mklibcat.scm2
-rw-r--r--schmooz.scm33
-rw-r--r--slib.html76
-rw-r--r--slib_1.html1172
-rw-r--r--slib_10.html217
-rw-r--r--slib_11.html268
-rw-r--r--slib_12.html346
-rw-r--r--slib_13.html325
-rw-r--r--slib_14.html314
-rw-r--r--slib_15.html367
-rw-r--r--slib_16.html311
-rw-r--r--slib_17.html461
-rw-r--r--slib_18.html331
-rw-r--r--slib_19.html214
-rw-r--r--slib_2.html824
-rw-r--r--slib_20.html294
-rw-r--r--slib_21.html271
-rw-r--r--slib_22.html180
-rw-r--r--slib_3.html2013
-rw-r--r--slib_4.html5157
-rw-r--r--slib_5.html6100
-rw-r--r--slib_6.html3658
-rw-r--r--slib_7.html8218
-rw-r--r--slib_8.html767
-rw-r--r--slib_9.html340
-rw-r--r--slib_abt.html205
-rw-r--r--slib_fot.html92
-rw-r--r--slib_ovr.html69
-rw-r--r--slib_toc.html676
-rw-r--r--srcdir.mk2
-rw-r--r--strsrch.scm6
45 files changed, 37243 insertions, 15 deletions
diff --git a/.slibcat b/.slibcat
new file mode 100644
index 0000000..54d82ee
--- /dev/null
+++ b/.slibcat
@@ -0,0 +1,164 @@
+;"slibcat" SLIB catalog for guile1.6.7. -*-scheme-*-
+;
+; DO NOT EDIT THIS FILE -- it is automagically generated
+
+(
+ (schelog . "./schelog/schelog")
+ (portable-scheme-debugger . "./psd/psd-slib")
+ (jfilter . "./jfilter/jfilter")
+ (null . "./null")
+ (aggregate . "./null")
+ (r2rs aggregate rev3-procedures rev2-procedures)
+ (r3rs aggregate rev3-procedures)
+ (r4rs aggregate rev4-optional-procedures)
+ (r5rs aggregate values macro eval)
+ (rev4-optional-procedures . "./sc4opt")
+ (rev3-procedures . "./null")
+ (rev2-procedures . "./sc2")
+ (multiarg/and- . "./mularg")
+ (multiarg-apply . "./mulapply")
+ (rationalize . "./ratize")
+ (transcript . "./trnscrpt")
+ (with-file . "./withfile")
+ (dynamic-wind . "./dynwind")
+ (dynamic . "./dynamic")
+ (fluid-let defmacro "./fluidlet")
+ (alist . "./alist")
+ (hash . "./hash")
+ (sierpinski . "./sierpinski")
+ (hilbert-fill . "./phil-spc")
+ (soundex . "./soundex")
+ (hash-table . "./hashtab")
+ (logical . "./logical")
+ (random . "./random")
+ (random-inexact . "./randinex")
+ (modular . "./modular")
+ (factor . "./factor")
+ (primes . factor)
+ (eps-graph . "./grapheps")
+ (charplot . "./charplot")
+ (sort . "./sort")
+ (tsort . topological-sort)
+ (topological-sort . "./tsort")
+ (common-list-functions . "./comlist")
+ (tree . "./tree")
+ (coerce . "./coerce")
+ (format . "./format")
+ (generic-write . "./genwrite")
+ (pretty-print . "./pp")
+ (pprint-file . "./ppfile")
+ (object->string . "./obj2str")
+ (string-case . "./strcase")
+ (line-i/o . "./lineio")
+ (string-port . "./strport")
+ (getopt . "./getopt")
+ (qp . "./qp")
+ (eval . "./eval")
+ (record . "./record")
+ (synchk . "./synchk")
+ (defmacroexpand . "./defmacex")
+ (printf . "./printf")
+ (scanf defmacro "./scanf")
+ (stdio-ports . "./stdio")
+ (stdio aggregate scanf printf stdio-ports)
+ (break defmacro "./break")
+ (trace defmacro "./trace")
+ (debugf . "./debug")
+ (debug aggregate trace break debugf)
+ (delay . promise)
+ (promise macro "./promise")
+ (macro-by-example defmacro "./mbe")
+ (syntax-case . "./scainit")
+ (syntactic-closures . "./scmacro")
+ (macros-that-work . "./macwork")
+ (macro . macro-by-example)
+ (object . "./object")
+ (yasos macro "./yasyn")
+ (oop . yasos)
+ (collect . "./collectx")
+ (structure syntax-case "./structure")
+ (values . "./values")
+ (queue . "./queue")
+ (priority-queue . "./priorque")
+ (array . "./array")
+ (subarray . "./subarray")
+ (array-for-each . "./arraymap")
+ (repl . "./repl")
+ (process . "./process")
+ (chapter-order . "./chap")
+ (posix-time . "./psxtime")
+ (common-lisp-time . "./cltime")
+ (time-zone defmacro "./timezone")
+ (relational-database . "./rdms")
+ (databases . "./dbutil")
+ (database-utilities . databases)
+ (database-commands . "./dbcom")
+ (database-browse . "./dbrowse")
+ (database-interpolate . "./dbinterp")
+ (within-database macro "./dbsyn")
+ (html-form . "./htmlform")
+ (alist-table . "./alistab")
+ (parameters . "./paramlst")
+ (getopt-parameters . "./getparam")
+ (read-command . "./comparse")
+ (batch . "./batch")
+ (glob . "./glob")
+ (filename . glob)
+ (crc . "./crc")
+ (fft . "./fft")
+ (wt-tree . "./wttree")
+ (string-search . "./strsrch")
+ (root . "./root")
+ (minimize . "./minimize")
+ (precedence-parse defmacro "./prec")
+ (parse . precedence-parse)
+ (commutative-ring . "./cring")
+ (self-set . "./selfset")
+ (determinant . "./determ")
+ (byte . "./byte")
+ (byte-number . "./bytenumb")
+ (tzfile . "./tzfile")
+ (schmooz . "./schmooz")
+ (transact defmacro "./transact")
+ (net-clients . transact)
+ (db->html . "./db2html")
+ (http defmacro "./http-cgi")
+ (cgi . http)
+ (uri defmacro "./uri")
+ (uniform-resource-identifier . uri)
+ (pnm . "./pnm")
+ (metric-units . "./simetrix")
+ (diff . "./differ")
+ (solid . "./solid")
+ (vrml97 . solid)
+ (vrml . vrml97)
+ (color defmacro "./color")
+ (color-space . "./colorspc")
+ (cie . color-space)
+ (color-names . "./colornam")
+ (color-database defmacro "./mkclrnam")
+ (resene color-names "./clrnamdb.scm")
+ (saturate color-names "./clrnamdb.scm")
+ (daylight . "./daylight")
+ (matfile . "./matfile")
+ (mat-file . matfile)
+ (spectral-tristimulus-values . color-space)
+ (cie1964 spectral-tristimulus-values "./cie1964.xyz")
+ (cie1931 spectral-tristimulus-values "./cie1931.xyz")
+ (ciexyz . cie1931)
+ (cvs defmacro "./cvs")
+ (html-for-each defmacro "./html4each")
+ (directory . "./dirs")
+ (ncbi-dna defmacro "./ncbi-dna")
+ (manifest . "./manifest")
+ (top-refs . "./top-refs")
+ (vet . "./vet")
+ (srfi-0 . srfi)
+ (srfi defmacro "./srfi")
+ (srfi-1 . "./srfi-1")
+ (srfi-2 defmacro "./srfi-2")
+ (srfi-8 macro "./srfi-8")
+ (srfi-9 macro "./srfi-9")
+ (new-catalog . "./mklibcat")
+ (*slib-version* . "3a1")
+)
diff --git a/Makefile b/Makefile
index 6739f4e..2251d10 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,7 @@ VERSION = 3a1
RELEASE = 1
rpm_prefix=/usr/src/redhat/
-prefix = /usr/local/
+prefix = debian/tmp/usr
exec_prefix = $(prefix)
# directory where `make install' will put executable.
bindir = $(exec_prefix)bin/
@@ -29,7 +29,7 @@ infodir = $(prefix)info/
PREVDOCS = prevdocs/
-htmldir=../public_html/
+htmldir=slib_html/
dvidir=../dvi/
RUNNABLE = scheme48
@@ -92,7 +92,7 @@ version.txi: Makefile
echo @set SLIBVERSION $(ver) > version.txi
echo @set SLIBDATE `date +"%B %Y"` >> version.txi
-scheme = scm
+scheme = guile-1.6
collect.sc:
echo "(require 'macros-that-work)" > collect.sc
@@ -104,7 +104,7 @@ collect.sc:
collectx.scm: collect.scm macwork.scm collect.sc
$(scheme) < collect.sc
-ffiles = printf.scm genwrite.scm pp.scm \
+ffiles = printf.scm genwrite.scm pp.scm format.scm \
ppfile.scm strcase.scm debug.scm trace.scm \
strport.scm scanf.scm qp.scm break.scm stdio.scm \
strsrch.scm prec.scm schmooz.scm defmacex.scm mbe.scm
@@ -157,13 +157,13 @@ ifiles = bigloo.init chez.init elk.init macscheme.init mitscheme.init \
scheme2c.init scheme48.init s48-0_57.init gambit.init t3.init \
vscm.init scm.init scsh.init pscheme.init STk.init \
RScheme.init DrScheme.init umbscheme.init guile.init
-tfiles = plottest.scm macrotst.scm dwindtst.scm
+tfiles = plottest.scm macrotst.scm dwindtst.scm formatst.scm
sfiles = $(ffiles) $(lfiles) $(revfiles) $(afiles) $(scfiles) $(efiles) \
$(rfiles) $(gfiles) $(scafiles) $(txiscms) $(srfiles)
allfiles = $(docfiles) $(mkfiles) $(ifiles) $(sfiles) $(tfiles) $(bfiles)
$(txifiles): $(txiscms) schmooz.scm
- $(scheme) -rschmooz -e'(schmooz "slib.texi")'
+ $(scheme) -l guile.init.local -c '(require '\''schmooz) (schmooz "slib.texi")'
dvi: $(dvidir)slib.dvi
$(dvidir)slib.dvi: version.txi slib.texi $(dvidir)slib.fn \
@@ -185,7 +185,7 @@ $(htmldir)slib.pdf: version.txi slib.texi $(dvidir)slib.fn schmooz.texi
xpdf: $(htmldir)slib.pdf
xpdf -z 3 $(htmldir)slib.pdf
-TEXI2HTML = /usr/local/bin/texi2html -split -verbose
+TEXI2HTML = texi2html -split chapter -verbose
slib_toc.html: $(txifiles) version.txi slib.texi schmooz.texi
${TEXI2HTML} slib.texi
html: $(htmldir)slib_toc.html
@@ -193,7 +193,7 @@ $(htmldir)slib_toc.html: slib_toc.html Makefile
-rm -f slib_stoc.html
if [ -f $(PREVDOCS)slib_toc.html ]; \
then hitch $(PREVDOCS)slib_\*.html slib_\*.html $(htmldir); \
- else cp slib_*.html $(htmldir);fi
+ else mkdir -p $(htmldir) ; cp slib_*.html $(htmldir);fi
slib$(VERSION).info: $(txifiles) version.txi slib.texi schmooz.texi
makeinfo slib.texi --no-warn --no-split -o slib.info
@@ -374,6 +374,11 @@ report:
clean:
-rm -f *~ *.bak *.orig *.rej core a.out *.o \#*
-rm -rf *temp
+ -rm -f slib$(VERSION).info
+ -rm -f version.txi
+ -rm -rf $(htmldir)
+ echo $(scheme) -l guile.init.local -c '(require '\''schmooz) (schmooz-which-files "slib.texi")'
+
distclean: realclean
realclean:
-rm -f *~ *.bak *.orig *.rej TAGS core a.out *.o \#*
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..99d04fa
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,231 @@
+slib (3a1-4.2) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Add guile.init.local for use within the build dir, since otherwise we
+ have an (earlier unnoticed) circular build-dep due to a difference
+ between scm and guile.
+
+ -- Steve Langasek <vorlon@debian.org> Mon, 10 Jan 2005 08:53:33 +0000
+
+slib (3a1-4.1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Build-depend on guile-1.6 instead of scm, since the new version of
+ scm is wedged in unstable (closes: #281809).
+
+ -- Steve Langasek <vorlon@debian.org> Sat, 8 Jan 2005 17:56:08 -0800
+
+slib (3a1-4) unstable; urgency=low
+
+ * Also check for expected creation on slibcat. (Closes: #240096)
+
+ -- James LewisMoss <dres@debian.org> Sun, 28 Mar 2004 17:29:19 -0500
+
+slib (3a1-3) unstable; urgency=low
+
+ * Also check for /usr/share/guile/1.6/slib before installing for guile
+ 1.6. (Closes: #239267)
+
+ -- James LewisMoss <dres@debian.org> Mon, 22 Mar 2004 20:53:40 -0500
+
+slib (3a1-2) unstable; urgency=low
+
+ * Add format.scm back into slib until gnucash stops using it.
+ * Call guile-1.6 new-catalog (Closes: #238231)
+
+ -- James LewisMoss <dres@debian.org> Sat, 20 Mar 2004 16:51:07 -0500
+
+slib (3a1-1) unstable; urgency=low
+
+ * New upstream release
+ * Remove Info section from doc-base file (Closes: #186950)
+ * Remove period from end of description (linda, lintian)
+ * html gen fixed upstream (Closes: #111778)
+
+ -- James LewisMoss <dres@debian.org> Sun, 14 Mar 2004 11:56:11 -0500
+
+slib (2d4-2) unstable; urgency=low
+
+ * Fix url for upstream source (Closes: #144981)
+ * Fix typo in slib.texi (enquque->enqueue) (Closes: #147475)
+ * Add build depends.
+
+ -- James LewisMoss <dres@debian.org> Thu, 23 May 2002 13:33:33 -0400
+
+slib (2d4-1) unstable; urgency=low
+
+ * New upstream.
+
+ -- James LewisMoss <dres@debian.org> Fri, 17 May 2002 11:23:06 -0400
+
+slib (2d3-1) unstable; urgency=low
+
+ * New upstream.
+ * Remove texi2html call in debian/rules. Now done upstream. Add make
+ html instead.
+ * Changes to rules and doc-base to conform to upstream html gen
+ * Clean up upstream makefile to make sure it cleans up after itself.
+
+ -- James LewisMoss <dres@debian.org> Sat, 6 Apr 2002 16:27:35 -0500
+
+slib (2d2-1) unstable; urgency=low
+
+ * New upstream version
+ * Revert back to free. Is now so.
+
+ -- James LewisMoss <dres@debian.org> Fri, 27 Jul 2001 23:45:29 -0400
+
+slib (2d1-1) unstable; urgency=low
+
+ * New upstream version.
+ * Move to non-free. FSF pointed out license doesn't allow modified
+ versions to be distributed.
+ * Get a complete list of copyrights that apply to the source into
+ copyright file.
+ * Remove setup for guile 1.3.
+ * Remove postrm. Just calling install-info (lintian) Move install-info
+ call to prerm since doc-base doesn't do install-info.
+
+ -- James LewisMoss <dres@debian.org> Mon, 21 May 2001 23:34:52 -0400
+
+slib (2c9-3) unstable; urgency=low
+
+ * Change info location to section "The Algorithmic Language Scheme" to
+ match up with where guile puts it's files.
+ * Postinst is running slibconfig now. (Closes: #75891)
+
+ -- James LewisMoss <dres@debian.org> Mon, 11 Dec 2000 03:39:43 -0500
+
+slib (2c9-2) unstable; urgency=low
+
+ * Stop installing slibconfig (for guile).
+ * In postinst if /usr/sbin/slibconnfig exists call it (Close: #75843
+ #75891).
+
+ -- James LewisMoss <dres@debian.org> Sun, 5 Nov 2000 00:10:51 -0500
+
+slib (2c9-1) unstable; urgency=low
+
+ * New upstream (Closes: #74760)
+ * replace string-index with strsrch:string-index in http-cgi.scm.
+ * Add doc-base support (Closes: #31163)
+
+ -- James LewisMoss <dres@debian.org> Sun, 22 Oct 2000 22:15:55 -0400
+
+slib (2c7-1) unstable; urgency=low
+
+ * New upstream.
+ * Add slibconfig back in.
+
+ -- James LewisMoss <dres@debian.org> Mon, 6 Dec 1999 19:32:57 -0500
+
+slib (2c6-2) unstable; urgency=low
+
+ * Remove the slib$(VERSION).info file. Cut the diff back down to
+ size.
+
+ -- James LewisMoss <dres@debian.org> Sat, 13 Nov 1999 14:10:38 -0500
+
+slib (2c6-1) unstable; urgency=low
+
+ * New upstream.
+ * Move docs to /usr/share. Up standards version. add /usr/doc symlink.
+ Move info files. Remove undocumented link.
+
+ -- James LewisMoss <dres@debian.org> Sat, 13 Nov 1999 12:56:18 -0500
+
+slib (2c5-6) unstable; urgency=low
+
+ * Lowercase two vars in yasyn.scm (Fixes bug #37222)
+
+ -- James LewisMoss <dres@debian.org> Sat, 10 Jul 1999 19:17:04 -0400
+
+slib (2c5-5) unstable; urgency=low
+
+ * Fix it so string-index isn't defined (now there is a
+ strsrch:string-index) (Fixes #38812)
+
+ -- James LewisMoss <dres@debian.org> Fri, 9 Jul 1999 21:30:19 -0400
+
+slib (2c5-4) unstable; urgency=low
+
+ * Don't run slibconfig in postinst. (Fixes bug #38253, #37733, #37715,
+ #37746, #37809, #37917, #38123, #38462)
+
+ -- James LewisMoss <dres@debian.org> Thu, 3 Jun 1999 20:19:53 -0400
+
+slib (2c5-3) unstable; urgency=low
+
+ * Run slibconfig in postinst. It was commented out there, but I don't
+ see any old bug reports on why it was commented out, so let's try
+ again. :) (Fixes bug #37221)
+
+ -- James LewisMoss <dres@debian.org> Wed, 12 May 1999 22:37:02 -0400
+
+slib (2c5-2) unstable; urgency=low
+
+ * Link mklibcat.scm to mklibcat. Fixes a problem with using slib with
+ guile.
+
+ -- James LewisMoss <dres@debian.org> Sun, 7 Mar 1999 21:51:35 -0500
+
+slib (2c5-1) unstable; urgency=low
+
+ * New upstream.
+
+ -- James LewisMoss <dres@debian.org> Sun, 7 Mar 1999 10:10:27 -0500
+
+slib (2c3-4) unstable; urgency=low
+
+ * New maintainer.
+
+ -- James LewisMoss <dres@debian.org> Fri, 26 Feb 1999 00:52:26 -0500
+
+slib (2c3-3) frozen unstable; urgency=low
+
+ * Fixes #16235.
+ * Fixes #19943.
+ * Fixes #20265.
+ * Fixes #24917.
+ * Fixes #27389.
+
+ -- David N. Welton <davidw@efn.org> Mon, 9 Nov 1998 21:18:01 -0800
+
+slib (2c3-2) frozen unstable; urgency=low
+
+ * Re-uploaded for slink freeze.
+
+ -- David N. Welton <davidw@efn.org> Mon, 2 Nov 1998 21:07:07 -0800
+
+slib (2c3-1) unstable; urgency=low
+
+ * New upstream release.
+
+ -- David N. Welton <davidw@efn.org> Mon, 26 Oct 1998 22:14:30 -0800
+
+slib (2c0-3) unstable; urgency=low
+
+ * New maintainer.
+ * slibconfig script to automatically configure guile.
+ * Fix type in description, closes: Bug#18996
+
+ -- Jim Pick <jim@jimpick.com> Sun, 8 Mar 1998 23:05:22 -0800
+
+slib (2c0-2) unstable; urgency=low
+
+ * Minor fix for debian/rules targets
+
+ -- Rob Browning <rlb@cs.utexas.edu> Fri, 12 Dec 1997 17:35:22 -0600
+
+slib (2c0-1) unstable; urgency=low
+
+ * New upstream source
+ * New maintainer
+
+ -- Rob Browning <rlb@cs.utexas.edu> Fri, 12 Dec 1997 16:49:13 -0600
+
+slib (2a6-1) unstable; urgency=low
+
+ * First Debian release.
+
+ -- Karl Sackett <krs@debian.org> Mon, 16 Dec 1996 09:23:46 -0600
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..084f82f
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,17 @@
+Source: slib
+Section: devel
+Priority: optional
+Maintainer: James LewisMoss <dres@debian.org>
+Build-Depends-Indep: guile-1.6, texi2html, texinfo
+Standards-Version: 3.1.0
+
+Package: slib
+Section: devel
+Priority: optional
+Architecture: all
+Description: Portable Scheme library
+ SLIB is a portable scheme library meant to provide compatibility and
+ utility functions for all standard scheme implementations. SLIB
+ includes initialization files for Chez, ELK 2.1, GAMBIT, MacScheme,
+ MITScheme, scheme->C, Scheme48, T3.1, and VSCM. SCM also supports
+ SLIB.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..0445f9e
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,580 @@
+This is the Debian GNU/Linux prepackaged version of slib.
+
+This package was put together by Rob Browning <rlb@cs.utexas.edu> and
+continued by James LewisMoss <dres@debian.org> from sources obtained
+from:
+
+ http://swissnet.ai.mit.edu/ftpdir/scm/slib2d4.zip
+
+For more information see:
+
+ http://www-swiss.ai.mit.edu/~jaffer/SLIB.html
+
+Following are a list of source files followed by the copyright that
+applies to them.
+
+alist.scm alistab.scm arraymap.scm batch.scm break.scm Bev2slib.scm
+chap.scm charplot.scm cltime.scm coerce.scm comparse.scm cring.scm
+db2html.scm dbrowse.scm dbutil.scm debug.scm dwindtst.scm dynwind.scm
+eval.scm factor.scm fft.scm fluidlet.scm getopt.scm getparam.scm
+hash.scm hashtab.scm htmlform.scm http-cgi.scm lineio.scm logical.scm
+makcrc.scm mklibcat.scm modular.scm mulapply.scm nclients.scm
+obj2str.scm paramlst.scm plottest.scm pnm.scm ppfile.scm prec.scm
+printf.scm priorque.scm process.scm psxtime.scm qp.scm randinex.scm
+random.scm rdms.scm repl.scm report.scm require.scm root.scm sc2.scm
+sc4opt.scm sc4sc3.scm scanf.scm scmacro.scm simetrix.scm structst.scm
+tek40.scm tek41.scm timezone.scm trace.scm trnscrpt.scm tzfile.scm
+uri.scm withfile.scm
+;Permission to copy this software, to redistribute it, and to use it
+;for any purpose is granted, subject to the following restrictions and
+;understandings.
+;
+;1. Any copy made of this software must include this copyright notice
+;in full.
+;
+;2. I have made no warrantee or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3. In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+format.scm formatst.scm Template.scm
+;;; "Template.scm" configuration template of *features* for Scheme -*-scheme-*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+array.scm
+;;;;"array.scm" Arrays for Scheme
+; Copyright (C) 1993 Alan Bawden
+;
+; Permission to copy this software, to redistribute it, and to use it
+; for any purpose is granted, subject to the following restrictions and
+; understandings.
+;
+; 1. Any copy made of this software must include this copyright notice
+; in full.
+;
+; 2. Users of this software agree to make their best efforts (a) to
+; return to me any improvements or extensions that they make, so that
+; these may be included in future releases; and (b) to inform me of
+; noteworthy uses of this software.
+;
+; 3. I have made no warrantee or representation that the operation of
+; this software will be error-free, and I am under no obligation to
+; provide any services, by way of maintenance, update, or otherwise.
+;
+; 4. In conjunction with products arising from the use of this material,
+; there shall be no use of my name in any advertising, promotional, or
+; sales literature without prior written consent in each case.
+;
+; Alan Bawden
+; MIT Room NE43-510
+; 545 Tech. Sq.
+; Cambridge, MA 02139
+; Alan@LCS.MIT.EDU
+byte.scm determ.scm mularg.scm
+;; NO COPYRIGHT
+collect.scm
+;"collect.scm" Sample collection operations
+; COPYRIGHT (c) Kenneth Dickey 1992
+;
+; This software may be used for any purpose whatever
+; without warrantee of any kind.
+; AUTHOR Ken Dickey
+; DATE 1992 September 1
+; LAST UPDATED 1992 September 2
+; NOTES Expository (optimizations & checks elided).
+; Requires YASOS (Yet Another Scheme Object System).
+comlist.scm
+;;"comlist.scm" Implementation of COMMON LISP list functions for Scheme
+; Copyright (C) 1991, 1993, 1995 Aubrey Jaffer.
+; Copyright (C) 2000 Colin Walters
+;
+;Permission to copy this software, to redistribute it, and to use it
+;for any purpose is granted, subject to the following restrictions and
+;understandings.
+;
+;1. Any copy made of this software must include this copyright notice
+;in full.
+;
+;2. I have made no warrantee or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3. In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+defmacex.scm
+;;;"defmacex.scm" defmacro:expand* for any Scheme dialect.
+;;;Copyright 1993-1994 Dorai Sitaram and Aubrey Jaffer.
+;
+;Permission to copy this software, to redistribute it, and to use it
+;for any purpose is granted, subject to the following restrictions and
+;understandings.
+;
+;1. Any copy made of this software must include this copyright notice
+;in full.
+;
+;2. I have made no warrantee or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3. In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+dynamic.scm
+; "dynamic.scm", DYNAMIC data type for Scheme
+; Copyright 1992 Andrew Wilcox.
+;
+; You may freely copy, redistribute and modify this package.
+genwrite.scm
+;;"genwrite.scm" generic write used by pretty-print and truncated-print.
+;; Copyright (c) 1991, Marc Feeley
+;; Author: Marc Feeley (feeley@iro.umontreal.ca)
+;; Distribution restrictions: none
+glob.scm
+;;; "glob.scm" String matching for filenames (a la BASH).
+;;; Copyright (C) 1998 Radey Shouman.
+;
+;Permission to copy this software, to redistribute it, and to use it
+;for any purpose is granted, subject to the following restrictions and
+;understandings.
+;
+;1. Any copy made of this software must include this copyright notice
+;in full.
+;
+;2. I have made no warrantee or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3. In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+macrotst.scm
+;;;"macrotst.scm" Test for R4RS Macros
+;;; From Revised^4 Report on the Algorithmic Language Scheme
+;;; Editors: William Clinger and Jonathon Rees
+;
+; We intend this report to belong to the entire Scheme community, and so
+; we grant permission to copy it in whole or in part without fee. In
+; particular, we encourage implementors of Scheme to use this report as
+; a starting point for manuals and other documentation, modifying it as
+; necessary.
+macwork.scm mwdenote.scm mwexpand.scm mwsynrul.scm
+;;;; "macwork.scm": Will Clinger's macros that work. -*- Scheme -*-
+;Copyright 1992 William Clinger
+;
+; Permission to copy this software, in whole or in part, to use this
+; software for any lawful purpose, and to redistribute this software
+; is granted subject to the restriction that all copies made of this
+; software must include this copyright notice in full.
+;
+; I also request that you send me a copy of any improvements that you
+; make to this software so that they may be incorporated within it to
+; the benefit of the Scheme community.
+mbe.scm
+;;;; "mbe.scm" "Macro by Example" (Eugene Kohlbecker, R4RS)
+;;; From: Dorai Sitaram, dorai@cs.rice.edu, 1991, 1999
+;
+;Permission to copy this software, to redistribute it, and to use it
+;for any purpose is granted, subject to the following restrictions and
+;understandings.
+;
+;1. Any copy made of this software must include this copyright notice
+;in full.
+;
+;2. I have made no warrantee or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3. In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+minimize.scm
+;;; "minimize.scm" finds minimum f(x) for x0 <= x <= x1.
+;;; Author: Lars Arvestad
+;;;
+;;; This code is in the public domain.
+object.scm
+;;; "object.scm" Macroless Object System
+;;;From: whumeniu@datap.ca (Wade Humeniuk)
+pp.scm
+;"pp.scm" Pretty-Print
+promise.scm
+;;;"promise.scm" promise for force and delay
+;;; From Revised^4 Report on the Algorithmic Language Scheme
+;;; Editors: William Clinger and Jonathon Rees
+;
+; We intend this report to belong to the entire Scheme community, and so
+; we grant permission to copy it in whole or in part without fee. In
+; particular, we encourage implementors of Scheme to use this report as
+; a starting point for manuals and other documentation, modifying it as
+; necessary.
+queue.scm
+; "queue.scm" Queues/Stacks for Scheme
+; Written by Andrew Wilcox (awilcox@astro.psu.edu) on April 1, 1992.
+;
+; This code is in the public domain.
+r4rsyn.scm synchk.scm synclo.scm synrul.scm
+;;; "r4rsyn.scm" R4RS syntax -*-Scheme-*-
+;;; Copyright (c) 1989-91 Massachusetts Institute of Technology
+;;;
+;;; This material was developed by the Scheme project at the
+;;; Massachusetts Institute of Technology, Department of Electrical
+;;; Engineering and Computer Science. Permission to copy this
+;;; software, to redistribute it, and to use it for any purpose is
+;;; granted, subject to the following restrictions and understandings.
+;;;
+;;; 1. Any copy made of this software must include this copyright
+;;; notice in full.
+;;;
+;;; 2. Users of this software agree to make their best efforts (a) to
+;;; return to the MIT Scheme project any improvements or extensions
+;;; that they make, so that these may be included in future releases;
+;;; and (b) to inform MIT of noteworthy uses of this software.
+;;;
+;;; 3. All materials developed as a consequence of the use of this
+;;; software shall duly acknowledge such use, in accordance with the
+;;; usual standards of acknowledging credit in academic research.
+;;;
+;;; 4. MIT has made no warrantee or representation that the operation
+;;; of this software will be error-free, and MIT is under no
+;;; obligation to provide any services, by way of maintenance, update,
+;;; or otherwise.
+;;;
+;;; 5. In conjunction with products arising from the use of this
+;;; material, there shall be no use of the name of the Massachusetts
+;;; Institute of Technology nor of any adaptation thereof in any
+;;; advertising, promotional, or sales literature without prior
+;;; written consent from MIT in each case.
+ratize.scm
+;;;; "ratize.scm" Find simplest number ratios
+recobj.scm
+;;; "recobj.scm" Records implemented as objects.
+;;;From: whumeniu@datap.ca (Wade Humeniuk)
+record.scm
+; "record.scm" record data types
+; Written by David Carlton, carlton@husc.harvard.edu.
+; Re-Written by Aubrey Jaffer, jaffer@ai.mit.edu, 1996, 1997
+;
+; This code is in the public domain.
+scaexpp.scm scaglob.scm scainit.scm scamacr.scm scaoutp.scm structure.scm
+;;; "scaoutp.scm" syntax-case output
+;;; Copyright (C) 1992 R. Kent Dybvig
+;;;
+;;; Permission to copy this software, in whole or in part, to use this
+;;; software for any lawful purpose, and to redistribute this software
+;;; is granted subject to the restriction that all copies made of this
+;;; software must include this copyright notice in full. This software
+;;; is provided AS IS, with NO WARRANTY, EITHER EXPRESS OR IMPLIED,
+;;; INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY
+;;; OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT SHALL THE
+;;; AUTHORS BE LIABLE FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES OF ANY
+;;; NATURE WHATSOEVER.
+schmooz.scm
+;;; "schmooz.scm" Program for extracting texinfo comments from Scheme.
+;;; Copyright (C) 1998, 2000 Radey Shouman and Aubrey Jaffer.
+;
+;Permission to copy this software, to redistribute it, and to use it
+;for any purpose is granted, subject to the following restrictions and
+;understandings.
+;
+;1. Any copy made of this software must include this copyright notice
+;in full.
+;
+;2. I have made no warrantee or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3. In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+scmactst.scm
+;;;"scmactst.scm" test syntactic closures macros
+;;; From "sc-macro.doc", A Syntactic Closures Macro Facility by Chris Hanson
+selfset.scm
+;;"selfset.scm" Set single letter identifiers to their symbols.
+sierpinski.scm
+;"sierpinski.scm" Hash function for 2d data which preserves nearness.
+;From: jjb@isye.gatech.edu (John Bartholdi)
+;
+; This code is in the public domain.
+sort.scm
+;;; "sort.scm" Defines: sorted?, merge, merge!, sort, sort!
+;;; Author : Richard A. O'Keefe (based on Prolog code by D.H.D.Warren)
+;;;
+;;; This code is in the public domain.
+soundex.scm
+;"soundex.scm" Original SOUNDEX algorithm.
+;From jjb@isye.gatech.edu Mon May 2 22:29:43 1994
+;
+; This code is in the public domain.
+stdio.scm
+;; "stdio.scm" compatability stub
+strcase.scm
+;;; "strcase.scm" String casing functions.
+; Written 1992 by Dirk Lutzebaeck (lutzeb@cs.tu-berlin.de)
+;
+; This code is in the public domain.
+strport.scm
+;;;;"strport.scm" Portable string ports for Scheme
+;;;Copyright 1993 Dorai Sitaram and Aubrey Jaffer.
+;
+;Permission to copy this software, to redistribute it, and to use it
+;for any purpose is granted, subject to the following restrictions and
+;understandings.
+;
+;1. Any copy made of this software must include this copyright notice
+;in full.
+;
+;2. I have made no warrantee or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3. In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+strsrch.scm
+;;; "MISCIO" Search for string from port.
+; Written 1995, 1996 by Oleg Kiselyov (oleg@ponder.csci.unt.edu)
+; Modified 1996, 1997, 1998 by A. Jaffer (jaffer@ai.mit.edu)
+;
+; This code is in the public domain.
+struct.scm
+;;; "struct.scm": defmacros for RECORDS
+;;; Copyright 1992 Jeff Alexander, Shinnder Lee, and Lewis Patterson
+tree.scm
+;;"tree.scm" Implementation of COMMON LISP tree functions for Scheme
+; Copyright 1993, 1994 David Love (d.love@dl.ac.uk)
+;
+;Permission to copy this software, to redistribute it, and to use it
+;for any purpose is granted, subject to the following restrictions and
+;understandings.
+;
+;1. Any copy made of this software must include this copyright notice
+;in full.
+;
+;2. I have made no warrantee or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3. In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+tsort.scm
+;;; "tsort.scm" Topological sort
+;;; Copyright (C) 1995 Mikael Djurfeldt
+;
+; This code is in the public domain.
+values.scm
+;"values.scm" multiple values
+;By david carlton, carlton@husc.harvard.edu.
+;
+;This code is in the public domain.
+wttest.scm
+;; "wttrtst.scm" Test Weight balanced trees -*-Scheme-*-
+;; Copyright (c) 1993-1994 Stephen Adams
+;;
+;; Copyright (c) 1993-94 Massachusetts Institute of Technology
+;;
+;; This material was developed by the Scheme project at the Massachusetts
+;; Institute of Technology, Department of Electrical Engineering and
+;; Computer Science. Permission to copy this software, to redistribute
+;; it, and to use it for any purpose is granted, subject to the following
+;; restrictions and understandings.
+;;
+;; 1. Any copy made of this software must include this copyright notice
+;; in full.
+;;
+;; 2. Users of this software agree to make their best efforts (a) to
+;; return to the MIT Scheme project any improvements or extensions that
+;; they make, so that these may be included in future releases; and (b)
+;; to inform MIT of noteworthy uses of this software.
+;;
+;; 3. All materials developed as a consequence of the use of this
+;; software shall duly acknowledge such use, in accordance with the usual
+;; standards of acknowledging credit in academic research.
+;;
+;; 4. MIT has made no warrantee or representation that the operation of
+;; this software will be error-free, and MIT is under no obligation to
+;; provide any services, by way of maintenance, update, or otherwise.
+;;
+;; 5. In conjunction with products arising from the use of this material,
+;; there shall be no use of the name of the Massachusetts Institute of
+;; Technology nor of any adaptation thereof in any advertising,
+;; promotional, or sales literature without prior written consent from
+;; MIT in each case.
+wttree.scm
+;; "wttree.scm" Weight balanced trees -*-Scheme-*-
+;; Copyright (c) 1993-1994 Stephen Adams
+;;
+;; $Id: wttree.scm,v 1.3 1999/10/11 03:36:29 jaffer Exp $
+;;
+;; References:
+;;
+;; Stephen Adams, Implemeting Sets Efficiently in a Functional
+;; Language, CSTR 92-10, Department of Electronics and Computer
+;; Science, University of Southampton, 1992
+;;
+;;
+;; Copyright (c) 1993-94 Massachusetts Institute of Technology
+;;
+;; This material was developed by the Scheme project at the Massachusetts
+;; Institute of Technology, Department of Electrical Engineering and
+;; Computer Science. Permission to copy this software, to redistribute
+;; it, and to use it for any purpose is granted, subject to the following
+;; restrictions and understandings.
+;;
+;; 1. Any copy made of this software must include this copyright notice
+;; in full.
+;;
+;; 2. Users of this software agree to make their best efforts (a) to
+;; return to the MIT Scheme project any improvements or extensions that
+;; they make, so that these may be included in future releases; and (b)
+;; to inform MIT of noteworthy uses of this software.
+;;
+;; 3. All materials developed as a consequence of the use of this
+;; software shall duly acknowledge such use, in accordance with the usual
+;; standards of acknowledging credit in academic research.
+;;
+;; 4. MIT has made no warrantee or representation that the operation of
+;; this software will be error-free, and MIT is under no obligation to
+;; provide any services, by way of maintenance, update, or otherwise.
+;;
+;; 5. In conjunction with products arising from the use of this material,
+;; there shall be no use of the name of the Massachusetts Institute of
+;; Technology nor of any adaptation thereof in any advertising,
+;; promotional, or sales literature without prior written consent from
+;; MIT in each case.
+yasyn.scm
+;;"yasyn.scm" YASOS in terms of "object.scm"
+;;;From: whumeniu@datap.ca (Wade Humeniuk)
+DrScheme.init
+;;;"DrScheme.init" Initialization for SLIB for DrScheme -*-scheme-*-
+;; Friedrich Dominicus <frido@q-software-solutions.com>
+;; Newsgroups: comp.lang.scheme
+;; Date: 02 Oct 2000 09:24:57 +0200
+RScheme.init
+;;;"RScheme.init" Initialization for SLIB for RScheme -*-scheme-*-
+;;;; From http://www.rscheme.org/rs/pg1/RScheme.scm
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+;;;
+;;; adapted for RScheme by Donovan Kolbly -- (v1 1997-09-14)
+;;;
+;Permission to copy this software, to redistribute it, and to use it
+;for any purpose is granted, subject to the following restrictions and
+;understandings.
+;
+;1. Any copy made of this software must include this copyright notice
+;in full.
+;
+;2. I have made no warrantee or representation that the operation of
+;this software will be error-free, and I am under no obligation to
+;provide any services, by way of maintenance, update, or otherwise.
+;
+;3. In conjunction with products arising from the use of this
+;material, there shall be no use of my name in any advertising,
+;promotional, or sales literature without prior written consent in
+;each case.
+STk.init
+;;;"STk.init" SLIB Initialization for STk -*-scheme-*-
+;;; Authors: Erick Gallesio (eg@unice.fr) and Aubrey Jaffer.
+;;;
+;;; This code is in the public domain.
+bigloo.init
+;; "bigloo.init" Initialization for SLIB for Bigloo -*-scheme-*-
+;; Copyright 1994 Robert Sanders
+;; Copyright 1991, 1992, 1993 Aubrey Jaffer
+;; Copyright 1991 David Love
+;;
+;; Permission to copy this software, to redistribute it, and to use it
+;; for any purpose is granted, subject to the following restrictions and
+;; understandings.
+;;
+;; 1. Any copy made of this software must include this copyright notice
+;; in full.
+;;
+;; 2. I have made no warrantee or representation that the operation of
+;; this software will be error-free, and I am under no obligation to
+;; provide any services, by way of maintenance, update, or otherwise.
+;;
+;; 3. In conjunction with products arising from the use of this
+;; material, there shall be no use of my name in any advertising,
+;; promotional, or sales literature without prior written consent in
+;; each case.
+chez.init
+;;;"chez.init" Initialization file for SLIB for Chez Scheme 6.0a -*-scheme-*-
+;;; Authors: dorai@cs.rice.edu (Dorai Sitaram) and Aubrey Jaffer.
+;;;
+;;; This code is in the public domain.
+elk.init
+;;;"elk.init" Initialisation file for SLIB for ELK 2.1 -*- Scheme -*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+gambit.init
+;;;"gambit.init" Initialization for SLIB for Gambit -*-scheme-*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+macscheme.init
+;;;"macscheme.init" Configuration of *features* for MacScheme -*-scheme-*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+mitscheme.init
+;;;"mitscheme.init" Initialization for SLIB for MITScheme -*-scheme-*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+pscheme.init
+;;; "pscheme.init" SLIB init file for Pocket Scheme -*-scheme-*-
+;;; Author: Ben Goetter <goetter@mazama.net>
+;;; last revised for 1.1.0 on 16 October 2000
+;;; Initial work for 0.2.3 by Robert Goldman (goldman@htc.honeywell.com)
+;;; SLIB orig Author: Aubrey Jaffer (jaffer@ai.mit.edu)
+;;;
+;;; This code is in the public domain.
+scheme2c.init
+;;; "scheme2c.init" Initialisation for SLIB for Scheme->C on Sun -*-scheme-*-
+;;; Authors: David Love and Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+scheme48.init
+;;;"scheme48.init" Initialisation for SLIB for Scheme48 -*-scheme-*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+scm.init
+;"scm.init" Configuration file for SLIB for SCM -*-scheme-*-
+scsh.init
+;;; "scsh.init" Initialisation for SLIB for Scsh 0.5.1 -*-scheme-*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+t3.init
+;;; "t3.init" Initialization file for SLIB for T3.1. -*-scheme-*-
+;;; Authors: David Carlton, Stephen Bevan, F. Javier Thayer, and Aubrey Jaffer.
+;;;
+;;; This code is in the public domain.
+umbscheme.init
+;;; "umbscheme.init" Initialization for SLIB for umb-scheme -*-scheme-*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+vscm.init
+;;; "vscm.init" Configuration of *features* for VSCM -*-scheme-*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
diff --git a/debian/doc-base b/debian/doc-base
new file mode 100644
index 0000000..dc4d265
--- /dev/null
+++ b/debian/doc-base
@@ -0,0 +1,10 @@
+Document: slib
+Title: slib Scheme library documentation
+Author: Aubrey Jaffer
+Abstract: This manual describes the facilities and functions
+ provided by the slib scheme library.
+Section: Apps/Programming
+
+Format: HTML
+Index: /usr/share/doc/slib/slib_toc.html
+Files: /usr/share/doc/slib/slib_*.html
diff --git a/debian/postinst b/debian/postinst
new file mode 100644
index 0000000..88aa502
--- /dev/null
+++ b/debian/postinst
@@ -0,0 +1,31 @@
+#!/bin/sh
+set -e
+
+install-info --quiet --section "The Algorithmic Language Scheme" \
+ "The Algorithmic Language Scheme" \
+ --description="The SLIB portable Scheme library" \
+ /usr/share/info/slib.info.gz
+
+# OK. This is bad because it really should be in the guile config or
+# in some emacs-commond sort of package. Now we conditionally run it.
+# one of these probably shouldn't exist, but don't know which and
+# probably shourld support the older.
+if [ -x /usr/sbin/guile1.4-slibconfig ] ; then
+ echo Running /usr/sbin/guile1.4-slibconfig
+ /usr/sbin/guile1.4-slibconfig
+fi
+
+if [ -x /usr/bin/guile-1.6 -a -e /usr/share/guile/1.6/slib ] ; then
+ rm -f /usr/share/guile/1.6/slibcat
+ /usr/bin/guile-1.6 -c "(use-modules (ice-9 slib)) (require 'new-catalog)"
+ if [ -e /usr/share/guile/1.6/slibcat ] ; then
+ chmod 644 /usr/share/guile/1.6/slibcat
+ fi
+fi
+
+# doc base support
+if [ "$1" = configure ]; then
+ if command -v install-docs >/dev/null 2>&1; then
+ install-docs -i /usr/share/doc-base/slib
+ fi
+fi
diff --git a/debian/prerm b/debian/prerm
new file mode 100644
index 0000000..3dbde02
--- /dev/null
+++ b/debian/prerm
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+set -e
+
+if [ \( "$1" = "upgrade" -o "$1" = "remove" \) -a -L /usr/doc/slib ]; then
+ rm -f /usr/doc/slib
+fi
+
+# doc base support
+if [ "$1" = remove -o "$1" = upgrade ]; then
+ if command -v install-docs >/dev/null 2>&1; then
+ install-docs -r slib
+ fi
+fi
+
+install-info --quiet --remove /usr/share/info/slib.info.gz
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..ed0da6b
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,96 @@
+#! /usr/bin/make -f
+# -*-Makefile-*-
+
+SCHEME_LIBRARY_PATH=./
+export SCHEME_LIBRARY_PATH
+
+CC =gcc
+CFLAGS =-O2 -g -Wall
+LDFLAGS =
+
+SHELL =/bin/sh
+srcdir =.
+
+INSTALL =/usr/bin/install
+INSTALL_DIR =$(INSTALL) -d -m 755 -o root -g root
+INSTALL_PROGRAM =$(INSTALL) -m 755 -o root -g root
+INSTALL_DATA =$(INSTALL) -m 644 -o root -g root
+INSTALL_MAN =$(INSTALL) -m 444 -o root -g root
+
+build:
+ $(checkdir)
+ make
+ make html
+ touch build
+
+clean:
+ $(checkdir)
+ -rm slib.info*
+ make clean
+ -rm -f build
+ -rm -rf debian/tmp* *~ debian/*~ debian/files debian/substvars
+
+binary-arch: checkroot
+ $(checkdir)
+
+binary-indep: checkroot build
+ $(checkdir)
+ -rm -rf debian/tmp*
+
+# debian/tmp
+ $(INSTALL_DIR) debian/tmp
+ $(INSTALL_DIR) debian/tmp/DEBIAN
+ $(INSTALL_PROGRAM) debian/postinst debian/tmp/DEBIAN
+ $(INSTALL_PROGRAM) debian/prerm debian/tmp/DEBIAN
+
+# library
+ $(INSTALL_DIR) debian/tmp/usr/share/slib
+ $(INSTALL_DATA) *.scm debian/tmp/usr/share/slib
+ # this fixes a load problem with guile
+ ( cd debian/tmp/usr/share/slib ; ln -s mklibcat.scm mklibcat )
+
+# documentation
+ $(INSTALL_DIR) debian/tmp/usr/share/doc/slib
+ $(INSTALL_DATA) debian/copyright debian/tmp/usr/share/doc/slib
+ $(INSTALL_DATA) debian/changelog \
+ debian/tmp/usr/share/doc/slib/changelog.Debian
+ gzip -9v debian/tmp/usr/share/doc/slib/changelog.Debian
+
+ $(INSTALL_DATA) ChangeLog debian/tmp/usr/share/doc/slib/changelog
+ gzip -9v debian/tmp/usr/share/doc/slib/changelog
+ $(INSTALL_DATA) README debian/tmp/usr/share/doc/slib
+ gzip -9v debian/tmp/usr/share/doc/slib/README
+ $(INSTALL_DATA) FAQ debian/tmp/usr/share/doc/slib
+ gzip -9v debian/tmp/usr/share/doc/slib/FAQ
+ $(INSTALL_DATA) slib_html/*.html debian/tmp/usr/share/doc/slib
+
+ $(INSTALL_DIR) debian/tmp/usr/share/slib/init
+ $(INSTALL_DATA) *.init debian/tmp/usr/share/slib/init
+
+ $(INSTALL_DIR) debian/tmp/usr/share/doc-base
+ $(INSTALL_DATA) debian/doc-base debian/tmp/usr/share/doc-base/slib
+
+# info pages
+ $(INSTALL_DIR) debian/tmp/usr/share/info
+ $(INSTALL_DATA) slib.info* debian/tmp/usr/share/info
+ gzip -9v debian/tmp/usr/share/info/*
+
+# slibconfig
+
+ #$(INSTALL_DIR) debian/tmp/usr/sbin
+ #$(INSTALL_PROGRAM) debian/slibconfig debian/tmp/usr/sbin
+
+ dpkg-gencontrol -is -ip
+ dpkg --build debian/tmp ..
+
+define checkdir
+ test -f slib.texi -a -f debian/rules
+endef
+
+binary: binary-indep binary-arch
+
+checkroot:
+ $(checkdir)
+ test root = "`whoami`"
+
+.PHONY: config build clean binary binary-arch binary-indep
diff --git a/debian/slibconfig b/debian/slibconfig
new file mode 100644
index 0000000..05eee30
--- /dev/null
+++ b/debian/slibconfig
@@ -0,0 +1,7 @@
+#! /bin/sh
+
+if [ -d /usr/share/guile -a -x /usr/bin/guile ]; then
+ (cd /usr/share/guile
+ guile -c "(use-modules (ice-9 slib)) (require 'new-catalog)"
+ )
+fi
diff --git a/format.scm b/format.scm
new file mode 100644
index 0000000..c9e1d12
--- /dev/null
+++ b/format.scm
@@ -0,0 +1,1688 @@
+;;; "format.scm" Common LISP text output formatter for SLIB
+; Written 1992-1994 by Dirk Lutzebaeck (lutzeb@cs.tu-berlin.de)
+;
+; This code is in the public domain.
+
+; Authors of the original version (< 1.4) were Ken Dickey and Aubrey Jaffer.
+; Please send error reports to the email address above.
+; For documentation see slib.texi and format.doc.
+; For testing load formatst.scm.
+;
+; Version 3.0
+
+(provide 'format)
+(require 'string-case)
+(require 'string-port)
+(require 'multiarg/and-)
+(require 'rev4-optional-procedures)
+
+;;; Configuration ------------------------------------------------------------
+
+(define format:symbol-case-conv #f)
+;; Symbols are converted by symbol->string so the case of the printed
+;; symbols is implementation dependent. format:symbol-case-conv is a
+;; one arg closure which is either #f (no conversion), string-upcase!,
+;; string-downcase! or string-capitalize!.
+
+(define format:iobj-case-conv #f)
+;; As format:symbol-case-conv but applies for the representation of
+;; implementation internal objects.
+
+(define format:expch #\E)
+;; The character prefixing the exponent value in ~e printing.
+
+(define format:iteration-bounded #t)
+;; If #t, "~{...~}" iterates no more than format:max-iterations times;
+;; if #f, there is no bound.
+
+(define format:max-iterations 100)
+;; Compatible with previous versions.
+
+(define format:floats (provided? 'inexact))
+;; Detects if the scheme system implements flonums (see at eof).
+
+(define format:complex-numbers (provided? 'complex))
+;; Detects if the scheme system implements complex numbers.
+
+(define format:radix-pref (char=? #\# (string-ref (number->string 8 8) 0)))
+;; Detects if number->string adds a radix prefix.
+
+(define format:ascii-non-printable-charnames
+ '#("nul" "soh" "stx" "etx" "eot" "enq" "ack" "bel"
+ "bs" "ht" "nl" "vt" "np" "cr" "so" "si"
+ "dle" "dc1" "dc2" "dc3" "dc4" "nak" "syn" "etb"
+ "can" "em" "sub" "esc" "fs" "gs" "rs" "us" "space"))
+
+;;; End of configuration ----------------------------------------------------
+
+(define format:version "3.0")
+(define format:port #f) ; curr. format output port
+(define format:output-col 0) ; curr. format output tty column
+(define format:flush-output #f) ; flush output at end of formatting
+(define format:case-conversion #f)
+(define format:error-continuation #f)
+(define format:args #f)
+(define format:pos 0) ; curr. format string parsing position
+(define format:arg-pos 0) ; curr. format argument position
+ ; this is global for error presentation
+
+; format string and char output routines on format:port
+
+(define (format:out-str str)
+ (if format:case-conversion
+ (display (format:case-conversion str) format:port)
+ (display str format:port))
+ (set! format:output-col
+ (+ format:output-col (string-length str))))
+
+(define (format:out-char ch)
+ (if format:case-conversion
+ (display (format:case-conversion (string ch)) format:port)
+ (write-char ch format:port))
+ (set! format:output-col
+ (if (char=? ch #\newline)
+ 0
+ (+ format:output-col 1))))
+
+;(define (format:out-substr str i n) ; this allocates a new string
+; (display (substring str i n) format:port)
+; (set! format:output-col (+ format:output-col n)))
+
+(define (format:out-substr str i n)
+ (do ((k i (+ k 1)))
+ ((= k n))
+ (write-char (string-ref str k) format:port))
+ (set! format:output-col (+ format:output-col n)))
+
+;(define (format:out-fill n ch) ; this allocates a new string
+; (format:out-str (make-string n ch)))
+
+(define (format:out-fill n ch)
+ (do ((i 0 (+ i 1)))
+ ((= i n))
+ (write-char ch format:port))
+ (set! format:output-col (+ format:output-col n)))
+
+; format's user error handler
+
+(define (format:error . args) ; never returns!
+ (let ((error-continuation format:error-continuation)
+ (format-args format:args)
+ (port (current-error-port)))
+ (set! format:error format:intern-error)
+ (if (and (>= (length format:args) 2)
+ (string? (cadr format:args)))
+ (let ((format-string (cadr format-args)))
+ (if (not (zero? format:arg-pos))
+ (set! format:arg-pos (- format:arg-pos 1)))
+ (format port "~%FORMAT: error with call: (format ~a \"~a<===~a\" ~
+ ~{~a ~}===>~{~a ~})~% "
+ (car format:args)
+ (substring format-string 0 format:pos)
+ (substring format-string format:pos
+ (string-length format-string))
+ (format:list-head (cddr format:args) format:arg-pos)
+ (list-tail (cddr format:args) format:arg-pos)))
+ (format port
+ "~%FORMAT: error with call: (format~{ ~a~})~% "
+ format:args))
+ (apply format port args)
+ (newline port)
+ (set! format:error format:error-save)
+ (set! format:error-continuation error-continuation)
+ (format:abort)
+ (format:intern-error "format:abort does not jump to toplevel!")))
+
+(define format:error-save format:error)
+
+(define (format:intern-error . args) ;if something goes wrong in format:error
+ (display "FORMAT: INTERNAL ERROR IN FORMAT:ERROR!") (newline)
+ (display " format args: ") (write format:args) (newline)
+ (display " error args: ") (write args) (newline)
+ (set! format:error format:error-save)
+ (format:abort))
+
+(define (format:format . args) ; the formatter entry
+ (set! format:args args)
+ (set! format:arg-pos 0)
+ (set! format:pos 0)
+ (if (< (length args) 1)
+ (format:error "not enough arguments"))
+
+ ;; If the first argument is a string, then that's the format string.
+ ;; (Scheme->C)
+ ;; In this case, put the argument list in canonical form.
+ (let ((args (if (string? (car args))
+ (cons #f args)
+ args)))
+ ;; Use this canonicalized version when reporting errors.
+ (set! format:args args)
+
+ (let ((destination (car args))
+ (arglist (cdr args)))
+ (cond
+ ((or (and (boolean? destination) ; port output
+ destination)
+ (output-port? destination)
+ (number? destination))
+ (format:out (cond
+ ((boolean? destination) (current-output-port))
+ ((output-port? destination) destination)
+ ((number? destination) (current-error-port)))
+ (car arglist) (cdr arglist)))
+ ((and (boolean? destination) ; string output
+ (not destination))
+ (call-with-output-string
+ (lambda (port) (format:out port (car arglist) (cdr arglist)))))
+ (else
+ (format:error "illegal destination `~a'" destination))))))
+
+(define (format:out port fmt args) ; the output handler for a port
+ (set! format:port port) ; global port for output routines
+ (set! format:case-conversion #f) ; modifier case conversion procedure
+ (set! format:flush-output #f) ; ~! reset
+ (let ((arg-pos (format:format-work fmt args))
+ (arg-len (length args)))
+ (cond
+ ((< arg-pos arg-len)
+ (set! format:arg-pos (+ arg-pos 1))
+ (set! format:pos (string-length fmt))
+ (format:error "~a superfluous argument~:p" (- arg-len arg-pos)))
+ ((> arg-pos arg-len)
+ (set! format:arg-pos (+ arg-len 1))
+ (display format:arg-pos)
+ (format:error "~a missing argument~:p" (- arg-pos arg-len)))
+ (else
+ (if format:flush-output (force-output port))
+ #t))))
+
+(define format:parameter-characters
+ '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\- #\+ #\v #\# #\'))
+
+(define (format:format-work format-string arglist) ; does the formatting work
+ (letrec
+ ((format-string-len (string-length format-string))
+ (arg-pos 0) ; argument position in arglist
+ (arg-len (length arglist)) ; number of arguments
+ (modifier #f) ; 'colon | 'at | 'colon-at | #f
+ (params '()) ; directive parameter list
+ (param-value-found #f) ; a directive parameter value found
+ (conditional-nest 0) ; conditional nesting level
+ (clause-pos 0) ; last cond. clause beginning char pos
+ (clause-default #f) ; conditional default clause string
+ (clauses '()) ; conditional clause string list
+ (conditional-type #f) ; reflects the contional modifiers
+ (conditional-arg #f) ; argument to apply the conditional
+ (iteration-nest 0) ; iteration nesting level
+ (iteration-pos 0) ; iteration string beginning char pos
+ (iteration-type #f) ; reflects the iteration modifiers
+ (max-iterations #f) ; maximum number of iterations
+ (recursive-pos-save format:pos)
+
+ (next-char ; gets the next char from format-string
+ (lambda ()
+ (let ((ch (peek-next-char)))
+ (set! format:pos (+ 1 format:pos))
+ ch)))
+
+ (peek-next-char
+ (lambda ()
+ (if (>= format:pos format-string-len)
+ (format:error "illegal format string")
+ (string-ref format-string format:pos))))
+
+ (one-positive-integer?
+ (lambda (params)
+ (cond
+ ((null? params) #f)
+ ((and (integer? (car params))
+ (>= (car params) 0)
+ (= (length params) 1)) #t)
+ (else (format:error "one positive integer parameter expected")))))
+
+ (next-arg
+ (lambda ()
+ (if (>= arg-pos arg-len)
+ (begin
+ (set! format:arg-pos (+ arg-len 1))
+ (format:error "missing argument(s)")))
+ (add-arg-pos 1)
+ (list-ref arglist (- arg-pos 1))))
+
+ (prev-arg
+ (lambda ()
+ (add-arg-pos -1)
+ (if (negative? arg-pos)
+ (format:error "missing backward argument(s)"))
+ (list-ref arglist arg-pos)))
+
+ (rest-args
+ (lambda ()
+ (let loop ((l arglist) (k arg-pos)) ; list-tail definition
+ (if (= k 0) l (loop (cdr l) (- k 1))))))
+
+ (add-arg-pos
+ (lambda (n)
+ (set! arg-pos (+ n arg-pos))
+ (set! format:arg-pos arg-pos)))
+
+ (anychar-dispatch ; dispatches the format-string
+ (lambda ()
+ (if (>= format:pos format-string-len)
+ arg-pos ; used for ~? continuance
+ (let ((char (next-char)))
+ (cond
+ ((char=? char #\~)
+ (set! modifier #f)
+ (set! params '())
+ (set! param-value-found #f)
+ (tilde-dispatch))
+ (else
+ (if (and (zero? conditional-nest)
+ (zero? iteration-nest))
+ (format:out-char char))
+ (anychar-dispatch)))))))
+
+ (tilde-dispatch
+ (lambda ()
+ (cond
+ ((>= format:pos format-string-len)
+ (format:out-str "~") ; tilde at end of string is just output
+ arg-pos) ; used for ~? continuance
+ ((and (or (zero? conditional-nest)
+ (memv (peek-next-char) ; find conditional directives
+ (append '(#\[ #\] #\; #\: #\@ #\^)
+ format:parameter-characters)))
+ (or (zero? iteration-nest)
+ (memv (peek-next-char) ; find iteration directives
+ (append '(#\{ #\} #\: #\@ #\^)
+ format:parameter-characters))))
+ (case (char-upcase (next-char))
+
+ ;; format directives
+
+ ((#\A) ; Any -- for humans
+ (set! format:read-proof (memq modifier '(colon colon-at)))
+ (format:out-obj-padded (memq modifier '(at colon-at))
+ (next-arg) #f params)
+ (anychar-dispatch))
+ ((#\S) ; Slashified -- for parsers
+ (set! format:read-proof (memq modifier '(colon colon-at)))
+ (format:out-obj-padded (memq modifier '(at colon-at))
+ (next-arg) #t params)
+ (anychar-dispatch))
+ ((#\D) ; Decimal
+ (format:out-num-padded modifier (next-arg) params 10)
+ (anychar-dispatch))
+ ((#\X) ; Hexadecimal
+ (format:out-num-padded modifier (next-arg) params 16)
+ (anychar-dispatch))
+ ((#\O) ; Octal
+ (format:out-num-padded modifier (next-arg) params 8)
+ (anychar-dispatch))
+ ((#\B) ; Binary
+ (format:out-num-padded modifier (next-arg) params 2)
+ (anychar-dispatch))
+ ((#\R)
+ (if (null? params)
+ (format:out-obj-padded ; Roman, cardinal, ordinal numerals
+ #f
+ ((case modifier
+ ((at) format:num->roman)
+ ((colon-at) format:num->old-roman)
+ ((colon) format:num->ordinal)
+ (else format:num->cardinal))
+ (next-arg))
+ #f params)
+ (format:out-num-padded ; any Radix
+ modifier (next-arg) (cdr params) (car params)))
+ (anychar-dispatch))
+ ((#\F) ; Fixed-format floating-point
+ (if format:floats
+ (format:out-fixed modifier (next-arg) params)
+ (format:out-str (number->string (next-arg))))
+ (anychar-dispatch))
+ ((#\E) ; Exponential floating-point
+ (if format:floats
+ (format:out-expon modifier (next-arg) params)
+ (format:out-str (number->string (next-arg))))
+ (anychar-dispatch))
+ ((#\G) ; General floating-point
+ (if format:floats
+ (format:out-general modifier (next-arg) params)
+ (format:out-str (number->string (next-arg))))
+ (anychar-dispatch))
+ ((#\$) ; Dollars floating-point
+ (if format:floats
+ (format:out-dollar modifier (next-arg) params)
+ (format:out-str (number->string (next-arg))))
+ (anychar-dispatch))
+ ((#\I) ; Complex numbers
+ (if (not format:complex-numbers)
+ (format:error
+ "complex numbers not supported by this scheme system"))
+ (let ((z (next-arg)))
+ (if (not (complex? z))
+ (format:error "argument not a complex number"))
+ (format:out-fixed modifier (real-part z) params)
+ (format:out-fixed 'at (imag-part z) params)
+ (format:out-char #\i))
+ (anychar-dispatch))
+ ((#\C) ; Character
+ (let ((ch (if (one-positive-integer? params)
+ (integer->char (car params))
+ (next-arg))))
+ (if (not (char? ch)) (format:error "~~c expects a character"))
+ (case modifier
+ ((at)
+ (format:out-str (format:char->str ch)))
+ ((colon)
+ (let ((c (char->integer ch)))
+ (if (< c 0)
+ (set! c (+ c 256))) ; compensate complement impl.
+ (cond
+ ((< c #x20) ; assumes that control chars are < #x20
+ (format:out-char #\^)
+ (format:out-char
+ (integer->char (+ c #x40))))
+ ((>= c #x7f)
+ (format:out-str "#\\")
+ (format:out-str
+ (if format:radix-pref
+ (let ((s (number->string c 8)))
+ (substring s 2 (string-length s)))
+ (number->string c 8))))
+ (else
+ (format:out-char ch)))))
+ (else (format:out-char ch))))
+ (anychar-dispatch))
+ ((#\P) ; Plural
+ (if (memq modifier '(colon colon-at))
+ (prev-arg))
+ (let ((arg (next-arg)))
+ (if (not (number? arg))
+ (format:error "~~p expects a number argument"))
+ (if (= arg 1)
+ (if (memq modifier '(at colon-at))
+ (format:out-char #\y))
+ (if (memq modifier '(at colon-at))
+ (format:out-str "ies")
+ (format:out-char #\s))))
+ (anychar-dispatch))
+ ((#\~) ; Tilde
+ (if (one-positive-integer? params)
+ (format:out-fill (car params) #\~)
+ (format:out-char #\~))
+ (anychar-dispatch))
+ ((#\%) ; Newline
+ (if (one-positive-integer? params)
+ (format:out-fill (car params) #\newline)
+ (format:out-char #\newline))
+ (set! format:output-col 0)
+ (anychar-dispatch))
+ ((#\&) ; Fresh line
+ (if (one-positive-integer? params)
+ (begin
+ (if (> (car params) 0)
+ (format:out-fill (- (car params)
+ (if (> format:output-col 0) 0 1))
+ #\newline))
+ (set! format:output-col 0))
+ (if (> format:output-col 0)
+ (format:out-char #\newline)))
+ (anychar-dispatch))
+ ((#\_) ; Space character
+ (if (one-positive-integer? params)
+ (format:out-fill (car params) #\space)
+ (format:out-char #\space))
+ (anychar-dispatch))
+ ((#\/) ; Tabulator character
+ (if (one-positive-integer? params)
+ (format:out-fill (car params) slib:tab)
+ (format:out-char slib:tab))
+ (anychar-dispatch))
+ ((#\|) ; Page seperator
+ (if (one-positive-integer? params)
+ (format:out-fill (car params) slib:form-feed)
+ (format:out-char slib:form-feed))
+ (set! format:output-col 0)
+ (anychar-dispatch))
+ ((#\T) ; Tabulate
+ (format:tabulate modifier params)
+ (anychar-dispatch))
+ ((#\Y) ; Pretty-print
+ (require 'pretty-print)
+ (pretty-print (next-arg) format:port)
+ (set! format:output-col 0)
+ (anychar-dispatch))
+ ((#\? #\K) ; Indirection (is "~K" in T-Scheme)
+ (cond
+ ((memq modifier '(colon colon-at))
+ (format:error "illegal modifier in ~~?"))
+ ((eq? modifier 'at)
+ (let* ((frmt (next-arg))
+ (args (rest-args)))
+ (add-arg-pos (format:format-work frmt args))))
+ (else
+ (let* ((frmt (next-arg))
+ (args (next-arg)))
+ (format:format-work frmt args))))
+ (anychar-dispatch))
+ ((#\!) ; Flush output
+ (set! format:flush-output #t)
+ (anychar-dispatch))
+ ((#\newline) ; Continuation lines
+ (if (eq? modifier 'at)
+ (format:out-char #\newline))
+ (if (< format:pos format-string-len)
+ (do ((ch (peek-next-char) (peek-next-char)))
+ ((or (not (char-whitespace? ch))
+ (= format:pos (- format-string-len 1))))
+ (if (eq? modifier 'colon)
+ (format:out-char (next-char))
+ (next-char))))
+ (anychar-dispatch))
+ ((#\*) ; Argument jumping
+ (case modifier
+ ((colon) ; jump backwards
+ (if (one-positive-integer? params)
+ (do ((i 0 (+ i 1)))
+ ((= i (car params)))
+ (prev-arg))
+ (prev-arg)))
+ ((at) ; jump absolute
+ (set! arg-pos (if (one-positive-integer? params)
+ (car params) 0)))
+ ((colon-at)
+ (format:error "illegal modifier `:@' in ~~* directive"))
+ (else ; jump forward
+ (if (one-positive-integer? params)
+ (do ((i 0 (+ i 1)))
+ ((= i (car params)))
+ (next-arg))
+ (next-arg))))
+ (anychar-dispatch))
+ ((#\() ; Case conversion begin
+ (set! format:case-conversion
+ (case modifier
+ ((at) format:string-capitalize-first)
+ ((colon) string-capitalize)
+ ((colon-at) string-upcase)
+ (else string-downcase)))
+ (anychar-dispatch))
+ ((#\)) ; Case conversion end
+ (if (not format:case-conversion)
+ (format:error "missing ~~("))
+ (set! format:case-conversion #f)
+ (anychar-dispatch))
+ ((#\[) ; Conditional begin
+ (set! conditional-nest (+ conditional-nest 1))
+ (cond
+ ((= conditional-nest 1)
+ (set! clause-pos format:pos)
+ (set! clause-default #f)
+ (set! clauses '())
+ (set! conditional-type
+ (case modifier
+ ((at) 'if-then)
+ ((colon) 'if-else-then)
+ ((colon-at) (format:error "illegal modifier in ~~["))
+ (else 'num-case)))
+ (set! conditional-arg
+ (if (one-positive-integer? params)
+ (car params)
+ (next-arg)))))
+ (anychar-dispatch))
+ ((#\;) ; Conditional separator
+ (if (zero? conditional-nest)
+ (format:error "~~; not in ~~[~~] conditional"))
+ (if (not (null? params))
+ (format:error "no parameter allowed in ~~;"))
+ (if (= conditional-nest 1)
+ (let ((clause-str
+ (cond
+ ((eq? modifier 'colon)
+ (set! clause-default #t)
+ (substring format-string clause-pos
+ (- format:pos 3)))
+ ((memq modifier '(at colon-at))
+ (format:error "illegal modifier in ~~;"))
+ (else
+ (substring format-string clause-pos
+ (- format:pos 2))))))
+ (set! clauses (append clauses (list clause-str)))
+ (set! clause-pos format:pos)))
+ (anychar-dispatch))
+ ((#\]) ; Conditional end
+ (if (zero? conditional-nest) (format:error "missing ~~["))
+ (set! conditional-nest (- conditional-nest 1))
+ (if modifier
+ (format:error "no modifier allowed in ~~]"))
+ (if (not (null? params))
+ (format:error "no parameter allowed in ~~]"))
+ (cond
+ ((zero? conditional-nest)
+ (let ((clause-str (substring format-string clause-pos
+ (- format:pos 2))))
+ (if clause-default
+ (set! clause-default clause-str)
+ (set! clauses (append clauses (list clause-str)))))
+ (case conditional-type
+ ((if-then)
+ (if conditional-arg
+ (format:format-work (car clauses)
+ (list conditional-arg))))
+ ((if-else-then)
+ (add-arg-pos
+ (format:format-work (if conditional-arg
+ (cadr clauses)
+ (car clauses))
+ (rest-args))))
+ ((num-case)
+ (if (or (not (integer? conditional-arg))
+ (< conditional-arg 0))
+ (format:error "argument not a positive integer"))
+ (if (not (and (>= conditional-arg (length clauses))
+ (not clause-default)))
+ (add-arg-pos
+ (format:format-work
+ (if (>= conditional-arg (length clauses))
+ clause-default
+ (list-ref clauses conditional-arg))
+ (rest-args))))))))
+ (anychar-dispatch))
+ ((#\{) ; Iteration begin
+ (set! iteration-nest (+ iteration-nest 1))
+ (cond
+ ((= iteration-nest 1)
+ (set! iteration-pos format:pos)
+ (set! iteration-type
+ (case modifier
+ ((at) 'rest-args)
+ ((colon) 'sublists)
+ ((colon-at) 'rest-sublists)
+ (else 'list)))
+ (set! max-iterations (if (one-positive-integer? params)
+ (car params) #f))))
+ (anychar-dispatch))
+ ((#\}) ; Iteration end
+ (if (zero? iteration-nest) (format:error "missing ~~{"))
+ (set! iteration-nest (- iteration-nest 1))
+ (case modifier
+ ((colon)
+ (if (not max-iterations) (set! max-iterations 1)))
+ ((colon-at at) (format:error "illegal modifier"))
+ (else (if (not max-iterations)
+ (set! max-iterations format:max-iterations))))
+ (if (not (null? params))
+ (format:error "no parameters allowed in ~~}"))
+ (if (zero? iteration-nest)
+ (let ((iteration-str
+ (substring format-string iteration-pos
+ (- format:pos (if modifier 3 2)))))
+ (if (string=? iteration-str "")
+ (set! iteration-str (next-arg)))
+ (case iteration-type
+ ((list)
+ (let ((args (next-arg))
+ (args-len 0))
+ (if (not (list? args))
+ (format:error "expected a list argument"))
+ (set! args-len (length args))
+ (do ((arg-pos 0 (+ arg-pos
+ (format:format-work
+ iteration-str
+ (list-tail args arg-pos))))
+ (i 0 (+ i 1)))
+ ((or (>= arg-pos args-len)
+ (and format:iteration-bounded
+ (>= i max-iterations)))))))
+ ((sublists)
+ (let ((args (next-arg))
+ (args-len 0))
+ (if (not (list? args))
+ (format:error "expected a list argument"))
+ (set! args-len (length args))
+ (do ((arg-pos 0 (+ arg-pos 1)))
+ ((or (>= arg-pos args-len)
+ (and format:iteration-bounded
+ (>= arg-pos max-iterations))))
+ (let ((sublist (list-ref args arg-pos)))
+ (if (not (list? sublist))
+ (format:error
+ "expected a list of lists argument"))
+ (format:format-work iteration-str sublist)))))
+ ((rest-args)
+ (let* ((args (rest-args))
+ (args-len (length args))
+ (usedup-args
+ (do ((arg-pos 0 (+ arg-pos
+ (format:format-work
+ iteration-str
+ (list-tail
+ args arg-pos))))
+ (i 0 (+ i 1)))
+ ((or (>= arg-pos args-len)
+ (and format:iteration-bounded
+ (>= i max-iterations)))
+ arg-pos))))
+ (add-arg-pos usedup-args)))
+ ((rest-sublists)
+ (let* ((args (rest-args))
+ (args-len (length args))
+ (usedup-args
+ (do ((arg-pos 0 (+ arg-pos 1)))
+ ((or (>= arg-pos args-len)
+ (and format:iteration-bounded
+ (>= arg-pos max-iterations)))
+ arg-pos)
+ (let ((sublist (list-ref args arg-pos)))
+ (if (not (list? sublist))
+ (format:error "expected list arguments"))
+ (format:format-work iteration-str sublist)))))
+ (add-arg-pos usedup-args)))
+ (else (format:error "internal error in ~~}")))))
+ (anychar-dispatch))
+ ((#\^) ; Up and out
+ (let* ((continue
+ (cond
+ ((not (null? params))
+ (not
+ (case (length params)
+ ((1) (zero? (car params)))
+ ((2) (= (list-ref params 0) (list-ref params 1)))
+ ((3) (<= (list-ref params 0)
+ (list-ref params 1)
+ (list-ref params 2)))
+ (else (format:error "too much parameters")))))
+ (format:case-conversion ; if conversion stop conversion
+ (set! format:case-conversion string-copy) #t)
+ ((= iteration-nest 1) #t)
+ ((= conditional-nest 1) #t)
+ ((>= arg-pos arg-len)
+ (set! format:pos format-string-len) #f)
+ (else #t))))
+ (if continue
+ (anychar-dispatch))))
+
+ ;; format directive modifiers and parameters
+
+ ((#\@) ; `@' modifier
+ (if (memq modifier '(at colon-at))
+ (format:error "double `@' modifier"))
+ (set! modifier (if (eq? modifier 'colon) 'colon-at 'at))
+ (tilde-dispatch))
+ ((#\:) ; `:' modifier
+ (if (memq modifier '(colon colon-at))
+ (format:error "double `:' modifier"))
+ (set! modifier (if (eq? modifier 'at) 'colon-at 'colon))
+ (tilde-dispatch))
+ ((#\') ; Character parameter
+ (if modifier (format:error "misplaced modifier"))
+ (set! params (append params (list (char->integer (next-char)))))
+ (set! param-value-found #t)
+ (tilde-dispatch))
+ ((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\- #\+) ; num. paramtr
+ (if modifier (format:error "misplaced modifier"))
+ (let ((num-str-beg (- format:pos 1))
+ (num-str-end format:pos))
+ (do ((ch (peek-next-char) (peek-next-char)))
+ ((not (char-numeric? ch)))
+ (next-char)
+ (set! num-str-end (+ 1 num-str-end)))
+ (set! params
+ (append params
+ (list (string->number
+ (substring format-string
+ num-str-beg
+ num-str-end))))))
+ (set! param-value-found #t)
+ (tilde-dispatch))
+ ((#\V) ; Variable parameter from next argum.
+ (if modifier (format:error "misplaced modifier"))
+ (set! params (append params (list (next-arg))))
+ (set! param-value-found #t)
+ (tilde-dispatch))
+ ((#\#) ; Parameter is number of remaining args
+ (if modifier (format:error "misplaced modifier"))
+ (set! params (append params (list (length (rest-args)))))
+ (set! param-value-found #t)
+ (tilde-dispatch))
+ ((#\,) ; Parameter separators
+ (if modifier (format:error "misplaced modifier"))
+ (if (not param-value-found)
+ (set! params (append params '(#f)))) ; append empty paramtr
+ (set! param-value-found #f)
+ (tilde-dispatch))
+ ((#\Q) ; Inquiry messages
+ (if (eq? modifier 'colon)
+ (format:out-str format:version)
+ (let ((nl (string #\newline)))
+ (format:out-str
+ (string-append
+ "SLIB Common LISP format version " format:version nl
+ " (C) copyright 1992-1994 by Dirk Lutzebaeck" nl
+ " please send bug reports to `lutzeb@cs.tu-berlin.de'"
+ nl))))
+ (anychar-dispatch))
+ (else ; Unknown tilde directive
+ (format:error "unknown control character `~c'"
+ (string-ref format-string (- format:pos 1))))))
+ (else (anychar-dispatch)))))) ; in case of conditional
+
+ (set! format:pos 0)
+ (set! format:arg-pos 0)
+ (anychar-dispatch) ; start the formatting
+ (set! format:pos recursive-pos-save)
+ arg-pos)) ; return the position in the arg. list
+
+;; format:obj->str returns a R4RS representation as a string of an arbitrary
+;; scheme object.
+;; First parameter is the object, second parameter is a boolean if the
+;; representation should be slashified as `write' does.
+;; It uses format:char->str which converts a character into
+;; a slashified string as `write' does and which is implementation dependent.
+;; It uses format:iobj->str to print out internal objects as
+;; quoted strings so that the output can always be processed by (read)
+
+(define (format:obj->str obj slashify)
+ (cond
+ ((string? obj)
+ (if slashify
+ (let ((obj-len (string-length obj)))
+ (string-append
+ "\""
+ (let loop ((i 0) (j 0)) ; taken from Marc Feeley's pp.scm
+ (if (= j obj-len)
+ (string-append (substring obj i j) "\"")
+ (let ((c (string-ref obj j)))
+ (if (or (char=? c #\\)
+ (char=? c #\"))
+ (string-append (substring obj i j) "\\"
+ (loop j (+ j 1)))
+ (loop i (+ j 1))))))))
+ obj))
+
+ ((boolean? obj) (if obj "#t" "#f"))
+
+ ((number? obj) (number->string obj))
+
+ ((symbol? obj)
+ (if format:symbol-case-conv
+ (format:symbol-case-conv (symbol->string obj))
+ (symbol->string obj)))
+
+ ((char? obj)
+ (if slashify
+ (format:char->str obj)
+ (string obj)))
+
+ ((null? obj) "()")
+
+ ((input-port? obj)
+ (format:iobj->str obj))
+
+ ((output-port? obj)
+ (format:iobj->str obj))
+
+ ((list? obj)
+ (string-append "("
+ (let loop ((obj-list obj))
+ (if (null? (cdr obj-list))
+ (format:obj->str (car obj-list) #t)
+ (string-append
+ (format:obj->str (car obj-list) #t)
+ " "
+ (loop (cdr obj-list)))))
+ ")"))
+
+ ((pair? obj)
+ (string-append "("
+ (format:obj->str (car obj) #t)
+ " . "
+ (format:obj->str (cdr obj) #t)
+ ")"))
+
+ ((vector? obj)
+ (string-append "#" (format:obj->str (vector->list obj) #t)))
+
+ (else ; only objects with an #<...>
+ (format:iobj->str obj)))) ; representation should fall in here
+
+;; format:iobj->str reveals the implementation dependent representation of
+;; #<...> objects with the use of display and call-with-output-string.
+;; If format:read-proof is set to #t the resulting string is additionally
+;; set into string quotes.
+
+(define format:read-proof #f)
+
+(define (format:iobj->str iobj)
+ (if (or format:read-proof
+ format:iobj-case-conv)
+ (string-append
+ (if format:read-proof "\"" "")
+ (if format:iobj-case-conv
+ (format:iobj-case-conv
+ (call-with-output-string (lambda (p) (display iobj p))))
+ (call-with-output-string (lambda (p) (display iobj p))))
+ (if format:read-proof "\"" ""))
+ (call-with-output-string (lambda (p) (display iobj p)))))
+
+
+;; format:char->str converts a character into a slashified string as
+;; done by `write'. The procedure is dependent on the integer
+;; representation of characters and assumes a character number according to
+;; the ASCII character set.
+
+(define (format:char->str ch)
+ (let ((int-rep (char->integer ch)))
+ (if (< int-rep 0) ; if chars are [-128...+127]
+ (set! int-rep (+ int-rep 256)))
+ (string-append
+ "#\\"
+ (cond
+ ((char=? ch #\newline) "newline")
+ ((and (>= int-rep 0) (<= int-rep 32))
+ (vector-ref format:ascii-non-printable-charnames int-rep))
+ ((= int-rep 127) "del")
+ ((>= int-rep 128) ; octal representation
+ (if format:radix-pref
+ (let ((s (number->string int-rep 8)))
+ (substring s 2 (string-length s)))
+ (number->string int-rep 8)))
+ (else (string ch))))))
+
+(define format:space-ch (char->integer #\space))
+(define format:zero-ch (char->integer #\0))
+
+(define (format:par pars length index default name)
+ (if (> length index)
+ (let ((par (list-ref pars index)))
+ (if par
+ (if name
+ (if (< par 0)
+ (format:error
+ "~s parameter must be a positive integer" name)
+ par)
+ par)
+ default))
+ default))
+
+(define (format:out-obj-padded pad-left obj slashify pars)
+ (if (null? pars)
+ (format:out-str (format:obj->str obj slashify))
+ (let ((l (length pars)))
+ (let ((mincol (format:par pars l 0 0 "mincol"))
+ (colinc (format:par pars l 1 1 "colinc"))
+ (minpad (format:par pars l 2 0 "minpad"))
+ (padchar (integer->char
+ (format:par pars l 3 format:space-ch #f)))
+ (objstr (format:obj->str obj slashify)))
+ (if (not pad-left)
+ (format:out-str objstr))
+ (do ((objstr-len (string-length objstr))
+ (i minpad (+ i colinc)))
+ ((>= (+ objstr-len i) mincol)
+ (format:out-fill i padchar)))
+ (if pad-left
+ (format:out-str objstr))))))
+
+(define (format:out-num-padded modifier number pars radix)
+ (if (not (integer? number)) (format:error "argument not an integer"))
+ (let ((numstr (number->string number radix)))
+ (if (and format:radix-pref (not (= radix 10)))
+ (set! numstr (substring numstr 2 (string-length numstr))))
+ (if (and (null? pars) (not modifier))
+ (format:out-str numstr)
+ (let ((l (length pars))
+ (numstr-len (string-length numstr)))
+ (let ((mincol (format:par pars l 0 #f "mincol"))
+ (padchar (integer->char
+ (format:par pars l 1 format:space-ch #f)))
+ (commachar (integer->char
+ (format:par pars l 2 (char->integer #\,) #f)))
+ (commawidth (format:par pars l 3 3 "commawidth")))
+ (if mincol
+ (let ((numlen numstr-len)) ; calc. the output len of number
+ (if (and (memq modifier '(at colon-at)) (> number 0))
+ (set! numlen (+ numlen 1)))
+ (if (memq modifier '(colon colon-at))
+ (set! numlen (+ (quotient (- numstr-len
+ (if (< number 0) 2 1))
+ commawidth)
+ numlen)))
+ (if (> mincol numlen)
+ (format:out-fill (- mincol numlen) padchar))))
+ (if (and (memq modifier '(at colon-at))
+ (> number 0))
+ (format:out-char #\+))
+ (if (memq modifier '(colon colon-at)) ; insert comma character
+ (let ((start (remainder numstr-len commawidth))
+ (ns (if (< number 0) 1 0)))
+ (format:out-substr numstr 0 start)
+ (do ((i start (+ i commawidth)))
+ ((>= i numstr-len))
+ (if (> i ns)
+ (format:out-char commachar))
+ (format:out-substr numstr i (+ i commawidth))))
+ (format:out-str numstr)))))))
+
+(define (format:tabulate modifier pars)
+ (let ((l (length pars)))
+ (let ((colnum (format:par pars l 0 1 "colnum"))
+ (colinc (format:par pars l 1 1 "colinc"))
+ (padch (integer->char (format:par pars l 2 format:space-ch #f))))
+ (case modifier
+ ((colon colon-at)
+ (format:error "unsupported modifier for ~~t"))
+ ((at) ; relative tabulation
+ (format:out-fill
+ (if (= colinc 0)
+ colnum ; colnum = colrel
+ (do ((c 0 (+ c colinc))
+ (col (+ format:output-col colnum)))
+ ((>= c col)
+ (- c format:output-col))))
+ padch))
+ (else ; absolute tabulation
+ (format:out-fill
+ (cond
+ ((< format:output-col colnum)
+ (- colnum format:output-col))
+ ((= colinc 0)
+ 0)
+ (else
+ (do ((c colnum (+ c colinc)))
+ ((>= c format:output-col)
+ (- c format:output-col)))))
+ padch))))))
+
+
+;; roman numerals (from dorai@cs.rice.edu).
+
+(define format:roman-alist
+ '((1000 #\M) (500 #\D) (100 #\C) (50 #\L)
+ (10 #\X) (5 #\V) (1 #\I)))
+
+(define format:roman-boundary-values
+ '(100 100 10 10 1 1 #f))
+
+(define format:num->old-roman
+ (lambda (n)
+ (if (and (integer? n) (>= n 1))
+ (let loop ((n n)
+ (romans format:roman-alist)
+ (s '()))
+ (if (null? romans) (list->string (reverse s))
+ (let ((roman-val (caar romans))
+ (roman-dgt (cadar romans)))
+ (do ((q (quotient n roman-val) (- q 1))
+ (s s (cons roman-dgt s)))
+ ((= q 0)
+ (loop (remainder n roman-val)
+ (cdr romans) s))))))
+ (format:error "only positive integers can be romanized"))))
+
+(define format:num->roman
+ (lambda (n)
+ (if (and (integer? n) (> n 0))
+ (let loop ((n n)
+ (romans format:roman-alist)
+ (boundaries format:roman-boundary-values)
+ (s '()))
+ (if (null? romans)
+ (list->string (reverse s))
+ (let ((roman-val (caar romans))
+ (roman-dgt (cadar romans))
+ (bdry (car boundaries)))
+ (let loop2 ((q (quotient n roman-val))
+ (r (remainder n roman-val))
+ (s s))
+ (if (= q 0)
+ (if (and bdry (>= r (- roman-val bdry)))
+ (loop (remainder r bdry) (cdr romans)
+ (cdr boundaries)
+ (cons roman-dgt
+ (append
+ (cdr (assv bdry romans))
+ s)))
+ (loop r (cdr romans) (cdr boundaries) s))
+ (loop2 (- q 1) r (cons roman-dgt s)))))))
+ (format:error "only positive integers can be romanized"))))
+
+;; cardinals & ordinals (from dorai@cs.rice.edu)
+
+(define format:cardinal-ones-list
+ '(#f "one" "two" "three" "four" "five"
+ "six" "seven" "eight" "nine" "ten" "eleven" "twelve" "thirteen"
+ "fourteen" "fifteen" "sixteen" "seventeen" "eighteen"
+ "nineteen"))
+
+(define format:cardinal-tens-list
+ '(#f #f "twenty" "thirty" "forty" "fifty" "sixty" "seventy" "eighty"
+ "ninety"))
+
+(define format:num->cardinal999
+ (lambda (n)
+ ;this procedure is inspired by the Bruno Haible's CLisp
+ ;function format-small-cardinal, which converts numbers
+ ;in the range 1 to 999, and is used for converting each
+ ;thousand-block in a larger number
+ (let* ((hundreds (quotient n 100))
+ (tens+ones (remainder n 100))
+ (tens (quotient tens+ones 10))
+ (ones (remainder tens+ones 10)))
+ (append
+ (if (> hundreds 0)
+ (append
+ (string->list
+ (list-ref format:cardinal-ones-list hundreds))
+ (string->list" hundred")
+ (if (> tens+ones 0) '(#\space) '()))
+ '())
+ (if (< tens+ones 20)
+ (if (> tens+ones 0)
+ (string->list
+ (list-ref format:cardinal-ones-list tens+ones))
+ '())
+ (append
+ (string->list
+ (list-ref format:cardinal-tens-list tens))
+ (if (> ones 0)
+ (cons #\-
+ (string->list
+ (list-ref format:cardinal-ones-list ones)))
+ '())))))))
+
+(define format:cardinal-thousand-block-list
+ '("" " thousand" " million" " billion" " trillion" " quadrillion"
+ " quintillion" " sextillion" " septillion" " octillion" " nonillion"
+ " decillion" " undecillion" " duodecillion" " tredecillion"
+ " quattuordecillion" " quindecillion" " sexdecillion" " septendecillion"
+ " octodecillion" " novemdecillion" " vigintillion"))
+
+(define format:num->cardinal
+ (lambda (n)
+ (cond ((not (integer? n))
+ (format:error
+ "only integers can be converted to English cardinals"))
+ ((= n 0) "zero")
+ ((< n 0) (string-append "minus " (format:num->cardinal (- n))))
+ (else
+ (let ((power3-word-limit
+ (length format:cardinal-thousand-block-list)))
+ (let loop ((n n)
+ (power3 0)
+ (s '()))
+ (if (= n 0)
+ (list->string s)
+ (let ((n-before-block (quotient n 1000))
+ (n-after-block (remainder n 1000)))
+ (loop n-before-block
+ (+ power3 1)
+ (if (> n-after-block 0)
+ (append
+ (if (> n-before-block 0)
+ (string->list ", ") '())
+ (format:num->cardinal999 n-after-block)
+ (if (< power3 power3-word-limit)
+ (string->list
+ (list-ref
+ format:cardinal-thousand-block-list
+ power3))
+ (append
+ (string->list " times ten to the ")
+ (string->list
+ (format:num->ordinal
+ (* power3 3)))
+ (string->list " power")))
+ s)
+ s))))))))))
+
+(define format:ordinal-ones-list
+ '(#f "first" "second" "third" "fourth" "fifth"
+ "sixth" "seventh" "eighth" "ninth" "tenth" "eleventh" "twelfth"
+ "thirteenth" "fourteenth" "fifteenth" "sixteenth" "seventeenth"
+ "eighteenth" "nineteenth"))
+
+(define format:ordinal-tens-list
+ '(#f #f "twentieth" "thirtieth" "fortieth" "fiftieth" "sixtieth"
+ "seventieth" "eightieth" "ninetieth"))
+
+(define format:num->ordinal
+ (lambda (n)
+ (cond ((not (integer? n))
+ (format:error
+ "only integers can be converted to English ordinals"))
+ ((= n 0) "zeroth")
+ ((< n 0) (string-append "minus " (format:num->ordinal (- n))))
+ (else
+ (let ((hundreds (quotient n 100))
+ (tens+ones (remainder n 100)))
+ (string-append
+ (if (> hundreds 0)
+ (string-append
+ (format:num->cardinal (* hundreds 100))
+ (if (= tens+ones 0) "th" " "))
+ "")
+ (if (= tens+ones 0) ""
+ (if (< tens+ones 20)
+ (list-ref format:ordinal-ones-list tens+ones)
+ (let ((tens (quotient tens+ones 10))
+ (ones (remainder tens+ones 10)))
+ (if (= ones 0)
+ (list-ref format:ordinal-tens-list tens)
+ (string-append
+ (list-ref format:cardinal-tens-list tens)
+ "-"
+ (list-ref format:ordinal-ones-list ones))))
+ ))))))))
+
+;; format fixed flonums (~F)
+
+(define (format:out-fixed modifier number pars)
+ (if (not (or (number? number) (string? number)))
+ (format:error "argument is not a number or a number string"))
+
+ (let ((l (length pars)))
+ (let ((width (format:par pars l 0 #f "width"))
+ (digits (format:par pars l 1 #f "digits"))
+ (scale (format:par pars l 2 0 #f))
+ (overch (format:par pars l 3 #f #f))
+ (padch (format:par pars l 4 format:space-ch #f)))
+
+ (if digits
+
+ (begin ; fixed precision
+ (format:parse-float
+ (if (string? number) number (number->string number)) #t scale)
+ (if (<= (- format:fn-len format:fn-dot) digits)
+ (format:fn-zfill #f (- digits (- format:fn-len format:fn-dot)))
+ (format:fn-round digits))
+ (if width
+ (let ((numlen (+ format:fn-len 1)))
+ (if (or (not format:fn-pos?) (eq? modifier 'at))
+ (set! numlen (+ numlen 1)))
+ (if (and (= format:fn-dot 0) (> width (+ digits 1)))
+ (set! numlen (+ numlen 1)))
+ (if (< numlen width)
+ (format:out-fill (- width numlen) (integer->char padch)))
+ (if (and overch (> numlen width))
+ (format:out-fill width (integer->char overch))
+ (format:fn-out modifier (> width (+ digits 1)))))
+ (format:fn-out modifier #t)))
+
+ (begin ; free precision
+ (format:parse-float
+ (if (string? number) number (number->string number)) #t scale)
+ (format:fn-strip)
+ (if width
+ (let ((numlen (+ format:fn-len 1)))
+ (if (or (not format:fn-pos?) (eq? modifier 'at))
+ (set! numlen (+ numlen 1)))
+ (if (= format:fn-dot 0)
+ (set! numlen (+ numlen 1)))
+ (if (< numlen width)
+ (format:out-fill (- width numlen) (integer->char padch)))
+ (if (> numlen width) ; adjust precision if possible
+ (let ((dot-index (- numlen
+ (- format:fn-len format:fn-dot))))
+ (if (> dot-index width)
+ (if overch ; numstr too big for required width
+ (format:out-fill width (integer->char overch))
+ (format:fn-out modifier #t))
+ (begin
+ (format:fn-round (- width dot-index))
+ (format:fn-out modifier #t))))
+ (format:fn-out modifier #t)))
+ (format:fn-out modifier #t)))))))
+
+;; format exponential flonums (~E)
+
+(define (format:out-expon modifier number pars)
+ (if (not (or (number? number) (string? number)))
+ (format:error "argument is not a number"))
+
+ (let ((l (length pars)))
+ (let ((width (format:par pars l 0 #f "width"))
+ (digits (format:par pars l 1 #f "digits"))
+ (edigits (format:par pars l 2 #f "exponent digits"))
+ (scale (format:par pars l 3 1 #f))
+ (overch (format:par pars l 4 #f #f))
+ (padch (format:par pars l 5 format:space-ch #f))
+ (expch (format:par pars l 6 #f #f)))
+
+ (if digits ; fixed precision
+
+ (let ((digits (if (> scale 0)
+ (if (< scale (+ digits 2))
+ (+ (- digits scale) 1)
+ 0)
+ digits)))
+ (format:parse-float
+ (if (string? number) number (number->string number)) #f scale)
+ (if (<= (- format:fn-len format:fn-dot) digits)
+ (format:fn-zfill #f (- digits (- format:fn-len format:fn-dot)))
+ (format:fn-round digits))
+ (if width
+ (if (and edigits overch (> format:en-len edigits))
+ (format:out-fill width (integer->char overch))
+ (let ((numlen (+ format:fn-len 3))) ; .E+
+ (if (or (not format:fn-pos?) (eq? modifier 'at))
+ (set! numlen (+ numlen 1)))
+ (if (and (= format:fn-dot 0) (> width (+ digits 1)))
+ (set! numlen (+ numlen 1)))
+ (set! numlen
+ (+ numlen
+ (if (and edigits (>= edigits format:en-len))
+ edigits
+ format:en-len)))
+ (if (< numlen width)
+ (format:out-fill (- width numlen)
+ (integer->char padch)))
+ (if (and overch (> numlen width))
+ (format:out-fill width (integer->char overch))
+ (begin
+ (format:fn-out modifier (> width (- numlen 1)))
+ (format:en-out edigits expch)))))
+ (begin
+ (format:fn-out modifier #t)
+ (format:en-out edigits expch))))
+
+ (begin ; free precision
+ (format:parse-float
+ (if (string? number) number (number->string number)) #f scale)
+ (format:fn-strip)
+ (if width
+ (if (and edigits overch (> format:en-len edigits))
+ (format:out-fill width (integer->char overch))
+ (let ((numlen (+ format:fn-len 3))) ; .E+
+ (if (or (not format:fn-pos?) (eq? modifier 'at))
+ (set! numlen (+ numlen 1)))
+ (if (= format:fn-dot 0)
+ (set! numlen (+ numlen 1)))
+ (set! numlen
+ (+ numlen
+ (if (and edigits (>= edigits format:en-len))
+ edigits
+ format:en-len)))
+ (if (< numlen width)
+ (format:out-fill (- width numlen)
+ (integer->char padch)))
+ (if (> numlen width) ; adjust precision if possible
+ (let ((f (- format:fn-len format:fn-dot))) ; fract len
+ (if (> (- numlen f) width)
+ (if overch ; numstr too big for required width
+ (format:out-fill width
+ (integer->char overch))
+ (begin
+ (format:fn-out modifier #t)
+ (format:en-out edigits expch)))
+ (begin
+ (format:fn-round (+ (- f numlen) width))
+ (format:fn-out modifier #t)
+ (format:en-out edigits expch))))
+ (begin
+ (format:fn-out modifier #t)
+ (format:en-out edigits expch)))))
+ (begin
+ (format:fn-out modifier #t)
+ (format:en-out edigits expch))))))))
+
+;; format general flonums (~G)
+
+(define (format:out-general modifier number pars)
+ (if (not (or (number? number) (string? number)))
+ (format:error "argument is not a number or a number string"))
+
+ (let ((l (length pars)))
+ (let ((width (if (> l 0) (list-ref pars 0) #f))
+ (digits (if (> l 1) (list-ref pars 1) #f))
+ (edigits (if (> l 2) (list-ref pars 2) #f))
+ (overch (if (> l 4) (list-ref pars 4) #f))
+ (padch (if (> l 5) (list-ref pars 5) #f)))
+ (format:parse-float
+ (if (string? number) number (number->string number)) #t 0)
+ (format:fn-strip)
+ (let* ((ee (if edigits (+ edigits 2) 4)) ; for the following algorithm
+ (ww (if width (- width ee) #f)) ; see Steele's CL book p.395
+ (n (if (= format:fn-dot 0) ; number less than (abs 1.0) ?
+ (- (format:fn-zlead))
+ format:fn-dot))
+ (d (if digits
+ digits
+ (max format:fn-len (min n 7)))) ; q = format:fn-len
+ (dd (- d n)))
+ (if (<= 0 dd d)
+ (begin
+ (format:out-fixed modifier number (list ww dd #f overch padch))
+ (format:out-fill ee #\space)) ;~@T not implemented yet
+ (format:out-expon modifier number pars))))))
+
+;; format dollar flonums (~$)
+
+(define (format:out-dollar modifier number pars)
+ (if (not (or (number? number) (string? number)))
+ (format:error "argument is not a number or a number string"))
+
+ (let ((l (length pars)))
+ (let ((digits (format:par pars l 0 2 "digits"))
+ (mindig (format:par pars l 1 1 "mindig"))
+ (width (format:par pars l 2 0 "width"))
+ (padch (format:par pars l 3 format:space-ch #f)))
+
+ (format:parse-float
+ (if (string? number) number (number->string number)) #t 0)
+ (if (<= (- format:fn-len format:fn-dot) digits)
+ (format:fn-zfill #f (- digits (- format:fn-len format:fn-dot)))
+ (format:fn-round digits))
+ (let ((numlen (+ format:fn-len 1)))
+ (if (or (not format:fn-pos?) (memq modifier '(at colon-at)))
+ (set! numlen (+ numlen 1)))
+ (if (and mindig (> mindig format:fn-dot))
+ (set! numlen (+ numlen (- mindig format:fn-dot))))
+ (if (and (= format:fn-dot 0) (not mindig))
+ (set! numlen (+ numlen 1)))
+ (if (< numlen width)
+ (case modifier
+ ((colon)
+ (if (not format:fn-pos?)
+ (format:out-char #\-))
+ (format:out-fill (- width numlen) (integer->char padch)))
+ ((at)
+ (format:out-fill (- width numlen) (integer->char padch))
+ (format:out-char (if format:fn-pos? #\+ #\-)))
+ ((colon-at)
+ (format:out-char (if format:fn-pos? #\+ #\-))
+ (format:out-fill (- width numlen) (integer->char padch)))
+ (else
+ (format:out-fill (- width numlen) (integer->char padch))
+ (if (not format:fn-pos?)
+ (format:out-char #\-))))
+ (if format:fn-pos?
+ (if (memq modifier '(at colon-at)) (format:out-char #\+))
+ (format:out-char #\-))))
+ (if (and mindig (> mindig format:fn-dot))
+ (format:out-fill (- mindig format:fn-dot) #\0))
+ (if (and (= format:fn-dot 0) (not mindig))
+ (format:out-char #\0))
+ (format:out-substr format:fn-str 0 format:fn-dot)
+ (format:out-char #\.)
+ (format:out-substr format:fn-str format:fn-dot format:fn-len))))
+
+; the flonum buffers
+
+(define format:fn-max 200) ; max. number of number digits
+(define format:fn-str (make-string format:fn-max)) ; number buffer
+(define format:fn-len 0) ; digit length of number
+(define format:fn-dot #f) ; dot position of number
+(define format:fn-pos? #t) ; number positive?
+(define format:en-max 10) ; max. number of exponent digits
+(define format:en-str (make-string format:en-max)) ; exponent buffer
+(define format:en-len 0) ; digit length of exponent
+(define format:en-pos? #t) ; exponent positive?
+
+(define (format:parse-float num-str fixed? scale)
+ (set! format:fn-pos? #t)
+ (set! format:fn-len 0)
+ (set! format:fn-dot #f)
+ (set! format:en-pos? #t)
+ (set! format:en-len 0)
+ (do ((i 0 (+ i 1))
+ (left-zeros 0)
+ (mantissa? #t)
+ (all-zeros? #t)
+ (num-len (string-length num-str))
+ (c #f)) ; current exam. character in num-str
+ ((= i num-len)
+ (if (not format:fn-dot)
+ (set! format:fn-dot format:fn-len))
+
+ (if all-zeros?
+ (begin
+ (set! left-zeros 0)
+ (set! format:fn-dot 0)
+ (set! format:fn-len 1)))
+
+ ;; now format the parsed values according to format's need
+
+ (if fixed?
+
+ (begin ; fixed format m.nnn or .nnn
+ (if (and (> left-zeros 0) (> format:fn-dot 0))
+ (if (> format:fn-dot left-zeros)
+ (begin ; norm 0{0}nn.mm to nn.mm
+ (format:fn-shiftleft left-zeros)
+ (set! left-zeros 0)
+ (set! format:fn-dot (- format:fn-dot left-zeros)))
+ (begin ; normalize 0{0}.nnn to .nnn
+ (format:fn-shiftleft format:fn-dot)
+ (set! left-zeros (- left-zeros format:fn-dot))
+ (set! format:fn-dot 0))))
+ (if (or (not (= scale 0)) (> format:en-len 0))
+ (let ((shift (+ scale (format:en-int))))
+ (cond
+ (all-zeros? #t)
+ ((> (+ format:fn-dot shift) format:fn-len)
+ (format:fn-zfill
+ #f (- shift (- format:fn-len format:fn-dot)))
+ (set! format:fn-dot format:fn-len))
+ ((< (+ format:fn-dot shift) 0)
+ (format:fn-zfill #t (- (- shift) format:fn-dot))
+ (set! format:fn-dot 0))
+ (else
+ (if (> left-zeros 0)
+ (if (<= left-zeros shift) ; shift always > 0 here
+ (format:fn-shiftleft shift) ; shift out 0s
+ (begin
+ (format:fn-shiftleft left-zeros)
+ (set! format:fn-dot (- shift left-zeros))))
+ (set! format:fn-dot (+ format:fn-dot shift))))))))
+
+ (let ((negexp ; expon format m.nnnEee
+ (if (> left-zeros 0)
+ (- left-zeros format:fn-dot -1)
+ (if (= format:fn-dot 0) 1 0))))
+ (if (> left-zeros 0)
+ (begin ; normalize 0{0}.nnn to n.nn
+ (format:fn-shiftleft left-zeros)
+ (set! format:fn-dot 1))
+ (if (= format:fn-dot 0)
+ (set! format:fn-dot 1)))
+ (format:en-set (- (+ (- format:fn-dot scale) (format:en-int))
+ negexp))
+ (cond
+ (all-zeros?
+ (format:en-set 0)
+ (set! format:fn-dot 1))
+ ((< scale 0) ; leading zero
+ (format:fn-zfill #t (- scale))
+ (set! format:fn-dot 0))
+ ((> scale format:fn-dot)
+ (format:fn-zfill #f (- scale format:fn-dot))
+ (set! format:fn-dot scale))
+ (else
+ (set! format:fn-dot scale)))))
+ #t)
+
+ ;; do body
+ (set! c (string-ref num-str i)) ; parse the output of number->string
+ (cond ; which can be any valid number
+ ((char-numeric? c) ; representation of R4RS except
+ (if mantissa? ; complex numbers
+ (begin
+ (if (char=? c #\0)
+ (if all-zeros?
+ (set! left-zeros (+ left-zeros 1)))
+ (begin
+ (set! all-zeros? #f)))
+ (string-set! format:fn-str format:fn-len c)
+ (set! format:fn-len (+ format:fn-len 1)))
+ (begin
+ (string-set! format:en-str format:en-len c)
+ (set! format:en-len (+ format:en-len 1)))))
+ ((or (char=? c #\-) (char=? c #\+))
+ (if mantissa?
+ (set! format:fn-pos? (char=? c #\+))
+ (set! format:en-pos? (char=? c #\+))))
+ ((char=? c #\.)
+ (set! format:fn-dot format:fn-len))
+ ((char=? c #\e)
+ (set! mantissa? #f))
+ ((char=? c #\E)
+ (set! mantissa? #f))
+ ((char-whitespace? c) #t)
+ ((char=? c #\d) #t) ; decimal radix prefix
+ ((char=? c #\#) #t)
+ (else
+ (format:error "illegal character `~c' in number->string" c)))))
+
+(define (format:en-int) ; convert exponent string to integer
+ (if (= format:en-len 0)
+ 0
+ (do ((i 0 (+ i 1))
+ (n 0))
+ ((= i format:en-len)
+ (if format:en-pos?
+ n
+ (- n)))
+ (set! n (+ (* n 10) (- (char->integer (string-ref format:en-str i))
+ format:zero-ch))))))
+
+(define (format:en-set en) ; set exponent string number
+ (set! format:en-len 0)
+ (set! format:en-pos? (>= en 0))
+ (let ((en-str (number->string en)))
+ (do ((i 0 (+ i 1))
+ (en-len (string-length en-str))
+ (c #f))
+ ((= i en-len))
+ (set! c (string-ref en-str i))
+ (if (char-numeric? c)
+ (begin
+ (string-set! format:en-str format:en-len c)
+ (set! format:en-len (+ format:en-len 1)))))))
+
+(define (format:fn-zfill left? n) ; fill current number string with 0s
+ (if (> (+ n format:fn-len) format:fn-max) ; from the left or right
+ (format:error "number is too long to format (enlarge format:fn-max)"))
+ (set! format:fn-len (+ format:fn-len n))
+ (if left?
+ (do ((i format:fn-len (- i 1))) ; fill n 0s to left
+ ((< i 0))
+ (string-set! format:fn-str i
+ (if (< i n)
+ #\0
+ (string-ref format:fn-str (- i n)))))
+ (do ((i (- format:fn-len n) (+ i 1))) ; fill n 0s to the right
+ ((= i format:fn-len))
+ (string-set! format:fn-str i #\0))))
+
+(define (format:fn-shiftleft n) ; shift left current number n positions
+ (if (> n format:fn-len)
+ (format:error "internal error in format:fn-shiftleft (~d,~d)"
+ n format:fn-len))
+ (do ((i n (+ i 1)))
+ ((= i format:fn-len)
+ (set! format:fn-len (- format:fn-len n)))
+ (string-set! format:fn-str (- i n) (string-ref format:fn-str i))))
+
+(define (format:fn-round digits) ; round format:fn-str
+ (set! digits (+ digits format:fn-dot))
+ (do ((i digits (- i 1)) ; "099",2 -> "10"
+ (c 5)) ; "023",2 -> "02"
+ ((or (= c 0) (< i 0)) ; "999",2 -> "100"
+ (if (= c 1) ; "005",2 -> "01"
+ (begin ; carry overflow
+ (set! format:fn-len digits)
+ (format:fn-zfill #t 1) ; add a 1 before fn-str
+ (string-set! format:fn-str 0 #\1)
+ (set! format:fn-dot (+ format:fn-dot 1)))
+ (set! format:fn-len digits)))
+ (set! c (+ (- (char->integer (string-ref format:fn-str i))
+ format:zero-ch) c))
+ (string-set! format:fn-str i (integer->char
+ (if (< c 10)
+ (+ c format:zero-ch)
+ (+ (- c 10) format:zero-ch))))
+ (set! c (if (< c 10) 0 1))))
+
+(define (format:fn-out modifier add-leading-zero?)
+ (if format:fn-pos?
+ (if (eq? modifier 'at)
+ (format:out-char #\+))
+ (format:out-char #\-))
+ (if (= format:fn-dot 0)
+ (if add-leading-zero?
+ (format:out-char #\0))
+ (format:out-substr format:fn-str 0 format:fn-dot))
+ (format:out-char #\.)
+ (format:out-substr format:fn-str format:fn-dot format:fn-len))
+
+(define (format:en-out edigits expch)
+ (format:out-char (if expch (integer->char expch) format:expch))
+ (format:out-char (if format:en-pos? #\+ #\-))
+ (if edigits
+ (if (< format:en-len edigits)
+ (format:out-fill (- edigits format:en-len) #\0)))
+ (format:out-substr format:en-str 0 format:en-len))
+
+(define (format:fn-strip) ; strip trailing zeros but one
+ (string-set! format:fn-str format:fn-len #\0)
+ (do ((i format:fn-len (- i 1)))
+ ((or (not (char=? (string-ref format:fn-str i) #\0))
+ (<= i format:fn-dot))
+ (set! format:fn-len (+ i 1)))))
+
+(define (format:fn-zlead) ; count leading zeros
+ (do ((i 0 (+ i 1)))
+ ((or (= i format:fn-len)
+ (not (char=? (string-ref format:fn-str i) #\0)))
+ (if (= i format:fn-len) ; found a real zero
+ 0
+ i))))
+
+
+;;; some global functions not found in SLIB
+
+(define (format:string-capitalize-first str) ; "hello" -> "Hello"
+ (let ((cap-str (string-copy str)) ; "hELLO" -> "Hello"
+ (non-first-alpha #f) ; "*hello" -> "*Hello"
+ (str-len (string-length str))) ; "hello you" -> "Hello you"
+ (do ((i 0 (+ i 1)))
+ ((= i str-len) cap-str)
+ (let ((c (string-ref str i)))
+ (if (char-alphabetic? c)
+ (if non-first-alpha
+ (string-set! cap-str i (char-downcase c))
+ (begin
+ (set! non-first-alpha #t)
+ (string-set! cap-str i (char-upcase c)))))))))
+
+(define (format:list-head l k)
+ (if (= k 0)
+ '()
+ (cons (car l) (format:list-head (cdr l) (- k 1)))))
+
+
+;; Aborts the program when a formatting error occures. This is a null
+;; argument closure to jump to the interpreters toplevel continuation.
+
+(define format:abort (lambda () (slib:error "error in format")))
+
+(define format format:format)
+
+;; If this is not possible then a continuation is used to recover
+;; properly from a format error. In this case format returns #f.
+
+;(define format:abort
+; (lambda () (format:error-continuation #f)))
+
+;(define format
+; (lambda args ; wraps format:format with an error
+; (call-with-current-continuation ; continuation
+; (lambda (cont)
+; (set! format:error-continuation cont)
+; (apply format:format args)))))
+
+;eof
diff --git a/formatst.scm b/formatst.scm
new file mode 100644
index 0000000..77a46c4
--- /dev/null
+++ b/formatst.scm
@@ -0,0 +1,666 @@
+;; "formatst.scm" SLIB FORMAT Version 3.0 conformance test
+; Written by Dirk Lutzebaeck (lutzeb@cs.tu-berlin.de)
+;
+; This code is in the public domain.
+
+;; Test run: (slib:load "formatst")
+
+; Failure reports for various scheme interpreters:
+;
+; SCM4d
+; None.
+; Elk 2.2:
+; None.
+; MIT C-Scheme 7.1:
+; The empty list is always evaluated as a boolean and consequently
+; represented as `#f'.
+; Scheme->C 01nov91:
+; None, if format:symbol-case-conv and format:iobj-case-conv are set
+; to string-downcase.
+
+(require 'format)
+(if (not (string=? format:version "3.0"))
+ (begin
+ (display "You have format version ")
+ (display format:version)
+ (display ". This test is for format version 3.0!")
+ (newline)
+ (format:abort)))
+
+(define fails 0)
+(define total 0)
+(define test-verbose #f) ; shows each test performed
+
+(define (test format-args out-str)
+ (set! total (+ total 1))
+ (if (not test-verbose)
+ (if (zero? (modulo total 10))
+ (begin
+ (display total)
+ (display ",")
+ (force-output (current-output-port)))))
+ (let ((format-out (apply format `(#f ,@format-args))))
+ (if (string=? out-str format-out)
+ (if test-verbose
+ (begin
+ (display "Verified ")
+ (write format-args)
+ (display " returns ")
+ (write out-str)
+ (newline)))
+ (begin
+ (set! fails (+ fails 1))
+ (if (not test-verbose) (newline))
+ (display "*Failed* ")
+ (write format-args)
+ (newline)
+ (display " returns ")
+ (write format-out)
+ (newline)
+ (display " expected ")
+ (write out-str)
+ (newline)))))
+
+; ensure format default configuration
+
+(set! format:symbol-case-conv #f)
+(set! format:iobj-case-conv #f)
+(set! format:read-proof #f)
+(set! format:iteration-bounded #t)
+(set! format:max-iterations 100)
+
+(format #t "~q")
+
+(format #t "This implementation has~@[ no~] flonums ~
+ ~:[but no~;and~] complex numbers~%"
+ (not format:floats) format:complex-numbers)
+
+; any object test
+
+(test '("abc") "abc")
+(test '("~a" 10) "10")
+(test '("~a" -1.2) "-1.2")
+(test '("~a" a) "a")
+(test '("~a" #t) "#t")
+(test '("~a" #f) "#f")
+(test '("~a" "abc") "abc")
+(test '("~a" #(1 2 3)) "#(1 2 3)")
+(test '("~a" ()) "()")
+(test '("~a" (a)) "(a)")
+(test '("~a" (a b)) "(a b)")
+(test '("~a" (a (b c) d)) "(a (b c) d)")
+(test '("~a" (a . b)) "(a . b)")
+(test '("~a" (a (b c . d))) "(a (b . (c . d)))") ; this is ugly
+(test `("~a" ,display) (format:iobj->str display))
+(test `("~a" ,(current-input-port)) (format:iobj->str (current-input-port)))
+(test `("~a" ,(current-output-port)) (format:iobj->str (current-output-port)))
+
+; # argument test
+
+(test '("~a ~a" 10 20) "10 20")
+(test '("~a abc ~a def" 10 20) "10 abc 20 def")
+
+; numerical test
+
+(test '("~d" 100) "100")
+(test '("~x" 100) "64")
+(test '("~o" 100) "144")
+(test '("~b" 100) "1100100")
+(test '("~@d" 100) "+100")
+(test '("~@d" -100) "-100")
+(test '("~@x" 100) "+64")
+(test '("~@o" 100) "+144")
+(test '("~@b" 100) "+1100100")
+(test '("~10d" 100) " 100")
+(test '("~:d" 123) "123")
+(test '("~:d" 1234) "1,234")
+(test '("~:d" 12345) "12,345")
+(test '("~:d" 123456) "123,456")
+(test '("~:d" 12345678) "12,345,678")
+(test '("~:d" -123) "-123")
+(test '("~:d" -1234) "-1,234")
+(test '("~:d" -12345) "-12,345")
+(test '("~:d" -123456) "-123,456")
+(test '("~:d" -12345678) "-12,345,678")
+(test '("~10:d" 1234) " 1,234")
+(test '("~10:d" -1234) " -1,234")
+(test '("~10,'*d" 100) "*******100")
+(test '("~10,,'|:d" 12345678) "12|345|678")
+(test '("~10,,,2:d" 12345678) "12,34,56,78")
+(test '("~14,'*,'|,4:@d" 12345678) "****+1234|5678")
+(test '("~10r" 100) "100")
+(test '("~2r" 100) "1100100")
+(test '("~8r" 100) "144")
+(test '("~16r" 100) "64")
+(test '("~16,10,'*r" 100) "********64")
+
+; roman numeral test
+
+(test '("~@r" 4) "IV")
+(test '("~@r" 19) "XIX")
+(test '("~@r" 50) "L")
+(test '("~@r" 100) "C")
+(test '("~@r" 1000) "M")
+(test '("~@r" 99) "XCIX")
+(test '("~@r" 1994) "MCMXCIV")
+
+; old roman numeral test
+
+(test '("~:@r" 4) "IIII")
+(test '("~:@r" 5) "V")
+(test '("~:@r" 10) "X")
+(test '("~:@r" 9) "VIIII")
+
+; cardinal/ordinal English number test
+
+(test '("~r" 4) "four")
+(test '("~r" 10) "ten")
+(test '("~r" 19) "nineteen")
+(test '("~r" 1984) "one thousand, nine hundred eighty-four")
+(test '("~:r" -1984) "minus one thousand, nine hundred eighty-fourth")
+
+; character test
+
+(test '("~c" #\a) "a")
+(test '("~@c" #\a) "#\\a")
+(test `("~@c" ,(integer->char 32)) "#\\space")
+(test `("~@c" ,(integer->char 0)) "#\\nul")
+(test `("~@c" ,(integer->char 27)) "#\\esc")
+(test `("~@c" ,(integer->char 127)) "#\\del")
+(test `("~@c" ,(integer->char 128)) "#\\200")
+(test `("~@c" ,(integer->char 255)) "#\\377")
+(test '("~65c") "A")
+(test '("~7@c") "#\\bel")
+(test '("~:c" #\a) "a")
+(test `("~:c" ,(integer->char 1)) "^A")
+(test `("~:c" ,(integer->char 27)) "^[")
+(test '("~7:c") "^G")
+(test `("~:c" ,(integer->char 128)) "#\\200")
+(test `("~:c" ,(integer->char 127)) "#\\177")
+(test `("~:c" ,(integer->char 255)) "#\\377")
+
+
+; plural test
+
+(test '("test~p" 1) "test")
+(test '("test~p" 2) "tests")
+(test '("test~p" 0) "tests")
+(test '("tr~@p" 1) "try")
+(test '("tr~@p" 2) "tries")
+(test '("tr~@p" 0) "tries")
+(test '("~a test~:p" 10) "10 tests")
+(test '("~a test~:p" 1) "1 test")
+
+; tilde test
+
+(test '("~~~~") "~~")
+(test '("~3~") "~~~")
+
+; whitespace character test
+
+(test '("~%") "
+")
+(test '("~3%") "
+
+
+")
+(test '("~&") "")
+(test '("abc~&") "abc
+")
+(test '("abc~&def") "abc
+def")
+(test '("~&") "
+")
+(test '("~3&") "
+
+")
+(test '("abc~3&") "abc
+
+
+")
+(test '("~|") (string slib:form-feed))
+(test '("~_~_~_") " ")
+(test '("~3_") " ")
+(test '("~/") (string slib:tab))
+(test '("~3/") (make-string 3 slib:tab))
+
+; tabulate test
+
+(test '("~0&~3t") " ")
+(test '("~0&~10t") " ")
+(test '("~10t") "")
+(test '("~0&1234567890~,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~0,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~1,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~2,8tABC") "1234567890ABC")
+(test '("~0&1234567890~3,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~4,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~5,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~6,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~7,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~8,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~9,8tABC") "1234567890 ABC")
+(test '("~0&1234567890~10,8tABC") "1234567890ABC")
+(test '("~0&1234567890~11,8tABC") "1234567890 ABC")
+(test '("~0&12345~,8tABCDE~,8tXYZ") "12345 ABCDE XYZ")
+(test '("~,8t+++~,8t===") " +++ ===")
+(test '("~0&ABC~,8,'.tDEF") "ABC......DEF")
+(test '("~0&~3,8@tABC") " ABC")
+(test '("~0&1234~3,8@tABC") "1234 ABC")
+(test '("~0&12~3,8@tABC~3,8@tDEF") "12 ABC DEF")
+
+; indirection test
+
+(test '("~a ~? ~a" 10 "~a ~a" (20 30) 40) "10 20 30 40")
+(test '("~a ~@? ~a" 10 "~a ~a" 20 30 40) "10 20 30 40")
+
+; field test
+
+(test '("~10a" "abc") "abc ")
+(test '("~10@a" "abc") " abc")
+(test '("~10a" "0123456789abc") "0123456789abc")
+(test '("~10@a" "0123456789abc") "0123456789abc")
+
+; pad character test
+
+(test '("~10,,,'*a" "abc") "abc*******")
+(test '("~10,,,'Xa" "abc") "abcXXXXXXX")
+(test '("~10,,,42a" "abc") "abc*******")
+(test '("~10,,,'*@a" "abc") "*******abc")
+(test '("~10,,3,'*a" "abc") "abc*******")
+(test '("~10,,3,'*a" "0123456789abc") "0123456789abc***") ; min. padchar length
+(test '("~10,,3,'*@a" "0123456789abc") "***0123456789abc")
+
+; colinc, minpad padding test
+
+(test '("~10,8,0,'*a" 123) "123********")
+(test '("~10,9,0,'*a" 123) "123*********")
+(test '("~10,10,0,'*a" 123) "123**********")
+(test '("~10,11,0,'*a" 123) "123***********")
+(test '("~8,1,0,'*a" 123) "123*****")
+(test '("~8,2,0,'*a" 123) "123******")
+(test '("~8,3,0,'*a" 123) "123******")
+(test '("~8,4,0,'*a" 123) "123********")
+(test '("~8,5,0,'*a" 123) "123*****")
+(test '("~8,1,3,'*a" 123) "123*****")
+(test '("~8,1,5,'*a" 123) "123*****")
+(test '("~8,1,6,'*a" 123) "123******")
+(test '("~8,1,9,'*a" 123) "123*********")
+
+; slashify test
+
+(test '("~s" "abc") "\"abc\"")
+(test '("~s" "abc \\ abc") "\"abc \\\\ abc\"")
+(test '("~a" "abc \\ abc") "abc \\ abc")
+(test '("~s" "abc \" abc") "\"abc \\\" abc\"")
+(test '("~a" "abc \" abc") "abc \" abc")
+(test '("~s" #\space) "#\\space")
+(test '("~s" #\newline) "#\\newline")
+(test `("~s" ,slib:tab) "#\\ht")
+(test '("~s" #\a) "#\\a")
+(test '("~a" (a "b" c)) "(a \"b\" c)")
+
+; symbol case force test
+
+(define format:old-scc format:symbol-case-conv)
+(set! format:symbol-case-conv string-upcase)
+(test '("~a" abc) "ABC")
+(set! format:symbol-case-conv string-downcase)
+(test '("~s" abc) "abc")
+(set! format:symbol-case-conv string-capitalize)
+(test '("~s" abc) "Abc")
+(set! format:symbol-case-conv format:old-scc)
+
+; read proof test
+
+(test `("~:s" ,display)
+ (begin
+ (set! format:read-proof #t)
+ (format:iobj->str display)))
+(test `("~:a" ,display)
+ (begin
+ (set! format:read-proof #t)
+ (format:iobj->str display)))
+(test `("~:a" (1 2 ,display))
+ (begin
+ (set! format:read-proof #t)
+ (string-append "(1 2 " (format:iobj->str display) ")")))
+(test '("~:a" "abc") "abc")
+(set! format:read-proof #f)
+
+; internal object case type force test
+
+(set! format:iobj-case-conv string-upcase)
+(test `("~a" ,display) (string-upcase (format:iobj->str display)))
+(set! format:iobj-case-conv string-downcase)
+(test `("~s" ,display) (string-downcase (format:iobj->str display)))
+(set! format:iobj-case-conv string-capitalize)
+(test `("~s" ,display) (string-capitalize (format:iobj->str display)))
+(set! format:iobj-case-conv #f)
+
+; continuation line test
+
+(test '("abc~
+ 123") "abc123")
+(test '("abc~
+123") "abc123")
+(test '("abc~
+") "abc")
+(test '("abc~:
+ def") "abc def")
+(test '("abc~@
+ def")
+"abc
+def")
+
+; flush output (can't test it here really)
+
+(test '("abc ~! xyz") "abc xyz")
+
+; string case conversion
+
+(test '("~a ~(~a~) ~a" "abc" "HELLO WORLD" "xyz") "abc hello world xyz")
+(test '("~a ~:(~a~) ~a" "abc" "HELLO WORLD" "xyz") "abc Hello World xyz")
+(test '("~a ~@(~a~) ~a" "abc" "HELLO WORLD" "xyz") "abc Hello world xyz")
+(test '("~a ~:@(~a~) ~a" "abc" "hello world" "xyz") "abc HELLO WORLD xyz")
+(test '("~:@(~a~)" (a b c)) "(A B C)")
+(test '("~:@(~x~)" 255) "FF")
+(test '("~:@(~p~)" 2) "S")
+(test `("~:@(~a~)" ,display) (string-upcase (format:iobj->str display)))
+(test '("~:(~a ~a ~a~) ~a" "abc" "xyz" "123" "world") "Abc Xyz 123 world")
+
+; variable parameter
+
+(test '("~va" 10 "abc") "abc ")
+(test '("~v,,,va" 10 42 "abc") "abc*******")
+
+; number of remaining arguments as parameter
+
+(test '("~#,,,'*@a ~a ~a ~a" 1 1 1 1) "***1 1 1 1")
+
+; argument jumping
+
+(test '("~a ~* ~a" 10 20 30) "10 30")
+(test '("~a ~2* ~a" 10 20 30 40) "10 40")
+(test '("~a ~:* ~a" 10) "10 10")
+(test '("~a ~a ~2:* ~a ~a" 10 20) "10 20 10 20")
+(test '("~a ~a ~@* ~a ~a" 10 20) "10 20 10 20")
+(test '("~a ~a ~4@* ~a ~a" 10 20 30 40 50 60) "10 20 50 60")
+
+; conditionals
+
+(test '("~[abc~;xyz~]" 0) "abc")
+(test '("~[abc~;xyz~]" 1) "xyz")
+(test '("~[abc~;xyz~:;456~]" 99) "456")
+(test '("~0[abc~;xyz~:;456~]") "abc")
+(test '("~1[abc~;xyz~:;456~] ~a" 100) "xyz 100")
+(test '("~#[no arg~;~a~;~a and ~a~;~a, ~a and ~a~]") "no arg")
+(test '("~#[no arg~;~a~;~a and ~a~;~a, ~a and ~a~]" 10) "10")
+(test '("~#[no arg~;~a~;~a and ~a~;~a, ~a and ~a~]" 10 20) "10 and 20")
+(test '("~#[no arg~;~a~;~a and ~a~;~a, ~a and ~a~]" 10 20 30) "10, 20 and 30")
+(test '("~:[hello~;world~] ~a" #t 10) "world 10")
+(test '("~:[hello~;world~] ~a" #f 10) "hello 10")
+(test '("~@[~a tests~]" #f) "")
+(test '("~@[~a tests~]" 10) "10 tests")
+(test '("~@[~a test~:p~] ~a" 10 done) "10 tests done")
+(test '("~@[~a test~:p~] ~a" 1 done) "1 test done")
+(test '("~@[~a test~:p~] ~a" 0 done) "0 tests done")
+(test '("~@[~a test~:p~] ~a" #f done) " done")
+(test '("~@[ level = ~d~]~@[ length = ~d~]" #f 5) " length = 5")
+(test '("~[abc~;~[4~;5~;6~]~;xyz~]" 0) "abc") ; nested conditionals (irrghh)
+(test '("~[abc~;~[4~;5~;6~]~;xyz~]" 2) "xyz")
+(test '("~[abc~;~[4~;5~;6~]~;xyz~]" 1 2) "6")
+
+; iteration
+
+(test '("~{ ~a ~}" (a b c)) " a b c ")
+(test '("~{ ~a ~}" ()) "")
+(test '("~{ ~a ~5,,,'*a~}" (a b c d)) " a b**** c d****")
+(test '("~{ ~a,~a ~}" (a 1 b 2 c 3)) " a,1 b,2 c,3 ")
+(test '("~2{ ~a,~a ~}" (a 1 b 2 c 3)) " a,1 b,2 ")
+(test '("~3{~a ~} ~a" (a b c d e) 100) "a b c 100")
+(test '("~0{~a ~} ~a" (a b c d e) 100) " 100")
+(test '("~:{ ~a,~a ~}" ((a b) (c d e f) (g h))) " a,b c,d g,h ")
+(test '("~2:{ ~a,~a ~}" ((a b) (c d e f) (g h))) " a,b c,d ")
+(test '("~@{ ~a,~a ~}" a 1 b 2 c 3) " a,1 b,2 c,3 ")
+(test '("~2@{ ~a,~a ~} <~a|~a>" a 1 b 2 c 3) " a,1 b,2 <c|3>")
+(test '("~:@{ ~a,~a ~}" (a 1) (b 2) (c 3)) " a,1 b,2 c,3 ")
+(test '("~2:@{ ~a,~a ~} ~a" (a 1) (b 2) (c 3)) " a,1 b,2 (c 3)")
+(test '("~{~}" "<~a,~a>" (a 1 b 2 c 3)) "<a,1><b,2><c,3>")
+(test '("~{ ~a ~{<~a>~}~} ~a" (a (1 2) b (3 4)) 10) " a <1><2> b <3><4> 10")
+(let ((nums (let iter ((ns '()) (l 0))
+ (if (> l 105) (reverse ns) (iter (cons l ns) (+ l 1))))))
+ ;; Test default, only 100 items formatted out:
+ (test `("~D~{, ~D~}" ,(car nums) ,(cdr nums))
+ "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100")
+ ;; Test control of number of items formatted out:
+ (set! format:max-iterations 90)
+ (test `("~D~{, ~D~}" ,(car nums) ,(cdr nums))
+ "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90")
+ ;; Test control of imposing bound on number of items formatted out:
+ (set! format:iteration-bounded #f)
+ (test `("~D~{, ~D~}" ,(car nums) ,(cdr nums))
+ "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105")
+ ;; Restore defaults:
+ (set! format:iteration-bounded #t)
+ (set! format:max-iterations 100)
+ )
+
+; up and out
+
+(test '("abc ~^ xyz") "abc ")
+(test '("~@(abc ~^ xyz~) ~a" 10) "ABC xyz 10")
+(test '("done. ~^ ~d warning~:p. ~^ ~d error~:p.") "done. ")
+(test '("done. ~^ ~d warning~:p. ~^ ~d error~:p." 10) "done. 10 warnings. ")
+(test '("done. ~^ ~d warning~:p. ~^ ~d error~:p." 10 1)
+ "done. 10 warnings. 1 error.")
+(test '("~{ ~a ~^<~a>~} ~a" (a b c d e f) 10) " a <b> c <d> e <f> 10")
+(test '("~{ ~a ~^<~a>~} ~a" (a b c d e) 10) " a <b> c <d> e 10")
+(test '("abc~0^ xyz") "abc")
+(test '("abc~9^ xyz") "abc xyz")
+(test '("abc~7,4^ xyz") "abc xyz")
+(test '("abc~7,7^ xyz") "abc")
+(test '("abc~3,7,9^ xyz") "abc")
+(test '("abc~8,7,9^ xyz") "abc xyz")
+(test '("abc~3,7,5^ xyz") "abc xyz")
+
+; complexity tests (oh my god, I hardly understand them myself (see CL std))
+
+(define fmt "Items:~#[ none~; ~a~; ~a and ~a~:;~@{~#[~; and~] ~a~^,~}~].")
+
+(test `(,fmt ) "Items: none.")
+(test `(,fmt foo) "Items: foo.")
+(test `(,fmt foo bar) "Items: foo and bar.")
+(test `(,fmt foo bar baz) "Items: foo, bar, and baz.")
+(test `(,fmt foo bar baz zok) "Items: foo, bar, baz, and zok.")
+
+; fixed floating points
+
+(cond
+ (format:floats
+ (test '("~6,2f" 3.14159) " 3.14")
+ (test '("~6,1f" 3.14159) " 3.1")
+ (test '("~6,0f" 3.14159) " 3.")
+ (test '("~5,1f" 0) " 0.0")
+ (test '("~10,7f" 3.14159) " 3.1415900")
+ (test '("~10,7f" -3.14159) "-3.1415900")
+ (test '("~10,7@f" 3.14159) "+3.1415900")
+ (test '("~6,3f" 0.0) " 0.000")
+ (test '("~6,4f" 0.007) "0.0070")
+ (test '("~6,3f" 0.007) " 0.007")
+ (test '("~6,2f" 0.007) " 0.01")
+ (test '("~3,2f" 0.007) ".01")
+ (test '("~3,2f" -0.007) "-.01")
+ (test '("~6,2,,,'*f" 3.14159) "**3.14")
+ (test '("~6,3,,'?f" 12345.56789) "??????")
+ (test '("~6,3f" 12345.6789) "12345.679")
+ (test '("~,3f" 12345.6789) "12345.679")
+ (test '("~,3f" 9.9999) "10.000")
+ (test '("~6f" 23.4) " 23.4")
+ (test '("~6f" 1234.5) "1234.5")
+ (test '("~6f" 12345678) "12345678.0")
+ (test '("~6,,,'?f" 12345678) "??????")
+ (test '("~6f" 123.56789) "123.57")
+ (test '("~6f" 123.0) " 123.0")
+ (test '("~6f" -123.0) "-123.0")
+ (test '("~6f" 0.0) " 0.0")
+ (test '("~3f" 3.141) "3.1")
+ (test '("~2f" 3.141) "3.")
+ (test '("~1f" 3.141) "3.141")
+ (test '("~f" 123.56789) "123.56789")
+ (test '("~f" -314.0) "-314.0")
+ (test '("~f" 1e4) "10000.0")
+ (test '("~f" -1.23e10) "-12300000000.0")
+ (test '("~f" 1e-4) "0.0001")
+ (test '("~f" -1.23e-10) "-0.000000000123")
+ (test '("~@f" 314.0) "+314.0")
+ (test '("~,,3f" 0.123456) "123.456")
+ (test '("~,,-3f" -123.456) "-0.123456")
+ (test '("~5,,3f" 0.123456) "123.5")
+))
+
+; exponent floating points
+
+(cond
+ (format:floats
+ (test '("~e" 3.14159) "3.14159E+0")
+ (test '("~e" 0.00001234) "1.234E-5")
+ (test '("~,,,0e" 0.00001234) "0.1234E-4")
+ (test '("~,3e" 3.14159) "3.142E+0")
+ (test '("~,3@e" 3.14159) "+3.142E+0")
+ (test '("~,3@e" 0.0) "+0.000E+0")
+ (test '("~,0e" 3.141) "3.E+0")
+ (test '("~,3,,0e" 3.14159) "0.314E+1")
+ (test '("~,5,3,-2e" 3.14159) "0.00314E+003")
+ (test '("~,5,3,-5e" -3.14159) "-0.00000E+006")
+ (test '("~,5,2,2e" 3.14159) "31.4159E-01")
+ (test '("~,5,2,,,,'ee" 0.0) "0.00000e+00")
+ (test '("~12,3e" -3.141) " -3.141E+0")
+ (test '("~12,3,,,,'#e" -3.141) "###-3.141E+0")
+ (test '("~10,2e" -1.236e-4) " -1.24E-4")
+ (test '("~5,3e" -3.141) "-3.141E+0")
+ (test '("~5,3,,,'*e" -3.141) "*****")
+ (test '("~3e" 3.14159) "3.14159E+0")
+ (test '("~4e" 3.14159) "3.14159E+0")
+ (test '("~5e" 3.14159) "3.E+0")
+ (test '("~5,,,,'*e" 3.14159) "3.E+0")
+ (test '("~6e" 3.14159) "3.1E+0")
+ (test '("~7e" 3.14159) "3.14E+0")
+ (test '("~7e" -3.14159) "-3.1E+0")
+ (test '("~8e" 3.14159) "3.142E+0")
+ (test '("~9e" 3.14159) "3.1416E+0")
+ (test '("~9,,,,,,'ee" 3.14159) "3.1416e+0")
+ (test '("~10e" 3.14159) "3.14159E+0")
+ (test '("~11e" 3.14159) " 3.14159E+0")
+ (test '("~12e" 3.14159) " 3.14159E+0")
+ (test '("~13,6,2,-5e" 3.14159) " 0.000003E+06")
+ (test '("~13,6,2,-4e" 3.14159) " 0.000031E+05")
+ (test '("~13,6,2,-3e" 3.14159) " 0.000314E+04")
+ (test '("~13,6,2,-2e" 3.14159) " 0.003142E+03")
+ (test '("~13,6,2,-1e" 3.14159) " 0.031416E+02")
+ (test '("~13,6,2,0e" 3.14159) " 0.314159E+01")
+ (test '("~13,6,2,1e" 3.14159) " 3.141590E+00")
+ (test '("~13,6,2,2e" 3.14159) " 31.41590E-01")
+ (test '("~13,6,2,3e" 3.14159) " 314.1590E-02")
+ (test '("~13,6,2,4e" 3.14159) " 3141.590E-03")
+ (test '("~13,6,2,5e" 3.14159) " 31415.90E-04")
+ (test '("~13,6,2,6e" 3.14159) " 314159.0E-05")
+ (test '("~13,6,2,7e" 3.14159) " 3141590.E-06")
+ (test '("~13,6,2,8e" 3.14159) "31415900.E-07")
+ (test '("~7,3,,-2e" 0.001) ".001E+0")
+ (test '("~8,3,,-2@e" 0.001) "+.001E+0")
+ (test '("~8,3,,-2@e" -0.001) "-.001E+0")
+ (test '("~8,3,,-2e" 0.001) "0.001E+0")
+ (test '("~7,,,-2e" 0.001) "0.00E+0")
+ (test '("~12,3,1e" 3.14159e12) " 3.142E+12")
+ (test '("~12,3,1,,'*e" 3.14159e12) "************")
+ (test '("~5,3,1e" 3.14159e12) "3.142E+12")
+))
+
+; general floating point (this test is from Steele's CL book)
+
+(cond
+ (format:floats
+ (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g"
+ 0.0314159 0.0314159 0.0314159 0.0314159)
+ " 3.14E-2|314.2$-04|0.314E-01| 3.14E-2")
+ (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g"
+ 0.314159 0.314159 0.314159 0.314159)
+ " 0.31 |0.314 |0.314 | 0.31 ")
+ (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g"
+ 3.14159 3.14159 3.14159 3.14159)
+ " 3.1 | 3.14 | 3.14 | 3.1 ")
+ (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g"
+ 31.4159 31.4159 31.4159 31.4159)
+ " 31. | 31.4 | 31.4 | 31. ")
+ (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g"
+ 314.159 314.159 314.159 314.159)
+ " 3.14E+2| 314. | 314. | 3.14E+2")
+ (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g"
+ 3141.59 3141.59 3141.59 3141.59)
+ " 3.14E+3|314.2$+01|0.314E+04| 3.14E+3")
+ (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g"
+ 3.14E12 3.14E12 3.14E12 3.14E12)
+ "*********|314.0$+10|0.314E+13| 3.14E+12")
+ (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g"
+ 3.14E120 3.14E120 3.14E120 3.14E120)
+ "*********|?????????|%%%%%%%%%|3.14E+120")
+
+ (test '("~g" 0.0) "0.0 ") ; further ~g tests
+ (test '("~g" 0.1) "0.1 ")
+ (test '("~g" 0.01) "1.0E-2")
+ (test '("~g" 123.456) "123.456 ")
+ (test '("~g" 123456.7) "123456.7 ")
+ (test '("~g" 123456.78) "123456.78 ")
+ (test '("~g" 0.9282) "0.9282 ")
+ (test '("~g" 0.09282) "9.282E-2")
+ (test '("~g" 1) "1.0 ")
+ (test '("~g" 12) "12.0 ")
+ ))
+
+; dollar floating point
+
+(cond
+ (format:floats
+ (test '("~$" 1.23) "1.23")
+ (test '("~$" 1.2) "1.20")
+ (test '("~$" 0.0) "0.00")
+ (test '("~$" 9.999) "10.00")
+ (test '("~3$" 9.9999) "10.000")
+ (test '("~,4$" 3.2) "0003.20")
+ (test '("~,4$" 10000.2) "10000.20")
+ (test '("~,4,10$" 3.2) " 0003.20")
+ (test '("~,4,10@$" 3.2) " +0003.20")
+ (test '("~,4,10:@$" 3.2) "+ 0003.20")
+ (test '("~,4,10:$" -3.2) "- 0003.20")
+ (test '("~,4,10$" -3.2) " -0003.20")
+ (test '("~,,10@$" 3.2) " +3.20")
+ (test '("~,,10:@$" 3.2) "+ 3.20")
+ (test '("~,,10:@$" -3.2) "- 3.20")
+ (test '("~,,10,'_@$" 3.2) "_____+3.20")
+ (test '("~,,4$" 1234.4) "1234.40")
+))
+
+; complex numbers
+
+(cond
+ (format:complex-numbers
+ (test '("~i" 3.0) "3.0+0.0i")
+ (test '("~,3i" 3.0) "3.000+0.000i")
+ (test `("~7,2i" ,(string->number "3.0+5.0i")) " 3.00 +5.00i")
+ (test `("~7,2,1i" ,(string->number "3.0+5.0i")) " 30.00 +50.00i")
+ (test `("~7,2@i" ,(string->number "3.0+5.0i")) " +3.00 +5.00i")
+ (test `("~7,2,,,'*@i" ,(string->number "3.0+5.0i")) "**+3.00**+5.00i")
+ )) ; note: some parsers choke syntactically on reading a complex
+ ; number though format:complex is #f; this is why we put them in
+ ; strings
+
+; inquiry test
+
+(test '("~:q") format:version)
+
+(if (not test-verbose) (display "done."))
+
+(format #t "~%~a Test~:p completed. (~a failure~:p)~2%" total fails)
+
+; eof
diff --git a/guile.init.local b/guile.init.local
new file mode 100644
index 0000000..551a7a2
--- /dev/null
+++ b/guile.init.local
@@ -0,0 +1,416 @@
+;"guile.init" Configuration file for SLIB for GUILE -*-scheme-*-
+;;; Author: Aubrey Jaffer
+;;;
+;;; This code is in the public domain.
+
+(if (string<? (version) "1.6")
+ (define-module (ice-9 slib))) ; :no-backtrace
+(define slib-module (current-module))
+(define (defined? symbol) (module-defined? slib-module symbol))
+
+(define base:define define)
+(define define
+ (procedure->memoizing-macro
+ (lambda (exp env)
+ (cons (if (= 1 (length env)) 'define-public 'base:define) (cdr exp)))))
+
+;;; Hack to make syncase macros work in the slib module
+(if (nested-ref the-root-module '(app modules ice-9 syncase))
+ (set-object-property! (module-local-variable (current-module) 'define)
+ '*sc-expander*
+ '(define)))
+
+;;; (software-type) should be set to the generic operating system type.
+;;; UNIX, VMS, MACOS, AMIGA and MS-DOS are supported.
+(define (software-type) 'unix)
+
+;;; (scheme-implementation-type) should return the name of the scheme
+;;; implementation loading this file.
+(define (scheme-implementation-type) 'guile)
+
+;;; (scheme-implementation-home-page) should return a (string) URI
+;;; (Uniform Resource Identifier) for this scheme implementation's home
+;;; page; or false if there isn't one.
+(define (scheme-implementation-home-page)
+ "http://www.gnu.org/software/guile/guile.html")
+
+;;; (scheme-implementation-version) should return a string describing
+;;; the version the scheme implementation loading this file.
+(define scheme-implementation-version version)
+
+(define in-vicinity string-append)
+
+;;; (implementation-vicinity) should be defined to be the pathname of
+;;; the directory where any auxillary files to your Scheme
+;;; implementation reside.
+(define implementation-vicinity
+ (let ((path '"."))
+ (lambda () path)))
+
+;;; (library-vicinity) should be defined to be the pathname of the
+;;; directory where files of Scheme library functions reside.
+(define library-vicinity
+ (let ((library-path
+ (or
+ ;; Use this getenv if your implementation supports it.
+ (and (defined? 'getenv) (getenv "SCHEME_LIBRARY_PATH"))
+ ;; Use this path if your scheme does not support GETENV
+ ;; or if SCHEME_LIBRARY_PATH is not set.
+ (in-vicinity (implementation-vicinity) "slib/"))))
+ (lambda () library-path)))
+
+;;; (home-vicinity) should return the vicinity of the user's HOME
+;;; directory, the directory which typically contains files which
+;;; customize a computer environment for a user.
+(define (home-vicinity)
+ (let ((home (getenv "HOME")))
+ (and home
+ (case (software-type)
+ ((unix coherent ms-dos) ;V7 unix has a / on HOME
+ (if (eqv? #\/ (string-ref home (+ -1 (string-length home))))
+ home
+ (string-append home "/")))
+ (else home)))))
+
+;;; *FEATURES* should be set to a list of symbols describing features
+;;; of this implementation. Suggestions for features are:
+(define *features*
+ (append
+ '(
+ source ;can load scheme source files
+ ;(slib:load-source "filename")
+; compiled ;can load compiled files
+ ;(slib:load-compiled "filename")
+
+ ;; Scheme report features
+
+; r5rs ;conforms to
+ eval ;R5RS two-argument eval
+; values ;R5RS multiple values
+ dynamic-wind ;R5RS dynamic-wind
+; macro ;R5RS high level macros
+ delay ;has DELAY and FORCE
+ multiarg-apply ;APPLY can take more than 2 args.
+; rationalize
+ rev4-optional-procedures ;LIST-TAIL, STRING->LIST,
+ ;LIST->STRING, STRING-COPY,
+ ;STRING-FILL!, LIST->VECTOR,
+ ;VECTOR->LIST, and VECTOR-FILL!
+
+; r4rs ;conforms to
+
+; ieee-p1178 ;conforms to
+
+; r3rs ;conforms to
+
+ rev2-procedures ;SUBSTRING-MOVE-LEFT!,
+ ;SUBSTRING-MOVE-RIGHT!,
+ ;SUBSTRING-FILL!,
+ ;STRING-NULL?, APPEND!, 1+,
+ ;-1+, <?, <=?, =?, >?, >=?
+; object-hash ;has OBJECT-HASH
+
+ multiarg/and- ;/ and - can take more than 2 args.
+ with-file ;has WITH-INPUT-FROM-FILE and
+ ;WITH-OUTPUT-TO-FILE
+; transcript ;TRANSCRIPT-ON and TRANSCRIPT-OFF
+; ieee-floating-point ;conforms to IEEE Standard 754-1985
+ ;IEEE Standard for Binary
+ ;Floating-Point Arithmetic.
+ full-continuation ;can return multiple times
+
+ ;; Other common features
+
+; srfi ;srfi-0, COND-EXPAND finds all srfi-*
+; sicp ;runs code from Structure and
+ ;Interpretation of Computer
+ ;Programs by Abelson and Sussman.
+ defmacro ;has Common Lisp DEFMACRO
+; record ;has user defined data structures
+ string-port ;has CALL-WITH-INPUT-STRING and
+ ;CALL-WITH-OUTPUT-STRING
+; sort
+; pretty-print
+; object->string
+; format ;Common-lisp output formatting
+; trace ;has macros: TRACE and UNTRACE
+; compiler ;has (COMPILER)
+; ed ;(ED) is editor
+ random
+ )
+
+ (if (defined? 'getenv)
+ '(getenv)
+ '())
+
+ (if (defined? 'current-time)
+ '(current-time)
+ '())
+
+ (if (defined? 'system)
+ '(system)
+ '())
+
+ (if (defined? 'array?)
+ '(array)
+ '())
+
+ (if (defined? 'char-ready?)
+ '(char-ready?)
+ '())
+
+ (if (defined? 'array-for-each)
+ '(array-for-each)
+ '())
+
+ *features*))
+
+;;; (OUTPUT-PORT-WIDTH <port>)
+(define (output-port-width . arg) 79)
+
+;;; (OUTPUT-PORT-HEIGHT <port>)
+(define (output-port-height . arg) 24)
+
+;;; (CURRENT-ERROR-PORT)
+;;(define current-error-port
+;; (let ((port (current-output-port)))
+;; (lambda () port)))
+
+;;; (TMPNAM) makes a temporary file name.
+;;(define tmpnam (let ((cntr 100))
+;; (lambda () (set! cntr (+ 1 cntr))
+;; (string-append "slib_" (number->string cntr)))))
+
+;;; (FILE-EXISTS? <string>)
+;;(define (file-exists? f) #f)
+
+;;; (DELETE-FILE <string>)
+;;(define (delete-file f) #f)
+
+;;; FORCE-OUTPUT flushes any pending output on optional arg output port
+;;; use this definition if your system doesn't have such a procedure.
+;;(define (force-output . arg) #t)
+
+;;; CALL-WITH-INPUT-STRING and CALL-WITH-OUTPUT-STRING are the string
+;;; port versions of CALL-WITH-*PUT-FILE.
+
+(define (make-exchanger obj)
+ (lambda (rep) (let ((old obj)) (set! obj rep) old)))
+
+(define (port? obj) (or (input-port? obj) (output-port? obj)))
+(define (call-with-open-ports . ports)
+ (define proc (car ports))
+ (cond ((procedure? proc) (set! ports (cdr ports)))
+ (else (set! ports (reverse ports))
+ (set! proc (car ports))
+ (set! ports (reverse (cdr ports)))))
+ (let ((ans (apply proc ports)))
+ (for-each close-port ports)
+ ans))
+
+;;; "rationalize" adjunct procedures.
+;;(define (find-ratio x e)
+;; (let ((rat (rationalize x e)))
+;; (list (numerator rat) (denominator rat))))
+;;(define (find-ratio-between x y)
+;; (find-ratio (/ (+ x y) 2) (/ (- x y) 2)))
+
+;;; CHAR-CODE-LIMIT is one greater than the largest integer which can
+;;; be returned by CHAR->INTEGER.
+;;(define char-code-limit 256)
+
+;;; MOST-POSITIVE-FIXNUM is used in modular.scm
+;;(define most-positive-fixnum #x0FFFFFFF)
+
+;;; Return argument
+(define (identity x) x)
+
+;;; SLIB:EVAL is single argument eval using the top-level (user) environment.
+(define slib:eval
+ (if (string<? (scheme-implementation-version) "1.5")
+ eval
+ (let ((ie (interaction-environment)))
+ (lambda (expression)
+ (eval expression ie)))))
+
+;;; Define SLIB:EXIT to be the implementation procedure to exit or
+;;; return if exitting not supported.
+(define slib:exit quit)
+
+;;; Here for backward compatability
+;;(define scheme-file-suffix
+;; (let ((suffix (case (software-type)
+;; ((NOSVE) "_scm")
+;; (else ".scm"))))
+;; (lambda () suffix)))
+
+(define (slib:eval-load <pathname> evl)
+ (if (not (file-exists? <pathname>))
+ (set! <pathname> (string-append <pathname> (scheme-file-suffix))))
+ (call-with-input-file <pathname>
+ (lambda (port)
+ (let ((old-load-pathname *load-pathname*))
+ (set! *load-pathname* <pathname>)
+ (do ((o (read port) (read port)))
+ ((eof-object? o))
+ (evl o))
+ (set! *load-pathname* old-load-pathname)))))
+
+(define (guile:wrap-case-insensitive proc)
+ (lambda args
+ (save-module-excursion
+ (lambda ()
+ (set-current-module slib-module)
+ (let ((old (read-options)))
+ (dynamic-wind
+ (lambda () (read-enable 'case-insensitive))
+ (lambda () (apply proc args))
+ (lambda () (read-options old))))))))
+
+(define read (guile:wrap-case-insensitive read))
+
+;;; (SLIB:LOAD-SOURCE "foo") should load "foo.scm" or with whatever
+;;; suffix all the module files in SLIB have. See feature 'SOURCE.
+(define slib:load
+ (let ((load-file (guile:wrap-case-insensitive load)))
+ (lambda (<pathname>)
+ (load-file (string-append <pathname> (scheme-file-suffix))))))
+
+(define slib:load-source slib:load)
+
+;;; (SLIB:LOAD-COMPILED "foo") should load the file that was produced
+;;; by compiling "foo.scm" if this implementation can compile files.
+;;; See feature 'COMPILED.
+(define slib:load-compiled slib:load)
+
+(define defmacro:eval slib:eval)
+(define defmacro:load slib:load)
+
+(define (defmacro:expand* x)
+ (require 'defmacroexpand) (apply defmacro:expand* x '()))
+
+;;; If your implementation provides R4RS macros:
+(define macro:eval slib:eval)
+(define macro:load slib:load)
+
+(define slib:warn warn)
+(define slib:error error)
+
+;;; define these as appropriate for your system.
+(define slib:tab #\tab)
+(define slib:form-feed #\page)
+
+;;; {Time}
+(define difftime -)
+(define offset-time +)
+
+;;; Early version of 'logical is built-in
+(define logical:logand logand)
+(define logical:logior logior)
+;;(define logical:logxor logxor)
+;;(define logical:lognot lognot)
+;;(define logical:logtest logtest)
+;;(define logical:logbit? logbit?)
+(define (copy-bit index to bool)
+ (if bool
+ (logical:logior to (logical:ash 1 index))
+ (logical:logand to (logical:lognot (logical:ash 1 index)))))
+;;(define copy-bit logical:copy-bit)
+;;(define logical:ash ash)
+;;(define logical:logcount logcount)
+;;(define logical:integer-length integer-length)
+(define (logical:bit-field n start end)
+ (logical:logand (- (logical:integer-expt 2 (- end start)) 1)
+ (logical:ash n (- start))))
+;;(define bit-field logical:bit-field)
+(define (bitwise-if mask n0 n1)
+ (logical:logior (logical:logand mask n0)
+ (logical:logand (logical:lognot mask) n1)))
+(define logical:bitwise-if bitwise-if)
+;;(define logical:bit-extract bit-extract)
+(define (copy-bit-field to start end from)
+ (logical:bitwise-if
+ (logical:ash (- (logical:integer-expt 2 (- end start)) 1) start)
+ (logical:ash from start)
+ to))
+;;(define copy-bit-field logical:copy-bit-field)
+(define logical:integer-expt integer-expt)
+;;(define logical:ipow-by-squaring ipow-by-squaring)
+
+;;guile> (expt 2 -1)
+;;ERROR: In procedure integer-expt:
+;;ERROR: Argument out of range: -1
+;;ABORT: (out-of-range)
+(define expt
+ (let ((integer-expt integer-expt))
+ (lambda (z1 z2)
+ (cond ((zero? z1) (if (zero? z2) 1 0))
+ ((and (exact? z2) (not (negative? z2)))
+ (integer-expt z1 z2))
+ ((and (real? z2) (real? z1) (>= z1 0))
+ ($expt z1 z2))
+ (else
+ (exp (* z2 (log z1))))))))
+
+;;; array-for-each
+(define (array-indexes ra)
+ (let ((ra0 (apply create-array '#() (array-shape ra))))
+ (array-index-map! ra0 list)
+ ra0))
+(define (array-copy! source dest)
+ (array-map! dest identity source))
+(define (array-null? array)
+ (zero? (apply * (map (lambda (bnd) (- 1 (apply - bnd)))
+ (array-shape array)))))
+(define (create-array prot . args)
+ (if (array-null? prot)
+ (dimensions->uniform-array args (array-prototype prot))
+ (dimensions->uniform-array args (array-prototype prot)
+ (apply array-ref prot
+ (map car (array-shape prot))))))
+(define (make-uniform-wrapper prot)
+ (if (string? prot) (set! prot (string->number prot)))
+ (if prot
+ (lambda opt (if (null? opt)
+ (list->uniform-array 1 prot '())
+ (list->uniform-array 1 prot opt)))
+ vector))
+(define ac64 (make-uniform-wrapper "+i"))
+(define ac32 ac64)
+(define ar64 (make-uniform-wrapper "1/3"))
+(define ar32 (make-uniform-wrapper "1."))
+(define as64 vector)
+(define as32 (make-uniform-wrapper -32))
+(define as16 as32)
+(define as8 as32)
+(define au64 vector)
+(define au32 (make-uniform-wrapper 32))
+(define au16 au32)
+(define au8 au32)
+(define at1 (make-uniform-wrapper #t))
+
+;;; {Random numbers}
+(define (make-random-state . args)
+ (let ((seed (if (null? args) *random-state* (car args))))
+ (cond ((string? seed))
+ ((number? seed) (set! seed (number->string seed)))
+ (else (let ()
+ (require 'object->string)
+ (set! seed (object->limited-string seed 50)))))
+ (seed->random-state seed)))
+
+;;; Support for older versions of Scheme. Not enough code for its own file.
+;;(define (last-pair l) (if (pair? (cdr l)) (last-pair (cdr l)) l))
+
+;;; Guile has nil and t as self-sets
+;;(define t #t)
+;;(define nil #f)
+
+;;; Define these if your implementation's syntax can support it and if
+;;; they are not already defined.
+
+;;(define (1+ n) (+ n 1))
+;;(define (-1+ n) (+ n -1))
+;;(define 1- -1+)
+
+(slib:load (in-vicinity (library-vicinity) "require"))
diff --git a/http-cgi.scm b/http-cgi.scm
index 517e312..097da06 100644
--- a/http-cgi.scm
+++ b/http-cgi.scm
@@ -47,7 +47,7 @@
(set! http:crlf (string (string-ref line 0) #\newline)))
(if (eof-object? line) line alist))
(let ((len (string-length line))
- (idx (string-index line #\:)))
+ (idx (strsrch:string-index line #\:)))
(if (char-whitespace? (string-ref line (+ -1 len)))
(set! len (+ -1 len)))
(and idx (do ((idx2 (+ idx 1) (+ idx2 1)))
@@ -68,9 +68,9 @@
(let* ((request-uri (cadr request-line))
(len (string-length request-uri)))
(and (> len 3)
- (string-index request-uri #\?)
+ (strsrch:string-index request-uri #\?)
(substring request-uri
- (+ 1 (string-index request-uri #\?))
+ (+ 1 (strsrch:string-index request-uri #\?))
(if (eqv? #\/ (string-ref request-uri (+ -1 len)))
(+ -1 len)
len)))))
diff --git a/mklibcat.scm b/mklibcat.scm
index e6a0321..d41e2e6 100644
--- a/mklibcat.scm
+++ b/mklibcat.scm
@@ -87,7 +87,7 @@
(common-list-functions "comlist")
(tree "tree")
(coerce "coerce")
- ;;(format "format")
+ (format "format")
(generic-write "genwrite")
(pretty-print "pp")
(pprint-file "ppfile")
diff --git a/schmooz.scm b/schmooz.scm
index f50a397..7bcab97 100644
--- a/schmooz.scm
+++ b/schmooz.scm
@@ -358,6 +358,39 @@
((not (and (char? chr) (not (char-whitespace? chr)))) str)
(read-char port)))
+;;; Output files would be schmoozed
+(define schmooz-which-files
+ (let* ((scheme-file? (filename:match-ci?? "*??scm"))
+ (txi-file? (filename:match-ci?? "*??txi"))
+ (texi-file? (let ((tex? (filename:match-ci?? "*??tex"))
+ (texi? (filename:match-ci?? "*??texi")))
+ (lambda (filename) (or (txi-file? filename)
+ (tex? filename)
+ (texi? filename)))))
+ (txi->scm (filename:substitute?? "*txi" "*scm"))
+ (scm->txi (filename:substitute?? "*scm" "*txi")))
+ (define (schmooz-texi-file file)
+ (call-with-input-file file
+ (lambda (port)
+ (do ((pos (find-string-from-port? "@include" port)
+ (find-string-from-port? "@include" port)))
+ ((not pos))
+ (let ((fname #f))
+ (cond ((not (eqv? 1 (fscanf port " %s" fname))))
+ ((not (txi-file? fname)))
+ ((not (file-exists? (txi->scm fname))))
+ (else (display (txi->scm fname)) (display " "))))))))
+ (lambda files
+ (for-each (lambda (file)
+ (define sl (string-length file))
+ (cond ((texi-file? file) (schmooz-texi-file file))
+ ((scheme-file? file)
+ (schmooz-scm-file file (scm->txi file)))
+ (else (schmooz-scm-file
+ file (string-append file ".txi")))))
+ files))))
+
+
;;;@ SCHMOOZ files.
(define schmooz
(let* ((scheme-file? (filename:match-ci?? "*??scm"))
diff --git a/slib.html b/slib.html
new file mode 100644
index 0000000..b580540
--- /dev/null
+++ b/slib.html
@@ -0,0 +1,76 @@
+<!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: SLIB</TITLE>
+
+<META NAME="description" CONTENT="SLIB: SLIB">
+<META NAME="keywords" CONTENT="SLIB: SLIB">
+<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="SEC_Top"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><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>SLIB</H1>
+
+<P>
+
+<BLOCKQUOTE>
+</BLOCKQUOTE>
+<P>
+</P>
+<P>
+
+<EM>SLIB</EM> is a portable library for the programming language
+<EM>Scheme</EM>. It provides a platform independent framework for using
+<EM>packages</EM> of Scheme procedures and syntax. As distributed, SLIB
+contains useful packages for all Scheme implementations. Its catalog
+can be transparently extended to accomodate packages specific to a site,
+implementation, user, or directory.
+</P>
+<P>
+
+</P>
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC1">1. The Library System</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to use and customize.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC13">2. Universal SLIB Procedures</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Provided for all implementations.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC21">3. Scheme Syntax Extension Packages</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC45">4. Textual Conversion Packages</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC88">5. Mathematical Packages</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC140">6. Database Packages</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC183">7. Other Packages</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC277">8. About SLIB</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Install, etc.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_9.html#SEC292">Procedure and Macro Index</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<HR SIZE=1>
+<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>
diff --git a/slib_1.html b/slib_1.html
new file mode 100644
index 0000000..452374a
--- /dev/null
+++ b/slib_1.html
@@ -0,0 +1,1172 @@
+<!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: The Library System</TITLE>
+
+<META NAME="description" CONTENT="SLIB: The Library System">
+<META NAME="keywords" CONTENT="SLIB: The Library System">
+<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="SEC1"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC2"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> &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_2.html#SEC13"> &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>
+<A NAME="The Library System"></A>
+<H1> 1. The Library System </H1>
+<!--docid::SEC1::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">SLIB names.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC3">1.2 Require</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC7">1.6 Compiling Scheme</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Feature"></A>
+<HR SIZE="6">
+<A NAME="SEC2"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC3"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.1 Feature </H2>
+<!--docid::SEC2::-->
+<P>
+
+<A NAME="IDX1"></A>
+SLIB denotes <EM>features</EM> by symbols. SLIB maintains a list of
+features supported by a Scheme <EM>session</EM>. The set of features
+<A NAME="IDX2"></A>
+provided by a session may change during that session. Some features
+are properties of the Scheme implementation being used. The following
+<A NAME="IDX3"></A>
+<EM>intrinsic feature</EM>s detail what sort of numbers are available
+from an implementation:
+</P>
+<P>
+
+<UL>
+<LI>
+'inexact
+<LI>
+'rational
+<LI>
+'real
+<LI>
+'complex
+<LI>
+'bignum
+</UL>
+<P>
+
+SLIB initialization (in `<TT>require.scm</TT>') tests and <EM>provide</EM>s
+any of these numeric features which are appropriate.
+</P>
+<P>
+
+Other features correspond to the presence of packages of Scheme
+procedures or syntax (macros).
+</P>
+<P>
+
+<A NAME="IDX4"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>provided?</B> <I>feature</I>
+<DD>Returns <CODE>#t</CODE> if <VAR>feature</VAR> is present in the current Scheme
+session; otherwise <CODE>#f</CODE>. More specifically, <CODE>provided?</CODE>
+returns <CODE>#t</CODE> if the symbol <VAR>feature</VAR> is the
+<CODE>software-type</CODE> or if <VAR>feature</VAR> has been provided by a module
+already loaded; and <CODE>#f</CODE> otherwise.
+<P>
+
+In some implementations <CODE>provided?</CODE> tests whether a module has
+been <CODE>require</CODE>d by any module or in any thread; other
+implementations will have <CODE>provided?</CODE> reflect only the modules
+<CODE>require</CODE>d by that particular session or thread.
+</P>
+<P>
+
+To work portably in both scenarios, use <CODE>provided?</CODE> only to test
+whether intrinsic properties (like those above) are present.
+</P>
+<P>
+
+The <VAR>feature</VAR> argument can also be an expression calling
+<CODE>and</CODE>, <CODE>or</CODE>, and <CODE>not</CODE> of features. The boolean result
+of the logical question asked by <VAR>feature</VAR> is returned.
+</P>
+</DL>
+<P>
+
+The generalization of <CODE>provided?</CODE> for arbitrary features and catalog
+is <CODE>feature-eval</CODE>:
+</P>
+<P>
+
+<A NAME="IDX5"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>feature-eval</B> <I>expression provided?</I>
+<DD>Evaluates <CODE>and</CODE>, <CODE>or</CODE>, and <CODE>not</CODE> forms in
+<VAR>expression</VAR>, using the values returned by calling <VAR>provided?</VAR>
+on the leaf symbols. <CODE>feature-eval</CODE> returns the boolean result
+of the logical combinations.
+</DL>
+<P>
+
+<A NAME="IDX6"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>provide</B> <I>feature</I>
+<DD>Informs SLIB that <VAR>feature</VAR> is supported in this session.
+</DL>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(provided? 'foo) => #f
+(provide 'foo)
+(provided? 'foo) => #t
+</pre></td></tr></table><P>
+
+<A NAME="Require"></A>
+<HR SIZE="6">
+<A NAME="SEC3"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC2"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC4"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.2 Require </H2>
+<!--docid::SEC3::-->
+<P>
+
+<A NAME="IDX7"></A>
+SLIB creates and maintains a <EM>catalog</EM> mapping features to locations
+of files introducing procedures and syntax denoted by those features.
+</P>
+<P>
+
+<A NAME="IDX8"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*catalog*</B>
+<DD>Is an association list of features (symbols) and pathnames which will
+supply those features. The pathname can be either a string or a pair.
+If pathname is a pair then the first element should be a macro feature
+symbol, <CODE>source</CODE>, <CODE>compiled</CODE>, or one of the other cases
+described in <A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A>. The cdr of the pathname should
+be either a string or a list.
+</DL>
+<P>
+
+At the beginning of each section of this manual, there is a line like
+<CODE>(require '<VAR>feature</VAR>)</CODE>.
+<A NAME="IDX9"></A>
+The Scheme files comprising SLIB are cataloged so that these feature
+names map to the corresponding files.
+</P>
+<P>
+
+SLIB provides a form, <CODE>require</CODE>, which loads the files providing
+the requested feature.
+</P>
+<P>
+
+<A NAME="IDX10"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>require</B> <I>feature</I>
+<DD><UL>
+<LI>
+If <CODE>(provided? <VAR>feature</VAR>)</CODE> is true,
+then <CODE>require</CODE> just returns.
+<LI>
+Otherwise, if <VAR>feature</VAR> is found in the catalog, then the
+corresponding files will be loaded and <CODE>(provided?
+<VAR>feature</VAR>)</CODE> will henceforth return <CODE>#t</CODE>. That <VAR>feature</VAR>
+is thereafter <CODE>provided</CODE>.
+<LI>
+Otherwise (<VAR>feature</VAR> not found in the catalog), an error is
+signaled.
+</UL>
+</DL>
+<P>
+
+There is a related form <CODE>require-if</CODE>, used primarily for enabling
+compilers to statically include modules which would be dynamically
+loaded by interpreters.
+</P>
+<P>
+
+<A NAME="IDX11"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>require-if</B> <I>condition feature</I>
+<DD><P>
+
+Requires <VAR>feature</VAR> if <VAR>condition</VAR> is true.
+</P>
+</DL>
+<P>
+
+The <CODE>random</CODE> module uses <CODE>require-if</CODE> to flag
+<CODE>object-&gt;string</CODE> as a (dynamic) required module.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'byte)
+(require 'logical)
+(require-if 'compiling 'object-&gt;string)
+</pre></td></tr></table><P>
+
+The <CODE>batch</CODE> module uses <CODE>require-if</CODE> to flag
+<CODE>posix-time</CODE> as a module to load if the implementation supports
+large precision exact integers.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require-if '(and bignum compiling) 'posix-time)
+</pre></td></tr></table><P>
+
+The <CODE>commutative-ring</CODE> module uses <CODE>require-if</CODE> to ensure
+that it has an exponentiation routine, regardless of whether the
+implementation supports inexact numbers:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require-if '(not inexact) 'logical) ;for integer-expt
+(define number^ (if (provided? 'inexact) expt integer-expt))
+</pre></td></tr></table><P>
+
+The catalog can also be queried using <CODE>slib:in-catalog?</CODE>.
+</P>
+<P>
+
+<A NAME="IDX12"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>slib:in-catalog?</B> <I>feature</I>
+<DD>Returns a <CODE>CDR</CODE> of the catalog entry if one was found for the
+symbol <VAR>feature</VAR> in the alist <CODE>*catalog*</CODE> (and transitively
+through any symbol aliases encountered). Otherwise, returns
+<CODE>#f</CODE>. The format of catalog entries is explained in <A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A>.
+</DL>
+<P>
+
+<A NAME="Library Catalogs"></A>
+<HR SIZE="6">
+<A NAME="SEC4"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC3"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC5"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.3 Library Catalogs </H2>
+<!--docid::SEC4::-->
+<P>
+
+Catalog files consist of one or more <EM>association list</EM>s.
+<A NAME="IDX13"></A>
+In the circumstance where a feature symbol appears in more than one
+list, the latter list's association is retrieved. Here are the
+supported formats for elements of catalog lists:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>(<VAR>feature</VAR> . <I>&lt;symbol&gt;</I>)</CODE>
+<DD>Redirects to the feature named <I>&lt;symbol&gt;</I>.
+<DT><CODE>(<VAR>feature</VAR> . &quot;<I>&lt;path&gt;</I>&quot;)</CODE>
+<DD>Loads file <I>&lt;path&gt;</I>.
+<DT><CODE>(<VAR>feature</VAR> source &quot;<I>&lt;path&gt;&quot;</I>)</CODE>
+<DD><A NAME="IDX14"></A>
+<CODE>slib:load</CODE>s the Scheme source file <I>&lt;path&gt;</I>.
+<DT><CODE>(<VAR>feature</VAR> compiled &quot;<I>&lt;path&gt;&quot;</I> <small>...</small>)</CODE>
+<DD><A NAME="IDX15"></A>
+<CODE>slib:load-compiled</CODE>s the files <I>&lt;path&gt;</I> <small>...</small>.
+<DT><CODE>(<VAR>feature</VAR> aggregate <I>&lt;symbol&gt;</I> <small>...</small>)</CODE>
+<DD><A NAME="IDX16"></A>
+<CODE>slib:require</CODE>s the features <I>&lt;symbol&gt;</I> <small>...</small>.
+</DL>
+<P>
+
+The various macro styles first <CODE>require</CODE> the named macro package,
+then just load <I>&lt;path&gt;</I> or load-and-macro-expand <I>&lt;path&gt;</I> as
+appropriate for the implementation.
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>(<VAR>feature</VAR> defmacro &quot;<I>&lt;path&gt;&quot;</I>)</CODE>
+<DD><A NAME="IDX17"></A>
+<CODE>defmacro:load</CODE>s the Scheme source file <I>&lt;path&gt;</I>.
+<DT><CODE>(<VAR>feature</VAR> macro-by-example &quot;<I>&lt;path&gt;&quot;</I>)</CODE>
+<DD><A NAME="IDX18"></A>
+<CODE>defmacro:load</CODE>s the Scheme source file <I>&lt;path&gt;</I>.
+</DL>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>(<VAR>feature</VAR> macro &quot;<I>&lt;path&gt;&quot;</I>)</CODE>
+<DD><A NAME="IDX19"></A>
+<CODE>macro:load</CODE>s the Scheme source file <I>&lt;path&gt;</I>.
+<DT><CODE>(<VAR>feature</VAR> macros-that-work &quot;<I>&lt;path&gt;&quot;</I>)</CODE>
+<DD><A NAME="IDX20"></A>
+<CODE>macro:load</CODE>s the Scheme source file <I>&lt;path&gt;</I>.
+<DT><CODE>(<VAR>feature</VAR> syntax-case &quot;<I>&lt;path&gt;&quot;</I>)</CODE>
+<DD><A NAME="IDX21"></A>
+<CODE>macro:load</CODE>s the Scheme source file <I>&lt;path&gt;</I>.
+<DT><CODE>(<VAR>feature</VAR> syntactic-closures &quot;<I>&lt;path&gt;&quot;</I>)</CODE>
+<DD><A NAME="IDX22"></A>
+<CODE>macro:load</CODE>s the Scheme source file <I>&lt;path&gt;</I>.
+</DL>
+<P>
+
+<A NAME="Catalog Creation"></A>
+<HR SIZE="6">
+<A NAME="SEC5"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC4"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC6"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.4 Catalog Creation </H2>
+<!--docid::SEC5::-->
+<P>
+
+At the start of an interactive session no catalog is present, but is
+created with the first catalog inquiry (such as <CODE>(require
+'random)</CODE>). Several sources of catalog information are combined to
+produce the catalog:
+</P>
+<P>
+
+<UL>
+<LI>
+standard SLIB packages.
+<LI>
+additional packages of interest to this site.
+<LI>
+packages specifically for the variety of Scheme which this
+session is running.
+<LI>
+packages this user wants to always have available. This catalog is the
+file `<TT>homecat</TT>' in the user's <EM>HOME</EM> directory.
+<A NAME="IDX23"></A>
+<LI>
+packages germane to working in this (current working) directory. This
+catalog is the file `<TT>usercat</TT>' in the directory to which it applies.
+One would typically <CODE>cd</CODE> to this directory before starting the
+Scheme session.
+<LI>
+packages which are part of an application program.
+</UL>
+<P>
+
+SLIB combines the catalog information which doesn't vary per user into
+the file `<TT>slibcat</TT>' in the implementation-vicinity. Therefore
+`<TT>slibcat</TT>' needs change only when new software is installed or
+compiled. Because the actual pathnames of files can differ from
+installation to installation, SLIB builds a separate catalog for each
+implementation it is used with.
+</P>
+<P>
+
+The definition of <CODE>*SLIB-VERSION*</CODE> in SLIB file
+`<TT>require.scm</TT>' is checked against the catalog association of
+<CODE>*SLIB-VERSION*</CODE> to ascertain when versions have changed. It is
+a reasonable practice to change the definition of
+<CODE>*SLIB-VERSION*</CODE> whenever the library is changed. If multiple
+implementations of Scheme use SLIB, remember that recompiling one
+`<TT>slibcat</TT>' will update only that implementation's catalog.
+</P>
+<P>
+
+The compilation scripts of Scheme implementations which work with SLIB
+can automatically trigger catalog compilation by deleting
+`<TT>slibcat</TT>' or by invoking <CODE>require</CODE> of a special feature:
+</P>
+<P>
+
+<A NAME="IDX24"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>require</B> <I>'new-catalog</I>
+<DD><A NAME="IDX25"></A>
+This will load `<TT>mklibcat</TT>', which compiles and writes a new
+`<TT>slibcat</TT>'.
+</DL>
+<P>
+
+Another special feature of <CODE>require</CODE> erases SLIB's catalog,
+forcing it to be reloaded the next time the catalog is queried.
+</P>
+<P>
+
+<A NAME="IDX26"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>require</B> <I>#f</I>
+<DD>Removes SLIB's catalog information. This should be done before saving
+an executable image so that, when restored, its catalog will be loaded
+afresh.
+</DL>
+<P>
+
+<A NAME="Catalog Vicinities"></A>
+<HR SIZE="6">
+<A NAME="SEC6"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC5"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.5 Catalog Vicinities </H2>
+<!--docid::SEC6::-->
+<P>
+
+Each file in the table below is descibed in terms of its
+file-system independent <EM>vicinity</EM> (see section <A HREF="slib_2.html#SEC14">2.1 Vicinity</A>). The entries
+of a catalog in the table override those of catalogs above it in the
+table.
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+
+<DT><CODE>implementation-vicinity</CODE> `<TT>slibcat</TT>'
+<DD><A NAME="IDX27"></A>
+This file contains the associations for the packages comprising SLIB,
+the `<TT>implcat</TT>' and the `<TT>sitecat</TT>'s. The associations in the
+other catalogs override those of the standard catalog.
+<P>
+
+</P>
+<DT><CODE>library-vicinity</CODE> `<TT>mklibcat.scm</TT>'
+<DD><A NAME="IDX28"></A>
+creates `<TT>slibcat</TT>'.
+<P>
+
+</P>
+<DT><CODE>library-vicinity</CODE> `<TT>sitecat</TT>'
+<DD><A NAME="IDX29"></A>
+This file contains the associations specific to an SLIB installation.
+<P>
+
+</P>
+<DT><CODE>implementation-vicinity</CODE> `<TT>implcat</TT>'
+<DD><A NAME="IDX30"></A>
+This file contains the associations specific to an implementation of
+Scheme. Different implementations of Scheme should have different
+<CODE>implementation-vicinity</CODE>.
+<P>
+
+</P>
+<DT><CODE>implementation-vicinity</CODE> `<TT>mkimpcat.scm</TT>'
+<DD><A NAME="IDX31"></A>
+if present, creates `<TT>implcat</TT>'.
+<P>
+
+</P>
+<DT><CODE>implementation-vicinity</CODE> `<TT>sitecat</TT>'
+<DD><A NAME="IDX32"></A>
+This file contains the associations specific to a Scheme implementation
+installation.
+<P>
+
+</P>
+<DT><CODE>home-vicinity</CODE> `<TT>homecat</TT>'
+<DD><A NAME="IDX33"></A>
+This file contains the associations specific to an SLIB user.
+<P>
+
+</P>
+<DT><CODE>user-vicinity</CODE> `<TT>usercat</TT>'
+<DD><A NAME="IDX34"></A>
+This file contains associations affecting only those sessions whose
+<EM>working directory</EM> is <CODE>user-vicinity</CODE>.
+<P>
+
+</DL>
+<P>
+
+Here is an example of a `<TT>usercat</TT>' catalog. A program in this
+directory can invoke the `<SAMP>run</SAMP>' feature with <CODE>(require 'run)</CODE>.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>;;; &quot;usercat&quot;: SLIB catalog additions for SIMSYNCH. -*-scheme-*-
+(
+ (simsynch . &quot;../synch/simsynch.scm&quot;)
+ (run . &quot;../synch/run.scm&quot;)
+ (schlep . &quot;schlep.scm&quot;)
+)
+</pre></td></tr></table><P>
+
+Copying `<TT>usercat</TT>' to many directories is inconvenient.
+Application programs which aren't always run in specially prepared
+directories can nonetheless register their features during
+initialization.
+</P>
+<P>
+
+<A NAME="IDX35"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>catalog:read</B> <I>vicinity catalog</I>
+<DD>Reads file named by string <VAR>catalog</VAR> in <VAR>vicinity</VAR>, resolving
+all paths relative to <VAR>vicinity</VAR>, and adds those feature
+associations to <VAR>*catalog*</VAR>.
+<P>
+
+<CODE>catalog:read</CODE> would typically be used by an application program
+having dynamically loadable modules. For instance, to register
+factoring and other modules in <VAR>*catalog*</VAR>, JACAL does:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(catalog:read (program-vicinity) &quot;jacalcat&quot;)
+</pre></td></tr></table><P>
+
+</P>
+</DL>
+<P>
+
+For an application program there are three appropriate venues for
+registering its catalog associations:
+</P>
+<P>
+
+<UL>
+<LI>
+in a `<TT>usercat</TT>' file in the directory where the program runs; or
+<LI>
+in an `<TT>implcat</TT>' file in the <CODE>implementation-vicinity</CODE>; or
+<LI>
+in an application program directory; loaded by calling
+<CODE>catalog:read</CODE>.
+</UL>
+<P>
+
+<A NAME="Compiling Scheme"></A>
+<HR SIZE="6">
+<A NAME="SEC7"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC6"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC8"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.6 Compiling Scheme </H2>
+<!--docid::SEC7::-->
+<P>
+
+To use Scheme compilers effectively with SLIB the compiler needs to
+know which SLIB modules are to be compiled and which symbols are
+exported from those modules.
+</P>
+<P>
+
+The procedures in this section automate the extraction of this
+information from SLIB modules. They are guaranteed to work on SLIB
+modules; to use them on other sources, those sources should follow
+SLIB conventions.
+</P>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC8">1.6.1 Module Conventions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC10">1.6.3 Module Semantics</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC12">1.6.5 Module Analysis</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Module Conventions"></A>
+<HR SIZE="6">
+<A NAME="SEC8"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC9"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.6.1 Module Conventions </H3>
+<!--docid::SEC8::-->
+<P>
+
+<UL>
+<LI>
+All the top-level <CODE>require</CODE> commands have one quoted argument and
+are positioned before other Scheme definitions and expressions in the
+file.
+<LI>
+Any conditionally <CODE>require</CODE>d SLIB modules
+<A NAME="DOCF1" HREF="slib_fot.html#FOOT1">(1)</A>
+also appear at the beginning of their files conditioned on the feature
+<A NAME="IDX36"></A>
+<CODE>compiling</CODE> using <CODE>require-if</CODE>
+(see section <A HREF="slib_1.html#SEC3">require-if</A>).
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'logical)
+(require 'multiarg/and-)
+(require-if 'compiling 'sort)
+(require-if 'compiling 'ciexyz)
+</pre></td></tr></table><P>
+
+</P>
+<LI>
+Schmooz-style comments preceding a definition, identify that
+definition as an exported identifier (see section <A HREF="slib_4.html#SEC87">4.14 Schmooz</A>). For
+non-schmooz files, putting `<SAMP>;@</SAMP>' at the beginning of the line
+immediately preceding the definition (<CODE>define</CODE>,
+<CODE>define-syntax</CODE>, or <CODE>defmacro</CODE>) suffices.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>;@
+(define (make-vicinity &lt;pathname&gt;) &lt;pathname&gt;)
+</pre></td></tr></table><P>
+
+</P>
+<LI>
+Syntax (macro) definitions are grouped at the end of a module file.
+<P>
+
+</P>
+<LI>
+Modules defining macros do not invoke those macros. SLIB macro
+implementations are exempt from this rule.
+<P>
+
+An example of how to expand macro invocations is:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'macros-that-work)
+(require 'yasos)
+(require 'pprint-file)
+(pprint-filter-file &quot;collect.scm&quot; macwork:expand)
+</pre></td></tr></table><P>
+
+</UL>
+<P>
+
+<A NAME="Module Manifests"></A>
+<HR SIZE="6">
+<A NAME="SEC9"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC8"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC10"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.6.2 Module Manifests </H3>
+<!--docid::SEC9::-->
+<P>
+
+<CODE>(require 'manifest)</CODE>
+<A NAME="IDX37"></A>
+</P>
+<P>
+
+In some of these examples, <VAR>slib:catalog</VAR> is the SLIB part of
+the catalog; it is free of compiled and implementation-specific
+entries. It would be defined by:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define slib:catalog (cdr (member (assq 'null *catalog*) *catalog*)))
+</pre></td></tr></table><P>
+
+<A NAME="IDX38"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>file-&gt;requires</B> <I>file provided? catalog</I>
+<DD><P>
+
+Returns a list of the features <CODE>require</CODE>d by <VAR>file</VAR> assuming the
+predicate <VAR>provided?</VAR> and association-list <VAR>catalog</VAR>.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (provided+? . features)
+ (lambda (feature)
+ (or (memq feature features) (provided? feature))))
+
+(file-&gt;requires &quot;obj2str.scm&quot; (provided+? 'compiling) '())
+ => (string-port generic-write)
+
+(file-&gt;requires &quot;obj2str.scm&quot; provided? '())
+ => (string-port)
+</pre></td></tr></table><P>
+
+<A NAME="IDX39"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>feature-&gt;requires</B> <I>feature provided? catalog</I>
+<DD><P>
+
+Returns a list of the features <CODE>require</CODE>d by <VAR>feature</VAR> assuming the
+predicate <VAR>provided?</VAR> and association-list <VAR>catalog</VAR>.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(feature-&gt;requires 'batch (provided+? 'compiling) *catalog*)
+ => (tree line-i/o databases parameters string-port
+ pretty-print common-list-functions posix-time)
+
+(feature-&gt;requires 'batch provided? *catalog*)
+ => (tree line-i/o databases parameters string-port
+ pretty-print common-list-functions)
+
+(feature-&gt;requires 'batch provided? '((batch . &quot;batch&quot;)))
+ => (tree line-i/o databases parameters string-port
+ pretty-print common-list-functions)
+</pre></td></tr></table><P>
+
+<A NAME="IDX40"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>file-&gt;loads</B> <I>file</I>
+<DD><P>
+
+Returns a list of strings naming existing files loaded (load
+slib:load slib:load-source macro:load defmacro:load syncase:load
+synclo:load macwork:load) by <VAR>file</VAR> or any of the files it loads.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(file-&gt;loads (in-vicinity (library-vicinity) &quot;scainit.scm&quot;))
+ => (&quot;/usr/local/lib/slib/scaexpp.scm&quot;
+ &quot;/usr/local/lib/slib/scaglob.scm&quot;
+ &quot;/usr/local/lib/slib/scaoutp.scm&quot;)
+</pre></td></tr></table><P>
+
+<A NAME="IDX41"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>load-&gt;path</B> <I>exp</I>
+<DD><P>
+
+Given a <CODE>(load '&lt;expr&gt;)</CODE>, where &lt;expr&gt; is a string or vicinity
+stuff), <CODE>(load-&gt;path &lt;expr&gt;)</CODE> figures a path to the file.
+<CODE>load-&gt;path</CODE> returns that path if it names an existing file; otherwise #f.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(load-&gt;path '(in-vicinity (library-vicinity) &quot;mklibcat&quot;))
+ => &quot;/usr/local/lib/slib/mklibcat.scm&quot;
+</pre></td></tr></table><P>
+
+<A NAME="IDX42"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>file-&gt;definitions</B> <I>file</I>
+<DD><P>
+
+Returns a list of the identifier symbols defined by SLIB (or
+SLIB-style) file <VAR>file</VAR>.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(file-&gt;definitions &quot;random.scm&quot;)
+ => (*random-state* make-random-state
+ seed-&gt;random-state copy-random-state random
+ random:chunk)
+</pre></td></tr></table><P>
+
+<A NAME="IDX43"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>file-&gt;exports</B> <I>file</I>
+<DD><P>
+
+Returns a list of the identifier symbols exported (advertised) by
+SLIB (or SLIB-style) file <VAR>file</VAR>.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(file-&gt;exports &quot;random.scm&quot;)
+ => (make-random-state seed-&gt;random-state
+ copy-random-state random)
+
+(file-&gt;exports &quot;randinex.scm&quot;)
+ => (random:solid-sphere! random:hollow-sphere!
+ random:normal-vector! random:normal
+ random:exp random:uniform)
+</pre></td></tr></table><P>
+
+<A NAME="IDX44"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>feature-&gt;export-alist</B> <I>feature catalog</I>
+<DD><P>
+
+Returns a list of lists; each sublist holding the name of the file
+implementing <VAR>feature</VAR>, and the identifier symbols exported (advertised) by
+SLIB (or SLIB-style) feature <VAR>feature</VAR>, in <VAR>catalog</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX45"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>feature-&gt;exports</B> <I>feature catalog</I>
+<DD><P>
+
+Returns a list of all exports of <VAR>feature</VAR>.
+</P>
+</DL>
+In the case of <CODE>aggregate</CODE> features, more than one file may
+have export lists to report:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(feature-&gt;export-alist 'r5rs slib:catalog))
+ => ((&quot;/usr/local/lib/slib/values.scm&quot;
+ call-with-values values)
+ (&quot;/usr/local/lib/slib/mbe.scm&quot;
+ define-syntax macro:expand
+ macro:load macro:eval)
+ (&quot;/usr/local/lib/slib/eval.scm&quot;
+ eval scheme-report-environment
+ null-environment interaction-environment))
+
+(feature-&gt;export-alist 'stdio *catalog*)
+ => ((&quot;/usr/local/lib/slib/scanf.scm&quot;
+ fscanf sscanf scanf scanf-read-list)
+ (&quot;/usr/local/lib/slib/printf.scm&quot;
+ sprintf printf fprintf)
+ (&quot;/usr/local/lib/slib/stdio.scm&quot;
+ stderr stdout stdin))
+
+(feature-&gt;exports 'stdio slib:catalog)
+ => (fscanf sscanf scanf scanf-read-list
+ sprintf printf fprintf stderr stdout stdin)
+</pre></td></tr></table><P>
+
+<A NAME="Module Semantics"></A>
+<HR SIZE="6">
+<A NAME="SEC10"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC9"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC11"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.6.3 Module Semantics </H3>
+<!--docid::SEC10::-->
+<P>
+
+For the purpose of compiling Scheme code, each top-level
+<CODE>require</CODE> makes the identifiers exported by its feature's module
+<CODE>defined</CODE> (or defmacroed or defined-syntaxed) within the file
+(being compiled) headed with those requires.
+</P>
+<P>
+
+Top-level occurrences of <CODE>require-if</CODE> make defined the exports
+from the module named by the second argument <EM>if</EM> the
+<VAR>feature-expression</VAR> first argument is true in the target
+environment. The target feature <CODE>compiling</CODE> should be provided
+during this phase of compilation.
+</P>
+<P>
+
+Non-top-level SLIB occurences of <CODE>require</CODE> and <CODE>require-if</CODE>
+of quoted features can be ignored by compilers. The SLIB modules will
+all have top-level constructs for those features.
+</P>
+<P>
+
+<A NAME="IDX46"></A>
+Note that aggregate catalog entries import more than one module.
+Implementations of <CODE>require</CODE> may or may <EM>not</EM> be transitive;
+code which uses module exports without requiring the providing module
+is in error.
+</P>
+<P>
+
+In the SLIB modules <CODE>modular</CODE>, <CODE>batch</CODE>, <CODE>hash</CODE>,
+<CODE>common-lisp-time</CODE>, <CODE>commutative-ring</CODE>, <CODE>charplot</CODE>,
+<CODE>logical</CODE>, <CODE>common-list-functions</CODE>, <CODE>coerce</CODE> and
+<CODE>break</CODE> there is code conditional on features being
+<CODE>provided?</CODE>. Most are testing for the presence of features which
+are intrinsic to implementations (inexacts, bignums, ...).
+</P>
+<P>
+
+In all cases these <CODE>provided?</CODE> tests can be evaluated at
+compile-time using <CODE>feature-eval</CODE>
+(see section <A HREF="slib_1.html#SEC2">feature-eval</A>). The simplest way to compile these
+constructs may be to treat <CODE>provided?</CODE> as a macro.
+</P>
+<P>
+
+<A NAME="Top-level Variable References"></A>
+<HR SIZE="6">
+<A NAME="SEC11"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC10"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC12"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.6.4 Top-level Variable References </H3>
+<!--docid::SEC11::-->
+<P>
+
+<CODE>(require 'top-refs)</CODE>
+<A NAME="IDX47"></A>
+<A NAME="IDX48"></A>
+<A NAME="IDX49"></A>
+</P>
+<P>
+
+These procedures complement those in <A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A> by
+finding the top-level variable references in Scheme source code.
+They work by traversing expressions and definitions, keeping track
+of bindings encountered. It is certainly possible to foil these
+functions, but they return useful information about SLIB source
+code.
+</P>
+<P>
+
+<A NAME="IDX50"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>top-refs</B> <I>obj</I>
+<DD><P>
+
+Returns a list of the top-level variables referenced by the Scheme
+expression <VAR>obj</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX51"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>top-refs&lt;-file</B> <I>filename</I>
+<DD><P>
+
+<VAR>filename</VAR> should be a string naming an existing file containing Scheme
+source code. <CODE>top-refs&lt;-file</CODE> returns a list of the top-level variable references
+made by expressions in the file named by <VAR>filename</VAR>.
+</P>
+<P>
+
+Code in modules which <VAR>filename</VAR> <CODE>require</CODE>s is not traversed. Code in
+files loaded from top-level <EM>is</EM> traversed if the expression
+argument to <CODE>load</CODE>, <CODE>slib:load</CODE>, <CODE>slib:load-source</CODE>,
+<CODE>macro:load</CODE>, <CODE>defmacro:load</CODE>, <CODE>synclo:load</CODE>,
+<CODE>syncase:load</CODE>, or <CODE>macwork:load</CODE> is a literal string
+constant or composed of combinations of vicinity functions and
+string literal constants; and the resulting file exists (possibly
+with &quot;.scm&quot; appended).
+</P>
+</DL>
+The following function parses an <EM>Info</EM> Index.
+<A NAME="IDX52"></A>
+<A NAME="DOCF2" HREF="slib_fot.html#FOOT2">(2)</A>
+<P>
+
+<A NAME="IDX53"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>exports&lt;-info-index</B> <I>file n <small>...</small></I>
+<DD><P>
+
+<VAR>n</VAR> <small>...</small> must be an increasing series of positive integers.
+<CODE>exports&lt;-info-index</CODE> returns a list of all the identifiers appearing in the <VAR>n</VAR>th
+<small>...</small> (info) indexes of <VAR>file</VAR>. The identifiers have the case that
+the implementation's <CODE>read</CODE> uses for symbols. Identifiers
+containing spaces (eg. <CODE>close-base on base-table</CODE>) are
+<EM>not</EM> included.
+</P>
+<P>
+
+Each info index is headed by a `<SAMP>* Menu:</SAMP>' line. To list the
+symbols in the first and third info indexes do:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(exports&lt;-info-index &quot;slib.info&quot; 1 3)
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Module Analysis"></A>
+<HR SIZE="6">
+<A NAME="SEC12"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC11"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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> 1.6.5 Module Analysis </H3>
+<!--docid::SEC12::-->
+<P>
+
+<CODE>(require 'vet)</CODE>
+<A NAME="IDX54"></A>
+</P>
+<P>
+
+<A NAME="IDX55"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>vet-slib</B>
+<DD><P>
+
+Using the procedures in the <CODE>top-refs</CODE> and <CODE>manifest</CODE>
+modules, <CODE>vet-slib</CODE> analyzes each SLIB module, reporting about any
+procedure or macro defined whether it is:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+
+<DT>orphaned
+<DD>defined, not called, not exported;
+<DT>missing
+<DD>called, not defined, and not exported by its <CODE>require</CODE>d modules;
+<DT>undocumented-export
+<DD>Exported by module, but no index entry in `<TT>slib.info</TT>';
+<P>
+
+</DL>
+<P>
+
+And for the library as a whole:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+
+<DT>documented-unexport
+<DD>Index entry in `<TT>slib.info</TT>', but no module exports it.
+<P>
+
+</DL>
+<P>
+
+This straightforward analysis caught three full days worth of
+never-executed branches, transitive require assumptions, spelling
+errors, undocumented procedures, missing procedures, and cyclic
+dependencies in SLIB.
+</P>
+</DL>
+<P>
+
+<A NAME="Universal SLIB Procedures"></A>
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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>
diff --git a/slib_10.html b/slib_10.html
new file mode 100644
index 0000000..6c9e1e5
--- /dev/null
+++ b/slib_10.html
@@ -0,0 +1,217 @@
+<!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: Variable Index</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Variable Index">
+<META NAME="keywords" CONTENT="SLIB: Variable Index">
+<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="SEC293"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_19.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> Variable Index </H1>
+<!--docid::SEC293::-->
+<P>
+
+This is an alphabetical list of all the global variables in SLIB.
+</P>
+<P>
+
+</P>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_10.html#vr_*" style="text-decoration:none"><b>*</b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_10.html#vr_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_*"></A>*</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX231"><CODE>*argv*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1001"><CODE>*base-table-implementations*</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX8"><CODE>*catalog*</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX355"><CODE>*http:byline*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX273"><CODE>*operating-system*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX233"><CODE>*optarg*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX232"><CODE>*optind*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1563"><CODE>*qp-width*</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX538"><CODE>*random-state*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX901"><CODE>*ruleset*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX184"><CODE>*syn-defs*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX185"><CODE>*syn-ignore-whitespace*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX437"><CODE>*timezone*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX568"><CODE>atm-hec-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_B"></A>B</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX620"><CODE>bottomedge</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX67"><CODE>char-code-limit</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX581"><CODE>charplot:dimensions</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX817"><CODE>CIEXYZ:A</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX818"><CODE>CIEXYZ:B</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX819"><CODE>CIEXYZ:C</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX816"><CODE>CIEXYZ:D50</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX815"><CODE>CIEXYZ:D65</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX820"><CODE>CIEXYZ:E</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX567"><CODE>crc-08-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX566"><CODE>crc-10-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX565"><CODE>crc-12-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX564"><CODE>crc-16-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX562"><CODE>crc-32-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX563"><CODE>crc-ccitt-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX722"><CODE>D50</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC121">5.9.1.2 White</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX721"><CODE>D65</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC121">5.9.1.2 White</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX438"><CODE>daylight?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1585"><CODE>debug:max-count</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX906"><CODE>distribute*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX907"><CODE>distribute/</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX569"><CODE>dowcrc-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_G"></A>G</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX629"><CODE>graph:dimensions</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX611"><CODE>graphrect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_L"></A>L</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX621"><CODE>leftedge</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_M"></A>M</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX68"><CODE>most-positive-fixnum</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX105"><CODE>nil</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC20">2.5.2 Legacy</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1063"><CODE>number-wt-type</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX610"><CODE>plotrect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX526"><CODE>prime:prngs</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX528"><CODE>prime:trials</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX622"><CODE>rightedge</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX70"><CODE>slib:form-feed</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX69"><CODE>slib:tab</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX214"><CODE>stderr</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC55">4.3.1 stdio</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX212"><CODE>stdin</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC55">4.3.1 stdio</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX213"><CODE>stdout</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC55">4.3.1 stdio</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1064"><CODE>string-wt-type</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX104"><CODE>t</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC20">2.5.2 Legacy</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX191"><CODE>tok:decimal-digits</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX193"><CODE>tok:lower-case</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX192"><CODE>tok:upper-case</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX194"><CODE>tok:whitespaces</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX619"><CODE>topedge</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX439"><CODE>tzname</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="vr_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX570"><CODE>usb-token-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_10.html#vr_*" style="text-decoration:none"><b>*</b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_10.html#vr_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_10.html#vr_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+</td></tr></table><P>
+
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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>
diff --git a/slib_11.html b/slib_11.html
new file mode 100644
index 0000000..e89cfe5
--- /dev/null
+++ b/slib_11.html
@@ -0,0 +1,268 @@
+<!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: Concept and Feature Index</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Concept and Feature Index">
+<META NAME="keywords" CONTENT="SLIB: Concept and Feature Index">
+<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="SEC294"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_10.html#SEC293"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_10.html#SEC293"> &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_20.html"> &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> Concept and Feature Index </H1>
+<!--docid::SEC294::-->
+<P>
+
+</P>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX16">aggregate</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX46">aggregate</A></TD><TD valign=top><A HREF="slib_1.html#SEC10">1.6.3 Module Semantics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1412">alarm</A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1413">alarm-interrupt</A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1143"><CODE>alist</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX994"><CODE>alist-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1002"><CODE>alist-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1034"><CODE>alist-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX405">ange-ftp</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX692">appearance</A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX699">appearance</A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1094"><CODE>array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1136"><CODE>array-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1145">association function</A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX296">attribute-value</A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX919">Auto-sharing</A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_B"></A>B</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1052">balanced binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX383">base</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX993">base-table</A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX271"><CODE>batch</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX292"><CODE>batch</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1166">binary</A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1167">binary</A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1053">binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1056">binary trees, as discrete maps</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1055">binary trees, as sets</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX172">binding power</A></TD><TD valign=top><A HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1570"><CODE>break</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1572"><CODE>break</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1151"><CODE>byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1153">byte</A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1183"><CODE>byte-number</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX425">calendar time</A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX442">calendar time</A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX441"><CODE>Calendar-Time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX443">caltime</A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX847">canonical</A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX896">careful</A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX7">catalog</A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX13">Catalog File</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1621">certificate</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1622">certificate</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX352"><CODE>cgi</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1330"><CODE>chapter-order</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX580"><CODE>charplot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX583"><CODE>charplot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX749">Chroma</A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX773"><CODE>cie1931</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX771"><CODE>cie1964</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX775"><CODE>ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX725"><CODE>CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX575">cksum-string</A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1385"><CODE>coerce</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1216"><CODE>collect</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1227"><CODE>collect</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX855"><CODE>color-database</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX845"><CODE>color-names</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX241">command line</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX242">command line</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX180"><CODE>commentfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1228"><CODE>common-list-functions</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1285"><CODE>common-list-functions</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC208">7.2.1 Common List Functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX894"><CODE>commutative-ring</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX15">compiled</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX36">compiling</A></TD><TD valign=top><A HREF="slib_1.html#SEC8">1.6.1 Module Conventions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX444"><CODE>Coordinated Universal Time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1650">copyright</A></TD><TD valign=top><A HREF="slib_8.html#SEC287">8.4 Copyrights</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX561"><CODE>crc</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX573"><CODE>crc</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1632"><CODE>cvs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX977"><CODE>database-commands</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX290"><CODE>databases</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX918"><CODE>databases</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX975"><CODE>databases</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC158">6.1.4.3 Define-tables Example</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX978"><CODE>databases</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX868"><CODE>daylight</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX328"><CODE>db-&gt;html</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1564"><CODE>debug</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1565"><CODE>debug</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1573"><CODE>debug</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX17">defmacro</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX114"><CODE>defmacroexpand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC23">3.1.1 Defmacroexpand</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX423"><CODE>defmacroexpand</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX183"><CODE>delim</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1268">dequeues</A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX910"><CODE>determinant</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1375"><CODE>diff</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1609"><CODE>directory</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX559">Discrete Fourier Transform</A></TD><TD valign=top><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1058">discrete maps, using binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1645"><CODE>DrScheme</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1234"><CODE>dynamic</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1468"><CODE>dynamic-wind</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC245">7.4.10 Dynamic-Wind</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX764"><CODE>e-sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1618">emacs</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1620">emacs</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX588">Encapsulated-PostScript</A></TD><TD valign=top><A HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX393">escaped</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX900">Euclidean Domain</A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1470"><CODE>eval</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX102">exchanger</A></TD><TD valign=top><A HREF="slib_2.html#SEC19">2.5.1 Mutual Exclusion</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_10.html#SEC293"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> &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>
diff --git a/slib_12.html b/slib_12.html
new file mode 100644
index 0000000..521de0f
--- /dev/null
+++ b/slib_12.html
@@ -0,0 +1,346 @@
+<!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: Procedure and Macro Index: C</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: C">
+<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: C">
+<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="slib_12.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> &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 ALIGN="Left">Procedure and Macro Index: C</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_C"></A>C</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1239"><CODE>call-with-dynamic-binding</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1401"><CODE>call-with-input-string</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC228">7.3.3 String Ports</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX81"><CODE>call-with-open-ports</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX82"><CODE>call-with-open-ports</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1400"><CODE>call-with-output-string</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC228">7.3.3 String Ports</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX268"><CODE>call-with-tmpnam</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX269"><CODE>call-with-tmpnam</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX270"><CODE>call-with-tmpnam</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1478"><CODE>call-with-values</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC247">7.4.12 Values</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX139"><CODE>capture-syntactic-environment</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC33">3.5.1.2 Transformer Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1509"><CODE>car+cdr</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1049"><CODE>cart-prod-tables on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX338"><CODE>catalog-&gt;html</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1012"><CODE>catalog-id on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX35"><CODE>catalog:read</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX468"><CODE>cdna:base-count</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX469"><CODE>cdna:report-base-count</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX361"><CODE>cgi:serve-query</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1335"><CODE>chap:next-string</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1333"><CODE>chap:string&lt;=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1331"><CODE>chap:string&lt;?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1334"><CODE>chap:string&gt;=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1332"><CODE>chap:string&gt;?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX254"><CODE>check-parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX795"><CODE>chromaticity-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX796"><CODE>chromaticity-&gt;whitepoint</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX803"><CODE>CIE:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX804"><CODE>CIE:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX807"><CODE>CIE:DE*94</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX808"><CODE>CIE:DE*94</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX727"><CODE>ciexyz-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX840"><CODE>CIEXYZ-&gt;e-sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX828"><CODE>CIEXYZ-&gt;L*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX829"><CODE>CIEXYZ-&gt;L*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX824"><CODE>CIEXYZ-&gt;L*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX825"><CODE>CIEXYZ-&gt;L*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX822"><CODE>CIEXYZ-&gt;RGB709</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX834"><CODE>CIEXYZ-&gt;sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX836"><CODE>CIEXYZ-&gt;xRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1492"><CODE>circular-list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1494"><CODE>circular-list?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX572"><CODE>cksum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX574"><CODE>cksum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX881"><CODE>clear-sky-color-xyy</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX614"><CODE>clip-to-rect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1008"><CODE>close-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX928"><CODE>close-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1037"><CODE>close-database on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX80"><CODE>close-port</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX961"><CODE>close-table on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX809"><CODE>CMC-DE</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX810"><CODE>CMC-DE</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX811"><CODE>CMC-DE</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX812"><CODE>CMC-DE</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX813"><CODE>CMC:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX814"><CODE>CMC:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX465"><CODE>codons&lt;-cdna</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1387"><CODE>coerce</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1219"><CODE>collection?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX729"><CODE>color-&gt;ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX769"><CODE>color-&gt;e-srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX739"><CODE>color-&gt;l*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX740"><CODE>color-&gt;l*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX754"><CODE>color-&gt;l*c*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX755"><CODE>color-&gt;l*c*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX745"><CODE>color-&gt;l*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX746"><CODE>color-&gt;l*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX733"><CODE>color-&gt;rgb709</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX761"><CODE>color-&gt;srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX717"><CODE>color-&gt;string</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC120">5.9.1.1 External Representation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX762"><CODE>color-&gt;xrgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX850"><CODE>color-dictionaries-&gt;lookup</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX851"><CODE>color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX852"><CODE>color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX849"><CODE>color-name-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX848"><CODE>color-name:canonicalize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX712"><CODE>color-precision</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX711"><CODE>color-space</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX713"><CODE>color-white-point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX728"><CODE>color:ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX766"><CODE>color:e-srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX767"><CODE>color:e-srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX768"><CODE>color:e-srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX737"><CODE>color:l*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX738"><CODE>color:l*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX752"><CODE>color:l*c*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX753"><CODE>color:l*c*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX743"><CODE>color:l*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX744"><CODE>color:l*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX821"><CODE>color:linear-transform</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX732"><CODE>color:rgb709</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX759"><CODE>color:srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX708"><CODE>color?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX709"><CODE>color?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX958"><CODE>column-domains on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX957"><CODE>column-foreigns on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX956"><CODE>column-names on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX592"><CODE>column-range</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX959"><CODE>column-types on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX595"><CODE>combine-ranges</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX904"><CODE>combined-rulesets</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX905"><CODE>combined-rulesets</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX327"><CODE>command-&gt;p-specs</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX344"><CODE>command:make-editable-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX339"><CODE>command:modify-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX340"><CODE>command:modify-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX341"><CODE>command:modify-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX342"><CODE>command:modify-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1520"><CODE>concatenate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1521"><CODE>concatenate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1481"><CODE>cond-expand</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC248">7.4.13 SRFI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1487"><CODE>cons*</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1575"><CODE>continue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1576"><CODE>continue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX714"><CODE>convert-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX715"><CODE>convert-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX716"><CODE>convert-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX486"><CODE>copy-bit</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC91">5.1.2 Bit Within Word</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX489"><CODE>copy-bit-field</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1289"><CODE>copy-list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX539"><CODE>copy-random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX540"><CODE>copy-random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1329"><CODE>copy-tree</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1531"><CODE>count</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1374"><CODE>count-newlines</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX576"><CODE>crc16</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX577"><CODE>crc16</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX578"><CODE>crc5</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX579"><CODE>crc5</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX571"><CODE>crc:make-table</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1097"><CODE>create-array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX920"><CODE>create-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1035"><CODE>create-database on relational-system</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX587"><CODE>create-postscript-graph</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1044"><CODE>create-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1045"><CODE>create-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1046"><CODE>create-view on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX908"><CODE>cring:define-rule</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX909"><CODE>cring:define-rule</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX455"><CODE>ctime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX456"><CODE>ctime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1610"><CODE>current-directory</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX84"><CODE>current-error-port</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX189"><CODE>current-input-port</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1174"><CODE>current-input-port</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1171"><CODE>current-output-port</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX426"><CODE>current-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1634"><CODE>cvs-directories</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1633"><CODE>cvs-files</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1636"><CODE>cvs-repository</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1635"><CODE>cvs-root</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1637"><CODE>cvs-set-root!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1638"><CODE>cvs-vet</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[ &lt;&lt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> &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>
diff --git a/slib_13.html b/slib_13.html
new file mode 100644
index 0000000..174eb2e
--- /dev/null
+++ b/slib_13.html
@@ -0,0 +1,325 @@
+<!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: Procedure and Macro Index: D -- F</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: D -- F">
+<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: D -- F">
+<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="slib_13.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_12.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_12.html"> &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_14.html"> &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 ALIGN="Left">Procedure and Macro Index: D -- F</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_D"></A>D</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX347"><CODE>db-&gt;html-directory</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX348"><CODE>db-&gt;html-directory</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX346"><CODE>db-&gt;html-files</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX349"><CODE>db-&gt;netscape</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX350"><CODE>db-&gt;netscape</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX459"><CODE>decode-universal-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX965"><CODE>define-*commands*</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX169"><CODE>define-access-operation</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX983"><CODE>define-command</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX984"><CODE>define-command</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX932"><CODE>define-domains</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC145">Defining Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX158"><CODE>define-operation</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX159"><CODE>define-predicate</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1553"><CODE>define-record-type</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC262">7.4.13.4 SRFI-9</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX153"><CODE>define-structure</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC38">3.6.2 Note from SLIB maintainer</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX121"><CODE>define-syntax</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC26">3.3.1 Caveat</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX985"><CODE>define-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX986"><CODE>define-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX934"><CODE>define-tables</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC145">Defining Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX113"><CODE>defmacro</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX108"><CODE>defmacro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX115"><CODE>defmacro:expand*</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC23">3.1.1 Defmacroexpand</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX109"><CODE>defmacro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX110"><CODE>defmacro?</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1467"><CODE>delay</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1318"><CODE>delete</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1023"><CODE>delete on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1027"><CODE>delete* on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX973"><CODE>delete-domain on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX77"><CODE>delete-file</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1319"><CODE>delete-if</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1320"><CODE>delete-if-not</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1043"><CODE>delete-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1274"><CODE>dequeue!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1276"><CODE>dequeue-all!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX913"><CODE>determinant</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1383"><CODE>diff:edit-length</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1384"><CODE>diff:edit-length</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1381"><CODE>diff:edits</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1382"><CODE>diff:edits</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1379"><CODE>diff:longest-common-subsequence</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1380"><CODE>diff:longest-common-subsequence</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX427"><CODE>difftime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1612"><CODE>directory-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1613"><CODE>directory-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1614"><CODE>directory-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1221"><CODE>do-elts</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1223"><CODE>do-keys</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX974"><CODE>domain-checker on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1495"><CODE>dotted-list?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1510"><CODE>drop</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1514"><CODE>drop-right</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1515"><CODE>drop-right!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1237"><CODE>dynamic-ref</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1238"><CODE>dynamic-set!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1469"><CODE>dynamic-wind</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC245">7.4.10 Dynamic-Wind</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1236"><CODE>dynamic?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_E"></A>E</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX841"><CODE>e-sRGB-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX765"><CODE>e-srgb-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX844"><CODE>e-sRGB-&gt;e-sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX843"><CODE>e-sRGB-&gt;sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1506"><CODE>eighth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1627"><CODE>emacs:backup-name</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC273">File Transactions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1231"><CODE>empty?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX460"><CODE>encode-universal-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX461"><CODE>encode-universal-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1273"><CODE>enqueue!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1162"><CODE>equal?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1471"><CODE>eval</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1297"><CODE>every</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1230"><CODE>every?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX53"><CODE>exports&lt;-info-index</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX512"><CODE>extended-euclid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX532"><CODE>factor</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX44"><CODE>feature-&gt;export-alist</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX45"><CODE>feature-&gt;exports</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX39"><CODE>feature-&gt;requires</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX5"><CODE>feature-eval</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX558"><CODE>fft</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX560"><CODE>fft-1</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1503"><CODE>fifth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX856"><CODE>file-&gt;color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX857"><CODE>file-&gt;color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX42"><CODE>file-&gt;definitions</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX43"><CODE>file-&gt;exports</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX40"><CODE>file-&gt;loads</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX38"><CODE>file-&gt;requires</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX76"><CODE>file-exists?</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1624"><CODE>file-lock!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1625"><CODE>file-lock!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1623"><CODE>file-lock-owner</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1626"><CODE>file-unlock!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX262"><CODE>filename:match-ci??</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX261"><CODE>filename:match??</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX266"><CODE>filename:substitute-ci??</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX265"><CODE>filename:substitute??</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX253"><CODE>fill-empty-parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX612"><CODE>fill-rect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1534"><CODE>filter</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC255">Filtering and Partitioning</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1535"><CODE>filter!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC255">Filtering and Partitioning</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1537"><CODE>find</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1303"><CODE>find-if</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1462"><CODE>find-ratio</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1463"><CODE>find-ratio-between</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1369"><CODE>find-string-from-port?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1370"><CODE>find-string-from-port?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1371"><CODE>find-string-from-port?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1372"><CODE>find-string-from-port?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1538"><CODE>find-tail</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1499"><CODE>first</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX155"><CODE>fluid-let</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC39">3.7 Fluid-Let</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1225"><CODE>for-each-elt</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1224"><CODE>for-each-key</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1028"><CODE>for-each-key on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX947"><CODE>for-each-row on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX951"><CODE>for-each-row-in-order on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1466"><CODE>force</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX85"><CODE>force-output</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX86"><CODE>force-output</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX324"><CODE>form:delimited</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX323"><CODE>form:element</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX320"><CODE>form:image</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX321"><CODE>form:reset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX318"><CODE>form:submit</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX319"><CODE>form:submit</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1502"><CODE>fourth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX217"><CODE>fprintf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX228"><CODE>fscanf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_12.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> &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>
diff --git a/slib_14.html b/slib_14.html
new file mode 100644
index 0000000..315215b
--- /dev/null
+++ b/slib_14.html
@@ -0,0 +1,314 @@
+<!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: Procedure and Macro Index: G -- I</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: G -- I">
+<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: G -- I">
+<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="slib_14.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> &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_15.html"> &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 ALIGN="Left">Procedure and Macro Index: G -- I</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_G"></A>G</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1217"><CODE>gen-elts</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1218"><CODE>gen-keys</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX408"><CODE>generic-write</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC79">4.11.1 Generic-Write</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX107"><CODE>gentemp</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX936"><CODE>get on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC147">6.1.2 Table Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX943"><CODE>get* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX457"><CODE>get-decoded-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX326"><CODE>get-foreign-choices</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1258"><CODE>get-method</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX458"><CODE>get-universal-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1607"><CODE>getenv</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC269">7.6 System Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX234"><CODE>getopt</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX236"><CODE><CODE>getopt--</CODE></CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC63">4.4.2 Getopt---</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX258"><CODE>getopt-&gt;arglist</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX257"><CODE>getopt-&gt;parameter-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX401"><CODE>glob-pattern?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX450"><CODE>gmktime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX447"><CODE>gmtime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX893"><CODE>golden-section-search</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC135">5.11 Minimizing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX503"><CODE>gray-code-&gt;integer</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX507"><CODE>gray-code&lt;=?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX505"><CODE>gray-code&lt;?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX508"><CODE>gray-code&gt;=?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX506"><CODE>gray-code&gt;?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX846"><CODE>grey</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX628"><CODE>grid-horizontals</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX627"><CODE>grid-verticals</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX454"><CODE>gtime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1307"><CODE>has-duplicates?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1350"><CODE>hash</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1245"><CODE>hash-associator</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1248"><CODE>hash-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1244"><CODE>hash-inquirer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1247"><CODE>hash-map</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1249"><CODE>hash-rehasher</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1246"><CODE>hash-remover</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1348"><CODE>hashq</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1349"><CODE>hashv</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1265"><CODE>heap-extract-max!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1264"><CODE>heap-insert!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1263"><CODE>heap-length</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1357"><CODE>hilbert-coordinates-&gt;integer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX586"><CODE>histograph</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX62"><CODE>home-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX370"><CODE>htm-fields</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX367"><CODE>html-for-each</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX380"><CODE>html:anchor</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX295"><CODE>html:atval</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX382"><CODE>html:base</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX306"><CODE>html:body</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX317"><CODE>html:buttons</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX330"><CODE>html:caption</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX331"><CODE>html:caption</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX313"><CODE>html:checkbox</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX309"><CODE>html:comment</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX325"><CODE>html:delimited-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX345"><CODE>html:editable-row-converter</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX310"><CODE>html:form</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX303"><CODE>html:head</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX304"><CODE>html:head</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX305"><CODE>html:head</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX332"><CODE>html:heading</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX312"><CODE>html:hidden</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX333"><CODE>html:href-heading</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX300"><CODE>html:http-equiv</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX384"><CODE>html:isindex</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX381"><CODE>html:link</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX334"><CODE>html:linked-row-converter</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX299"><CODE>html:meta</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX301"><CODE>html:meta-refresh</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX302"><CODE>html:meta-refresh</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX297"><CODE>html:plain</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX307"><CODE>html:pre</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX368"><CODE>html:read-title</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX369"><CODE>html:read-title</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX316"><CODE>html:select</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX329"><CODE>html:table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX314"><CODE>html:text</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX315"><CODE>html:text-area</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX354"><CODE>http:content</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX356"><CODE>http:error-page</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX357"><CODE>http:forwarding-page</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX353"><CODE>http:header</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX358"><CODE>http:serve-query</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX141"><CODE>identifier=?</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC34">3.5.1.3 Identifiers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX140"><CODE>identifier?</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC34">3.5.1.3 Identifiers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX101"><CODE>identity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC18">2.5 Miscellany</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1195"><CODE>ieee-byte-collate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1193"><CODE>ieee-byte-collate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1196"><CODE>ieee-byte-decollate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1194"><CODE>ieee-byte-decollate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1189"><CODE>ieee-double-&gt;bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1188"><CODE>ieee-float-&gt;bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX60"><CODE>implementation-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX599"><CODE>in-graphic-context</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX65"><CODE>in-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1571"><CODE>init-debug</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1185"><CODE>integer-&gt;bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX502"><CODE>integer-&gt;gray-code</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1356"><CODE>integer-&gt;hilbert-coordinates</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX495"><CODE>integer-&gt;list</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX496"><CODE>integer-&gt;list</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1192"><CODE>integer-byte-collate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1191"><CODE>integer-byte-collate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX492"><CODE>integer-expt</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX491"><CODE>integer-length</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX885"><CODE>integer-sqrt</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1475"><CODE>interaction-environment</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX962"><CODE>interpolate-from-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC154">6.1.3 Database Interpolation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1292"><CODE>intersection</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1489"><CODE>iota</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1490"><CODE>iota</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1491"><CODE>iota</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX952"><CODE>isam-next on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX953"><CODE>isam-next on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX954"><CODE>isam-prev on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX955"><CODE>isam-prev on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> &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>
diff --git a/slib_15.html b/slib_15.html
new file mode 100644
index 0000000..0c14c47
--- /dev/null
+++ b/slib_15.html
@@ -0,0 +1,367 @@
+<!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: Procedure and Macro Index: J -- M</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: J -- M">
+<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: J -- M">
+<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="slib_15.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> &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_16.html"> &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 ALIGN="Left">Procedure and Macro Index: J -- M</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_J"></A>J</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX527"><CODE>jacobi-symbol</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_K"></A>K</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1416"><CODE>kill-process!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1011"><CODE>kill-table on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_L"></A>L</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX830"><CODE>L*a*b*-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX831"><CODE>L*a*b*-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX736"><CODE>l*a*b*-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX832"><CODE>L*a*b*-&gt;L*C*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX802"><CODE>L*a*b*:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX751"><CODE>l*c*h-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX833"><CODE>L*C*h-&gt;L*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX805"><CODE>L*C*h:DE*94</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX806"><CODE>L*C*h:DE*94</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX826"><CODE>L*u*v*-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX827"><CODE>L*u*v*-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX742"><CODE>l*u*v*-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX888"><CODE>laguerre:find-polynomial-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX887"><CODE>laguerre:find-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1312"><CODE>last</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1518"><CODE>last</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX106"><CODE>last-pair</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC20">2.5.2 Legacy</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1519"><CODE>length+</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX59"><CODE>library-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX651"><CODE>light:ambient</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX652"><CODE>light:ambient</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX656"><CODE>light:beam</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX657"><CODE>light:beam</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX658"><CODE>light:beam</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX659"><CODE>light:beam</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX653"><CODE>light:directional</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX654"><CODE>light:directional</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX655"><CODE>light:directional</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX660"><CODE>light:point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX661"><CODE>light:point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX662"><CODE>light:point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX663"><CODE>light:point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX664"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX665"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX666"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX667"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX668"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1288"><CODE>list*</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1161"><CODE>list-&gt;bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX497"><CODE>list-&gt;integer</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1449"><CODE>list-&gt;string</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1452"><CODE>list-&gt;vector</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1488"><CODE>list-copy</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1542"><CODE>list-index</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1300"><CODE>list-of??</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1301"><CODE>list-of??</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1302"><CODE>list-of??</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX935"><CODE>list-table-definition</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC146">Listing Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1486"><CODE>list-tabulate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1447"><CODE>list-tail</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1498"><CODE>list=</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX41"><CODE>load-&gt;path</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX777"><CODE>load-ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX853"><CODE>load-color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX854"><CODE>load-color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX448"><CODE>localtime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX449"><CODE>localtime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX478"><CODE>logand</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX485"><CODE>logbit?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC91">5.1.2 Bit Within Word</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX484"><CODE>logcount</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX487"><CODE>logical:ones</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX493"><CODE>logical:rotate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX479"><CODE>logior</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX481"><CODE>lognot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX483"><CODE>logtest</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX480"><CODE>logxor</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_M"></A>M</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX118"><CODE>macro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX126"><CODE>macro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX133"><CODE>macro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX145"><CODE>macro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX117"><CODE>macro:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX124"><CODE>macro:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX131"><CODE>macro:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX143"><CODE>macro:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX119"><CODE>macro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX128"><CODE>macro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX135"><CODE>macro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX147"><CODE>macro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX112"><CODE>macroexpand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX111"><CODE>macroexpand-1</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX127"><CODE>macwork:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX125"><CODE>macwork:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX129"><CODE>macwork:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1004"><CODE>make-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1156"><CODE>make-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1157"><CODE>make-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX710"><CODE>make-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX976"><CODE>make-command-server</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC160">6.1.4.5 Command Service</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1611"><CODE>make-directory</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1235"><CODE>make-dynamic</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX103"><CODE>make-exchanger</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC19">2.5.1 Mutual Exclusion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1253"><CODE>make-generic-method</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1254"><CODE>make-generic-predicate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1020"><CODE>make-getter on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1021"><CODE>make-getter-1 on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1242"><CODE>make-hash-table</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1262"><CODE>make-heap</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1018"><CODE>make-key-&gt;list on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1017"><CODE>make-key-extractor on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1015"><CODE>make-keyifier-1 on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1286"><CODE>make-list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1287"><CODE>make-list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1016"><CODE>make-list-keyifier on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1255"><CODE>make-method!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1031"><CODE>make-nexter on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1251"><CODE>make-object</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX248"><CODE>make-parameter-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1256"><CODE>make-predicate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1032"><CODE>make-prever on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1465"><CODE>make-promise</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1022"><CODE>make-putter on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX364"><CODE>make-query-alist-command-server</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX365"><CODE>make-query-alist-command-server</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1269"><CODE>make-queue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX542"><CODE>make-random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX543"><CODE>make-random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1280"><CODE>make-record-type</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1033"><CODE>make-relational-system</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX902"><CODE>make-ruleset</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX903"><CODE>make-ruleset</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1124"><CODE>make-shared-array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1359"><CODE>make-sierpinski-indexer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC221">7.2.7.2 Sierpinski Curve</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX861"><CODE>make-slib-color-name-db</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX138"><CODE>make-syntactic-closure</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC33">3.5.1.2 Transformer Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1009"><CODE>make-table on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX373"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX374"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX375"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX376"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX377"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX378"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX56"><CODE>make-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1065"><CODE>make-wt-tree</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1062"><CODE>make-wt-tree-type</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1532"><CODE>map!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC254">Fold and Unfold</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1220"><CODE>map-elts</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1029"><CODE>map-key on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1222"><CODE>map-keys</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1201"><CODE>matfile:load</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1200"><CODE>matfile:read</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX912"><CODE>matrix-&gt;array</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX911"><CODE>matrix-&gt;lists</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX916"><CODE>matrix:inverse</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX915"><CODE>matrix:product</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX929"><CODE>mdbm:report</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1544"><CODE>member</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1545"><CODE>member</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1295"><CODE>member-if</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1338"><CODE>merge</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1339"><CODE>merge!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX451"><CODE>mktime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX452"><CODE>mktime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX510"><CODE>mod</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX522"><CODE>modular:*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX520"><CODE>modular:+</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX521"><CODE>modular:-</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX523"><CODE>modular:expt</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX518"><CODE>modular:invert</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX517"><CODE>modular:invertable?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX519"><CODE>modular:negate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX515"><CODE>modular:normalize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX514"><CODE>modulus-&gt;integer</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX464"><CODE>mrna&lt;-cdna</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX287"><CODE>must-be-first</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX288"><CODE>must-be-last</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> &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>
diff --git a/slib_16.html b/slib_16.html
new file mode 100644
index 0000000..b47a0fa
--- /dev/null
+++ b/slib_16.html
@@ -0,0 +1,311 @@
+<!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: Procedure and Macro Index: N -- P</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: N -- P">
+<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: N -- P">
+<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="slib_16.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> &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_17.html"> &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 ALIGN="Left">Procedure and Macro Index: N -- P</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX462"><CODE>ncbi:read-dna-sequence</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX463"><CODE>ncbi:read-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1316"><CODE>nconc</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX884"><CODE>newton:find-integer-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX886"><CODE>newton:find-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1507"><CODE>ninth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1497"><CODE>not-pair?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1298"><CODE>notany</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1299"><CODE>notevery</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1317"><CODE>nreverse</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1314"><CODE>nthcdr</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX400"><CODE>null-directory?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1473"><CODE>null-environment</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1474"><CODE>null-environment</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1496"><CODE>null-list?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_O"></A>O</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX160"><CODE>object</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX411"><CODE>object-&gt;limited-string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX410"><CODE>object-&gt;string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX161"><CODE>object-with-ancestors</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1252"><CODE>object?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX428"><CODE>offset-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1005"><CODE>open-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX966"><CODE>open-command-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX967"><CODE>open-command-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX970"><CODE>open-command-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX968"><CODE>open-command-database!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX969"><CODE>open-command-database!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX971"><CODE>open-command-database!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX923"><CODE>open-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX924"><CODE>open-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1036"><CODE>open-database on relational-system</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX922"><CODE>open-database!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX78"><CODE>open-file</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1168"><CODE>open-file</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX930"><CODE>open-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC144">Opening Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1010"><CODE>open-table on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1042"><CODE>open-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX931"><CODE>open-table!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC144">Opening Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX162"><CODE>operate-as</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1322"><CODE>or?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1030"><CODE>ordered-for-each-key on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX289"><CODE>os-&gt;batch-dialect</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX613"><CODE>outline-rect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX89"><CODE>output-port-height</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX90"><CODE>output-port-height</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX87"><CODE>output-port-width</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX88"><CODE>output-port-width</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX880"><CODE>overcast-sky-color-xyy</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX467"><CODE>p&lt;-cdna</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX593"><CODE>pad-range</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1533"><CODE>pair-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC254">Fold and Unfold</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX255"><CODE>parameter-list-&gt;arglist</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX252"><CODE>parameter-list-expand</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX249"><CODE>parameter-list-ref</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX403"><CODE>parse-ftp-address</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1536"><CODE>partition</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC255">Filtering and Partitioning</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX609"><CODE>partition-page</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX396"><CODE>path-&gt;uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX57"><CODE>pathname-&gt;vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX582"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX584"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX585"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX630"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX631"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX632"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX598"><CODE>plot-column</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC106">5.7.2.2 Drawing the Graph</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1215"><CODE>pnm:array-write</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1211"><CODE>pnm:image-file-&gt;array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1213"><CODE>pnm:image-file-&gt;array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1203"><CODE>pnm:type-dimensions</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX79"><CODE>port?</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1309"><CODE>position</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX418"><CODE>pprint-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX419"><CODE>pprint-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX420"><CODE>pprint-filter-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX421"><CODE>pprint-filter-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX207"><CODE>prec:commentfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX186"><CODE>prec:define-grammar</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX200"><CODE>prec:delim</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX203"><CODE>prec:infix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX209"><CODE>prec:inmatchfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX199"><CODE>prec:make-led</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX198"><CODE>prec:make-nud</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX208"><CODE>prec:matchfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX204"><CODE>prec:nary</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX201"><CODE>prec:nofix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX187"><CODE>prec:parse</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX188"><CODE>prec:parse</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX205"><CODE>prec:postfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX202"><CODE>prec:prefix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX206"><CODE>prec:prestfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1144"><CODE>predicate-&gt;asso</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1241"><CODE>predicate-&gt;hash</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1243"><CODE>predicate-&gt;hash-asso</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1019"><CODE>present? on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX413"><CODE>pretty-print</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX414"><CODE>pretty-print</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX415"><CODE>pretty-print-&gt;string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX416"><CODE>pretty-print-&gt;string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX960"><CODE>primary-limit on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX529"><CODE>prime?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX530"><CODE>primes&lt;</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX531"><CODE>primes&gt;</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX163"><CODE>print</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1586"><CODE>print-call-stack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1587"><CODE>print-call-stack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX216"><CODE>printf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1415"><CODE>process:schedule!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX58"><CODE>program-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1047"><CODE>project-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1493"><CODE>proper-list?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX466"><CODE>protein&lt;-cdna</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX6"><CODE>provide</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX4"><CODE>provided?</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> &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>
diff --git a/slib_17.html b/slib_17.html
new file mode 100644
index 0000000..5ab1a62
--- /dev/null
+++ b/slib_17.html
@@ -0,0 +1,461 @@
+<!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: Procedure and Macro Index: Q -- S</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: Q -- S">
+<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: Q -- S">
+<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="slib_17.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> &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_18.html"> &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 ALIGN="Left">Procedure and Macro Index: Q -- S</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_Q"></A>Q</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1560"><CODE>qp</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1561"><CODE>qpn</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1562"><CODE>qpr</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1271"><CODE>queue-empty?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1277"><CODE>queue-front</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1275"><CODE>queue-pop!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1272"><CODE>queue-push!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1278"><CODE>queue-rear</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1270"><CODE>queue?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX536"><CODE>random</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX537"><CODE>random</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX547"><CODE>random:exp</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX548"><CODE>random:exp</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX553"><CODE>random:hollow-sphere!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX554"><CODE>random:hollow-sphere!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX549"><CODE>random:normal</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX550"><CODE>random:normal</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX551"><CODE>random:normal-vector!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX552"><CODE>random:normal-vector!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX555"><CODE>random:solid-sphere!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX556"><CODE>random:solid-sphere!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX545"><CODE>random:uniform</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX546"><CODE>random:uniform</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1461"><CODE>rationalize</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1172"><CODE>read-byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1173"><CODE>read-byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1175"><CODE>read-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1176"><CODE>read-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX239"><CODE>read-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX240"><CODE>read-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1403"><CODE>read-line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1404"><CODE>read-line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1405"><CODE>read-line!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1406"><CODE>read-line!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX244"><CODE>read-options-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1551"><CODE>receive</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC261">7.4.13.3 SRFI-8</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1283"><CODE>record-accessor</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1281"><CODE>record-constructor</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1284"><CODE>record-modifier</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1282"><CODE>record-predicate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1226"><CODE>reduce</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1310"><CODE>reduce</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1311"><CODE>reduce-init</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX511"><CODE>rem</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1304"><CODE>remove</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1539"><CODE>remove</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1540"><CODE>remove!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1308"><CODE>remove-duplicates</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1305"><CODE>remove-if</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1306"><CODE>remove-if-not</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX250"><CODE>remove-parameter</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX168"><CODE>remove-setter-for</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1556"><CODE>repl:quit</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1555"><CODE>repl:top-level</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX267"><CODE>replace-suffix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX10"><CODE>require</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX24"><CODE>require</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX26"><CODE>require</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX11"><CODE>require-if</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX867"><CODE>resene</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC132">The Short List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1048"><CODE>restrict-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1522"><CODE>reverse!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX823"><CODE>RGB709-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX731"><CODE>rgb709-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX941"><CODE>row:delete on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX946"><CODE>row:delete* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX937"><CODE>row:insert on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX948"><CODE>row:insert* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX940"><CODE>row:remove on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX945"><CODE>row:remove* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX939"><CODE>row:retrieve on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX944"><CODE>row:retrieve* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX938"><CODE>row:update on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX949"><CODE>row:update* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX624"><CODE>rule-horizontal</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX623"><CODE>rule-vertical</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX865"><CODE>saturate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC132">The Short List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX227"><CODE>scanf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX224"><CODE>scanf-read-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX225"><CODE>scanf-read-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX226"><CODE>scanf-read-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX646"><CODE>scene:overcast</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX647"><CODE>scene:overcast</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX640"><CODE>scene:panorama</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX642"><CODE>scene:sky-and-dirt</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX643"><CODE>scene:sky-and-grass</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX641"><CODE>scene:sphere</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX644"><CODE>scene:sun</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX645"><CODE>scene:sun</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX648"><CODE>scene:viewpoint</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX649"><CODE>scene:viewpoint</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX650"><CODE>scene:viewpoints</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1472"><CODE>scheme-report-environment</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX472"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX473"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX474"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX475"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX890"><CODE>secant:find-bracketed-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX889"><CODE>secant:find-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1500"><CODE>second</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX541"><CODE>seed-&gt;random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX166"><CODE>set</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX600"><CODE>set-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1293"><CODE>set-difference</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX601"><CODE>set-font</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX606"><CODE>set-glyphsize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX603"><CODE>set-linedash</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX604"><CODE>set-linedash</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX605"><CODE>set-linedash</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX602"><CODE>set-linewidth</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX165"><CODE>setter</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1233"><CODE>Setter</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX596"><CODE>setup-plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX597"><CODE>setup-plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1505"><CODE>seventh</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1418"><CODE>si:conversion-factor</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC234">7.3.6.3 Unit Symbols</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1066"><CODE>singleton-wt-tree</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1504"><CODE>sixth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX164"><CODE>size</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1232"><CODE>size</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX882"><CODE>sky-color-xyy</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX97"><CODE>slib:error</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX94"><CODE>slib:eval</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX95"><CODE>slib:eval-load</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX98"><CODE>slib:exit</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX99"><CODE>slib:exit</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX12"><CODE>slib:in-catalog?</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX93"><CODE>slib:load</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX92"><CODE>slib:load-compiled</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX91"><CODE>slib:load-source</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX73"><CODE>slib:report</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX74"><CODE>slib:report</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX75"><CODE>slib:report</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX72"><CODE>slib:report-version</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX96"><CODE>slib:warn</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX594"><CODE>snap-range</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX71"><CODE>software-type</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX873"><CODE>solar-declination</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX872"><CODE>solar-hour</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX874"><CODE>solar-polar</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX703"><CODE>solid:arrow</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX704"><CODE>solid:arrow</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX683"><CODE>solid:basrelief</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX684"><CODE>solid:basrelief</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX685"><CODE>solid:basrelief</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX669"><CODE>solid:box</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX670"><CODE>solid:box</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX701"><CODE>solid:center-array-of</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX702"><CODE>solid:center-pile-of</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX700"><CODE>solid:center-row-of</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX686"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX687"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX688"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX689"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX690"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX691"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX675"><CODE>solid:cone</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX676"><CODE>solid:cone</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX671"><CODE>solid:cylinder</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX672"><CODE>solid:cylinder</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX673"><CODE>solid:disk</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX674"><CODE>solid:disk</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX681"><CODE>solid:ellipsoid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX682"><CODE>solid:ellipsoid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX677"><CODE>solid:pyramid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX678"><CODE>solid:pyramid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX707"><CODE>solid:rotation</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC117">Spatial Transformations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX706"><CODE>solid:scale</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC117">Spatial Transformations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX679"><CODE>solid:sphere</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX680"><CODE>solid:sphere</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX693"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX694"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX695"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX696"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX697"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX698"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX705"><CODE>solid:translation</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC117">Spatial Transformations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX927"><CODE>solidify-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1040"><CODE>solidify-database on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1296"><CODE>some</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1340"><CODE>sort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1341"><CODE>sort!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1337"><CODE>sorted?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1361"><CODE>soundex</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC222">7.2.8 Soundex</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1543"><CODE>span</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX782"><CODE>spectrum-&gt;chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX783"><CODE>spectrum-&gt;chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX780"><CODE>spectrum-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX781"><CODE>spectrum-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX778"><CODE>spectrum-&gt;XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX779"><CODE>spectrum-&gt;XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1516"><CODE>split-at</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1517"><CODE>split-at!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX218"><CODE>sprintf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX219"><CODE>sprintf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX220"><CODE>sprintf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX835"><CODE>sRGB-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX758"><CODE>srgb-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX842"><CODE>sRGB-&gt;e-sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX838"><CODE>sRGB-&gt;xRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX229"><CODE>sscanf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1592"><CODE>stack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1593"><CODE>stack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1568"><CODE>stack-all</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1604"><CODE>stackf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1605"><CODE>stackf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX718"><CODE>string-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC120">5.9.1.1 External Representation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1448"><CODE>string-&gt;list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1391"><CODE>string-capitalize</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1394"><CODE>string-capitalize!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1395"><CODE>string-ci-&gt;symbol</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1450"><CODE>string-copy</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1390"><CODE>string-downcase</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1393"><CODE>string-downcase!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1451"><CODE>string-fill!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1363"><CODE>string-index</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1364"><CODE>string-index-ci</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX286"><CODE>string-join</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1437"><CODE>string-null?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1365"><CODE>string-reverse-index</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1366"><CODE>string-reverse-index-ci</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1373"><CODE>string-subst</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1389"><CODE>string-upcase</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1392"><CODE>string-upcase!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1397"><CODE>StudlyCapsExpand</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1398"><CODE>StudlyCapsExpand</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX66"><CODE>sub-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1132"><CODE>subarray</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1133"><CODE>subarray0</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1294"><CODE>subset?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1325"><CODE>subst</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1328"><CODE>subst</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1326"><CODE>substq</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1368"><CODE>substring-ci?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1436"><CODE>substring-fill!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1434"><CODE>substring-move-left!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1435"><CODE>substring-move-right!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1179"><CODE>substring-read!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1180"><CODE>substring-read!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1181"><CODE>substring-write</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1182"><CODE>substring-write</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1367"><CODE>substring?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1327"><CODE>substv</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX878"><CODE>sunlight-ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX876"><CODE>sunlight-spectrum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX877"><CODE>sunlight-xyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1014"><CODE>supported-key-type? on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC169">6.2.1.3 Base Field Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1013"><CODE>supported-type? on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC169">6.2.1.3 Base Field Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1396"><CODE>symbol-append</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX513"><CODE>symmetric:modulus</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1007"><CODE>sync-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX926"><CODE>sync-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1039"><CODE>sync-database on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX146"><CODE>syncase:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX144"><CODE>syncase:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX148"><CODE>syncase:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX152"><CODE>syncase:sanity-check</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX134"><CODE>synclo:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX132"><CODE>synclo:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX136"><CODE>synclo:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX122"><CODE>syntax-rules</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC26">3.3.1 Caveat</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1608"><CODE>system</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC269">7.6 System Interface</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1409"><CODE>system-&gt;line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1410"><CODE>system-&gt;line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> &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>
diff --git a/slib_18.html b/slib_18.html
new file mode 100644
index 0000000..0c816db
--- /dev/null
+++ b/slib_18.html
@@ -0,0 +1,331 @@
+<!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: Procedure and Macro Index: T -- W</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: T -- W">
+<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: T -- W">
+<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="slib_18.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_19.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> &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_19.html"> &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 ALIGN="Left">Procedure and Macro Index: T -- W</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX336"><CODE>table-&gt;linked-html</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX337"><CODE>table-&gt;linked-page</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1041"><CODE>table-exists? on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX335"><CODE>table-name-&gt;filename</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1511"><CODE>take</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1512"><CODE>take!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1513"><CODE>take-right</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX791"><CODE>temperature-&gt;chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX790"><CODE>temperature-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX789"><CODE>temperature-&gt;XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1508"><CODE>tenth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1501"><CODE>third</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX431"><CODE>time-zone</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX617"><CODE>title-bottom</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX618"><CODE>title-bottom</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX615"><CODE>title-top</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX616"><CODE>title-top</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX83"><CODE>tmpnam</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX195"><CODE>tok:bump-column</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX190"><CODE>tok:char-group</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX50"><CODE>top-refs</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX51"><CODE>top-refs&lt;-file</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1345"><CODE>topological-sort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1588"><CODE>trace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1589"><CODE>trace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1566"><CODE>trace-all</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1600"><CODE>tracef</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1601"><CODE>tracef</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1590"><CODE>track</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1591"><CODE>track</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1567"><CODE>track-all</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1602"><CODE>trackf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1603"><CODE>trackf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1628"><CODE>transact-file-replacement</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC273">File Transactions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1629"><CODE>transact-file-replacement</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC273">File Transactions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1630"><CODE>transact-file-replacement</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC273">File Transactions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1432"><CODE>transcript-off</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC238">7.4.3 Transcripts</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1431"><CODE>transcript-on</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC238">7.4.3 Transcripts</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX137"><CODE>transformer</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC33">3.5.1.2 Transformer Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX914"><CODE>transpose</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX283"><CODE>truncate-up-to</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX284"><CODE>truncate-up-to</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX285"><CODE>truncate-up-to</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1344"><CODE>tsort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1386"><CODE>type-of</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX432"><CODE>tz:params</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX433"><CODE>tz:std-offset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX434"><CODE>tzset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX435"><CODE>tzset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX436"><CODE>tzset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1579"><CODE>unbreak</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1580"><CODE>unbreak</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1583"><CODE>unbreakf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1291"><CODE>union</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1257"><CODE>unmake-method!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1598"><CODE>unstack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1599"><CODE>unstack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1594"><CODE>untrace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1595"><CODE>untrace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1606"><CODE>untracef</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1596"><CODE>untrack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1597"><CODE>untrack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1526"><CODE>unzip1</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1527"><CODE>unzip2</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1528"><CODE>unzip3</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1529"><CODE>unzip4</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1530"><CODE>unzip5</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX385"><CODE>uri-&gt;tree</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX386"><CODE>uri-&gt;tree</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX389"><CODE>uri:decode-query</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX379"><CODE>uri:make-path</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX395"><CODE>uri:path-&gt;keys</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX388"><CODE>uri:split-fields</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX394"><CODE>uric:decode</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX391"><CODE>uric:encode</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX858"><CODE>url-&gt;color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX859"><CODE>url-&gt;color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1631"><CODE>user-email-address</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC274">Identification</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX61"><CODE>user-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_V"></A>V</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1477"><CODE>values</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC247">7.4.12 Values</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1453"><CODE>vector-&gt;list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1454"><CODE>vector-fill!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX55"><CODE>vet-slib</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC12">1.6.5 Module Analysis</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX64"><CODE>vicinity:suffix?</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX636"><CODE>vrml</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX637"><CODE>vrml-append</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX638"><CODE>vrml-to-file</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_W"></A>W</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX785"><CODE>wavelength-&gt;chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX786"><CODE>wavelength-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX784"><CODE>wavelength-&gt;XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX589"><CODE>whole-page</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX608"><CODE>whole-page</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1428"><CODE>with-input-from-file</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC237">7.4.2 With-File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1429"><CODE>with-output-to-file</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC237">7.4.2 With-File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX982"><CODE>within-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX639"><CODE>world:info</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX963"><CODE>wrap-command-interface</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1006"><CODE>write-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1169"><CODE>write-byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1170"><CODE>write-byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1177"><CODE>write-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1178"><CODE>write-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX925"><CODE>write-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1038"><CODE>write-database on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1407"><CODE>write-line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1408"><CODE>write-line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1070"><CODE>wt-tree/add</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1071"><CODE>wt-tree/add!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1074"><CODE>wt-tree/delete</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1075"><CODE>wt-tree/delete!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1092"><CODE>wt-tree/delete-min</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1093"><CODE>wt-tree/delete-min!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1080"><CODE>wt-tree/difference</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1068"><CODE>wt-tree/empty?</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1083"><CODE>wt-tree/fold</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1084"><CODE>wt-tree/for-each</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1085"><CODE>wt-tree/index</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1086"><CODE>wt-tree/index-datum</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1087"><CODE>wt-tree/index-pair</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1079"><CODE>wt-tree/intersection</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1073"><CODE>wt-tree/lookup</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1072"><CODE>wt-tree/member?</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1089"><CODE>wt-tree/min</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1090"><CODE>wt-tree/min-datum</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1091"><CODE>wt-tree/min-pair</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1088"><CODE>wt-tree/rank</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1082"><CODE>wt-tree/set-equal?</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1069"><CODE>wt-tree/size</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1076"><CODE>wt-tree/split&lt;</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1077"><CODE>wt-tree/split&gt;</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1081"><CODE>wt-tree/subset?</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1078"><CODE>wt-tree/union</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_19.html"> &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>
diff --git a/slib_19.html b/slib_19.html
new file mode 100644
index 0000000..07b5563
--- /dev/null
+++ b/slib_19.html
@@ -0,0 +1,214 @@
+<!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: Procedure and Macro Index: X -- Z</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: X -- Z">
+<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: X -- Z">
+<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="slib_19.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_10.html#SEC293"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> &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.html#SEC_Top"> &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 ALIGN="Left">Procedure and Macro Index: X -- Z</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_X"></A>X</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX626"><CODE>x-axis</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1485"><CODE>xcons</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX837"><CODE>xRGB-&gt;CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX763"><CODE>xrgb-&gt;color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX839"><CODE>xRGB-&gt;sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX799"><CODE>xyY-&gt;XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX800"><CODE>xyY:normalize-colors</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX801"><CODE>xyY:normalize-colors</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX794"><CODE>XYZ-&gt;chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX798"><CODE>XYZ-&gt;xyY</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX792"><CODE>XYZ:normalize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX793"><CODE>XYZ:normalize-colors</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_Y"></A>Y</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX625"><CODE>y-axis</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_Z"></A>Z</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX879"><CODE>zenith-xyy</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1525"><CODE>zip</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P>
+
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> &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>
diff --git a/slib_2.html b/slib_2.html
new file mode 100644
index 0000000..ef8c059
--- /dev/null
+++ b/slib_2.html
@@ -0,0 +1,824 @@
+<!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: Universal SLIB Procedures</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Universal SLIB Procedures">
+<META NAME="keywords" CONTENT="SLIB: Universal SLIB Procedures">
+<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="SEC13"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC12"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC14"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> &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_3.html#SEC21"> &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> 2. Universal SLIB Procedures </H1>
+<!--docid::SEC13::-->
+<P>
+
+The procedures described in these sections are supported by all
+implementations as part of the `<SAMP>*.init</SAMP>' files or by
+`<TT>require.scm</TT>'.
+</P>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Pathname Management</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Characteristics of Scheme Implementation</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Things not provided by the Scheme specs.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC17">2.4 System</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">LOADing, EVALing, ERRORing, and EXITing</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC18">2.5 Miscellany</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Vicinity"></A>
+<HR SIZE="6">
+<A NAME="SEC14"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC15"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &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> 2.1 Vicinity </H2>
+<!--docid::SEC14::-->
+<P>
+
+A vicinity is a descriptor for a place in the file system. Vicinities
+hide from the programmer the concepts of host, volume, directory, and
+version. Vicinities express only the concept of a file environment
+where a file name can be resolved to a file in a system independent
+manner. Vicinities can even be used on <EM>flat</EM> file systems (which
+have no directory structure) by having the vicinity express constraints
+on the file name. On most systems a vicinity would be a string. All of
+these procedures are file system dependent.
+</P>
+<P>
+
+These procedures are provided by all implementations.
+</P>
+<P>
+
+<A NAME="IDX56"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-vicinity</B> <I>dirpath</I>
+<DD>Returns <VAR>dirpath</VAR> as a vicinity for use as first argument to
+<CODE>in-vicinity</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX57"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>pathname-&gt;vicinity</B> <I>path</I>
+<DD>Returns the vicinity containing <VAR>path</VAR>.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(pathname-&gt;vicinity &quot;/usr/local/lib/scm/Link.scm&quot;)
+ => &quot;/usr/local/lib/scm/&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX58"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>program-vicinity</B>
+<DD>Returns the vicinity of the currently loading Scheme code. For an
+interpreter this would be the directory containing source code. For a
+compiled system (with multiple files) this would be the directory where
+the object or executable files are. If no file is currently loading it
+the result is undefined. <STRONG>Warning:</STRONG> <CODE>program-vicinity</CODE> can
+return incorrect values if your program escapes back into a
+<CODE>load</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX59"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>library-vicinity</B>
+<DD>Returns the vicinity of the shared Scheme library.
+</DL>
+<P>
+
+<A NAME="IDX60"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>implementation-vicinity</B>
+<DD>Returns the vicinity of the underlying Scheme implementation. This
+vicinity will likely contain startup code and messages and a compiler.
+</DL>
+<P>
+
+<A NAME="IDX61"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>user-vicinity</B>
+<DD>Returns the vicinity of the current directory of the user. On most
+systems this is `<TT>&quot;&quot;</TT>' (the empty string).
+</DL>
+<P>
+
+<A NAME="IDX62"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>home-vicinity</B>
+<DD>Returns the vicinity of the user's <EM>HOME</EM> directory, the directory
+<A NAME="IDX63"></A>
+which typically contains files which customize a computer environment
+for a user. If scheme is running without a user (eg. a daemon) or if
+this concept is meaningless for the platform, then <CODE>home-vicinity</CODE>
+returns <CODE>#f</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX64"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>vicinity:suffix?</B> <I>chr</I>
+<DD>Returns the `<SAMP>#t</SAMP>' if <VAR>chr</VAR> is a vicinity suffix character; and
+<CODE>#f</CODE> otherwise. Typical vicinity suffixes are `<SAMP>/</SAMP>',
+`<SAMP>:</SAMP>', and `<SAMP>\</SAMP>',
+</DL>
+<P>
+
+<A NAME="IDX65"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>in-vicinity</B> <I>vicinity filename</I>
+<DD>Returns a filename suitable for use by <CODE>slib:load</CODE>,
+<CODE>slib:load-source</CODE>, <CODE>slib:load-compiled</CODE>,
+<CODE>open-input-file</CODE>, <CODE>open-output-file</CODE>, etc. The returned
+filename is <VAR>filename</VAR> in <VAR>vicinity</VAR>. <CODE>in-vicinity</CODE> should
+allow <VAR>filename</VAR> to override <VAR>vicinity</VAR> when <VAR>filename</VAR> is
+an absolute pathname and <VAR>vicinity</VAR> is equal to the value of
+<CODE>(user-vicinity)</CODE>. The behavior of <CODE>in-vicinity</CODE> when
+<VAR>filename</VAR> is absolute and <VAR>vicinity</VAR> is not equal to the value
+of <CODE>(user-vicinity)</CODE> is unspecified. For most systems
+<CODE>in-vicinity</CODE> can be <CODE>string-append</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX66"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>sub-vicinity</B> <I>vicinity name</I>
+<DD>Returns the vicinity of <VAR>vicinity</VAR> restricted to <VAR>name</VAR>. This
+is used for large systems where names of files in subsystems could
+conflict. On systems with directory structure <CODE>sub-vicinity</CODE> will
+return a pathname of the subdirectory <VAR>name</VAR> of
+<VAR>vicinity</VAR>.
+</DL>
+<P>
+
+<A NAME="Configuration"></A>
+<HR SIZE="6">
+<A NAME="SEC15"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC14"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC16"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &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> 2.2 Configuration </H2>
+<!--docid::SEC15::-->
+<P>
+
+These constants and procedures describe characteristics of the Scheme
+and underlying operating system. They are provided by all
+implementations.
+</P>
+<P>
+
+<A NAME="IDX67"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>char-code-limit</B>
+<DD>An integer 1 larger that the largest value which can be returned by
+<CODE>char-&gt;integer</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX68"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>most-positive-fixnum</B>
+<DD>In implementations which support integers of practically unlimited size,
+<VAR>most-positive-fixnum</VAR> is a large exact integer within the range of
+exact integers that may result from computing the length of a list,
+vector, or string.
+<P>
+
+In implementations which do not support integers of practically
+unlimited size, <VAR>most-positive-fixnum</VAR> is the largest exact integer
+that may result from computing the length of a list, vector, or string.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX69"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>slib:tab</B>
+<DD>The tab character.
+</DL>
+<P>
+
+<A NAME="IDX70"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>slib:form-feed</B>
+<DD>The form-feed character.
+</DL>
+<P>
+
+<A NAME="IDX71"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>software-type</B>
+<DD>Returns a symbol denoting the generic operating system type. For
+instance, <CODE>unix</CODE>, <CODE>vms</CODE>, <CODE>macos</CODE>, <CODE>amiga</CODE>, or
+<CODE>ms-dos</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX72"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>slib:report-version</B>
+<DD>Displays the versions of SLIB and the underlying Scheme implementation
+and the name of the operating system. An unspecified value is returned.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(slib:report-version) => slib &quot;3a1&quot; on scm &quot;5b1&quot; on unix
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX73"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>slib:report</B>
+<DD>Displays the information of <CODE>(slib:report-version)</CODE> followed by
+almost all the information neccessary for submitting a problem report.
+An unspecified value is returned.
+<P>
+
+<A NAME="IDX74"></A>
+<DT><U>Function:</U> <B>slib:report</B> <I>#t</I>
+<DD>provides a more verbose listing.
+</P>
+<P>
+
+<A NAME="IDX75"></A>
+<DT><U>Function:</U> <B>slib:report</B> <I>filename</I>
+<DD>Writes the report to file `<TT>filename</TT>'.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(slib:report)
+=>
+slib &quot;3a1&quot; on scm &quot;5b1&quot; on unix
+(implementation-vicinity) is &quot;/usr/local/lib/scm/&quot;
+(library-vicinity) is &quot;/usr/local/lib/slib/&quot;
+(scheme-file-suffix) is &quot;.scm&quot;
+loaded *features* :
+ trace alist qp sort
+ common-list-functions macro values getopt
+ compiled
+implementation *features* :
+ bignum complex real rational
+ inexact vicinity ed getenv
+ tmpnam abort transcript with-file
+ ieee-p1178 r4rs rev4-optional-procedures hash
+ object-hash delay eval dynamic-wind
+ multiarg-apply multiarg/and- logical defmacro
+ string-port source current-time record
+ rev3-procedures rev2-procedures sun-dl string-case
+ array dump char-ready? full-continuation
+ system
+implementation *catalog* :
+ (i/o-extensions compiled &quot;/usr/local/lib/scm/ioext.so&quot;)
+ ...
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Input/Output"></A>
+<HR SIZE="6">
+<A NAME="SEC16"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC15"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC17"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &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> 2.3 Input/Output </H2>
+<!--docid::SEC16::-->
+<P>
+
+These procedures are provided by all implementations.
+</P>
+<P>
+
+<A NAME="IDX76"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>file-exists?</B> <I>filename</I>
+<DD>Returns <CODE>#t</CODE> if the specified file exists. Otherwise, returns
+<CODE>#f</CODE>. If the underlying implementation does not support this
+feature then <CODE>#f</CODE> is always returned.
+</DL>
+<P>
+
+<A NAME="IDX77"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>delete-file</B> <I>filename</I>
+<DD>Deletes the file specified by <VAR>filename</VAR>. If <VAR>filename</VAR> can not
+be deleted, <CODE>#f</CODE> is returned. Otherwise, <CODE>#t</CODE> is
+returned.
+</DL>
+<P>
+
+<A NAME="IDX78"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>open-file</B> <I>filename modes</I>
+<DD><VAR>filename</VAR> should be a string naming a file. <CODE>open-file</CODE>
+returns a port depending on the symbol <VAR>modes</VAR>:
+<P>
+
+</P>
+<DL COMPACT>
+<DT>r
+<DD>an input port capable of delivering characters from the file.
+<DT>rb
+<DD>a <EM>binary</EM> input port capable of delivering characters from the file.
+<DT>w
+<DD>an output port capable of writing characters to a new file by that name.
+<DT>wb
+<DD>a <EM>binary</EM> output port capable of writing characters to a new file
+by that name.
+</DL>
+<P>
+
+If an implementation does not distinguish between binary and non-binary
+files, then it must treat rb as r and wb as w.
+</P>
+<P>
+
+If the file cannot be opened, either #f is returned or an error is
+signalled. For output, if a file with the given name already exists,
+the effect is unspecified.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX79"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>port?</B> <I>obj</I>
+<DD>Returns <TT>#t</TT> if <VAR>obj</VAR> is an input or output port, otherwise
+returns <TT>#f</TT>.
+</DL>
+<P>
+
+<A NAME="IDX80"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>close-port</B> <I>port</I>
+<DD>Closes the file associated with <VAR>port</VAR>, rendering the <VAR>port</VAR>
+incapable of delivering or accepting characters.
+<P>
+
+<CODE>close-file</CODE> has no effect if the file has already been closed.
+The value returned is unspecified.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX81"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>call-with-open-ports</B> <I>proc ports <small>...</small></I>
+<DD><A NAME="IDX82"></A>
+<DT><U>Function:</U> <B>call-with-open-ports</B> <I>ports <small>...</small> proc</I>
+<DD><VAR>Proc</VAR> should be a procedure that accepts as many arguments as there
+are <VAR>ports</VAR> passed to <CODE>call-with-open-ports</CODE>.
+<CODE>call-with-open-ports</CODE> calls <VAR>proc</VAR> with <VAR>ports</VAR> <small>...</small>.
+If <VAR>proc</VAR> returns, then the ports are closed automatically and the
+value yielded by the <VAR>proc</VAR> is returned. If <VAR>proc</VAR> does not
+return, then the ports will not be closed automatically unless it is
+possible to prove that the ports will never again be used for a read or
+write operation.
+</DL>
+<P>
+
+<A NAME="IDX83"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tmpnam</B>
+<DD>Returns a pathname for a file which will likely not be used by any other
+process. Successive calls to <CODE>(tmpnam)</CODE> will return different
+pathnames.
+</DL>
+<P>
+
+<A NAME="IDX84"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>current-error-port</B>
+<DD>Returns the current port to which diagnostic and error output is
+directed.
+</DL>
+<P>
+
+<A NAME="IDX85"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>force-output</B>
+<DD><A NAME="IDX86"></A>
+<DT><U>Procedure:</U> <B>force-output</B> <I>port</I>
+<DD>Forces any pending output on <VAR>port</VAR> to be delivered to the output
+device 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>.
+</DL>
+<P>
+
+<A NAME="IDX87"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>output-port-width</B>
+<DD><A NAME="IDX88"></A>
+<DT><U>Function:</U> <B>output-port-width</B> <I>port</I>
+<DD><P>
+
+Returns the width of <VAR>port</VAR>, which defaults to
+<CODE>(current-output-port)</CODE> if absent. If the width cannot be
+determined 79 is returned.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX89"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>output-port-height</B>
+<DD><A NAME="IDX90"></A>
+<DT><U>Function:</U> <B>output-port-height</B> <I>port</I>
+<DD><P>
+
+Returns the height of <VAR>port</VAR>, which defaults to
+<CODE>(current-output-port)</CODE> if absent. If the height cannot be
+determined 24 is returned.
+</P>
+</DL>
+<P>
+
+<A NAME="System"></A>
+<HR SIZE="6">
+<A NAME="SEC17"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC16"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC18"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &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> 2.4 System </H2>
+<!--docid::SEC17::-->
+<P>
+
+These procedures are provided by all implementations.
+</P>
+<P>
+
+<A NAME="IDX91"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>slib:load-source</B> <I>name</I>
+<DD>Loads a file of Scheme source code from <VAR>name</VAR> with the default
+filename extension used in SLIB. For instance if the filename extension
+used in SLIB is `<TT>.scm</TT>' then <CODE>(slib:load-source &quot;foo&quot;)</CODE> will
+load from file `<TT>foo.scm</TT>'.
+</DL>
+<P>
+
+<A NAME="IDX92"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>slib:load-compiled</B> <I>name</I>
+<DD>On implementations which support separtely loadable compiled modules,
+loads a file of compiled code from <VAR>name</VAR> with the implementation's
+filename extension for compiled code appended.
+</DL>
+<P>
+
+<A NAME="IDX93"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>slib:load</B> <I>name</I>
+<DD>Loads a file of Scheme source or compiled code from <VAR>name</VAR> with the
+appropriate suffixes appended. If both source and compiled code are
+present with the appropriate names then the implementation will load
+just one. It is up to the implementation to choose which one will be
+loaded.
+<P>
+
+If an implementation does not support compiled code then
+<CODE>slib:load</CODE> will be identical to <CODE>slib:load-source</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX94"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>slib:eval</B> <I>obj</I>
+<DD><CODE>eval</CODE> returns the value of <VAR>obj</VAR> evaluated in the current top
+level environment. <A HREF="slib_7.html#SEC246">7.4.11 Eval</A> provides a more general evaluation
+facility.
+</DL>
+<P>
+
+<A NAME="IDX95"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>slib:eval-load</B> <I>filename eval</I>
+<DD><VAR>filename</VAR> should be a string. If filename names an existing file,
+the Scheme source code expressions and definitions are read from the
+file and <VAR>eval</VAR> called with them sequentially. The
+<CODE>slib:eval-load</CODE> procedure does not affect the values returned by
+<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX96"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>slib:warn</B> <I>arg1 arg2 <small>...</small></I>
+<DD>Outputs a warning message containing the arguments.
+</DL>
+<P>
+
+<A NAME="IDX97"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>slib:error</B> <I>arg1 arg2 <small>...</small></I>
+<DD>Outputs an error message containing the arguments, aborts evaluation of
+the current form and responds in a system dependent way to the error.
+Typical responses are to abort the program or to enter a read-eval-print
+loop.
+</DL>
+<P>
+
+<A NAME="IDX98"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>slib:exit</B> <I>n</I>
+<DD><A NAME="IDX99"></A>
+<DT><U>Procedure:</U> <B>slib:exit</B>
+<DD>Exits from the Scheme session returning status <VAR>n</VAR> to the system.
+If <VAR>n</VAR> is omitted or <CODE>#t</CODE>, a success status is returned to the
+system (if possible). If <VAR>n</VAR> is <CODE>#f</CODE> a failure is returned to
+the system (if possible). If <VAR>n</VAR> is an integer, then <VAR>n</VAR> is
+returned to the system (if possible). If the Scheme session cannot exit
+an unspecified value is returned from <CODE>slib:exit</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX100"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>browse-url</B> <I>url</I>
+<DD>Web browsers have become so ubiquitous that programming languagues
+should support a uniform interface to them.
+<P>
+
+If a `<SAMP>netscape</SAMP>' browser is running, <CODE>browse-url</CODE> causes the
+browser to display the page specified by string <VAR>url</VAR> and returns
+#t.
+</P>
+<P>
+
+If the browser is not running, <CODE>browse-url</CODE> starts a browser
+displaying the argument <VAR>url</VAR>. If the browser starts as a
+background job, <CODE>browse-url</CODE> returns #t immediately; if the
+browser starts as a foreground job, then <CODE>browse-url</CODE> returns #t
+when the browser exits; otherwise it returns #f.
+</P>
+</DL>
+<P>
+
+<A NAME="Miscellany"></A>
+<HR SIZE="6">
+<A NAME="SEC18"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC17"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC19"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &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> 2.5 Miscellany </H2>
+<!--docid::SEC18::-->
+<P>
+
+These procedures are provided by all implementations.
+</P>
+<P>
+
+<A NAME="IDX101"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>identity</B> <I>x</I>
+<DD><VAR>identity</VAR> returns its argument.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(identity 3)
+ => 3
+(identity '(foo bar))
+ => (foo bar)
+(map identity <VAR>lst</VAR>)
+ == (copy-list <VAR>lst</VAR>)
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC19"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC18"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC20"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &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> 2.5.1 Mutual Exclusion </H3>
+<!--docid::SEC19::-->
+<P>
+
+An <EM>exchanger</EM> is a procedure of one argument regulating mutually
+<A NAME="IDX102"></A>
+exclusive access to a resource. When a exchanger is called, its current
+content is returned, while being replaced by its argument in an atomic
+operation.
+</P>
+<P>
+
+<A NAME="IDX103"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-exchanger</B> <I>obj</I>
+<DD><P>
+
+Returns a new exchanger with the argument <VAR>obj</VAR> as its initial
+content.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define queue (make-exchanger (list a)))
+</pre></td></tr></table><P>
+
+A queue implemented as an exchanger holding a list can be protected from
+reentrant execution thus:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (pop queue)
+ (let ((lst #f))
+ (dynamic-wind
+ (lambda () (set! lst (queue #f)))
+ (lambda () (and lst (not (null? lst))
+ (let ((ret (car lst)))
+ (set! lst (cdr lst))
+ ret)))
+ (lambda () (and lst (queue lst))))))
+
+(pop queue) => a
+
+(pop queue) => #f
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC20"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC19"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &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> 2.5.2 Legacy </H3>
+<!--docid::SEC20::-->
+<P>
+
+The following procedures were present in Scheme until R4RS
+(see section `Language changes' in <CITE>Revised(4) Scheme</CITE>).
+They are provided by all SLIB implementations.
+</P>
+<P>
+
+<A NAME="IDX104"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>t</B>
+<DD>Derfined as <CODE>#t</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX105"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>nil</B>
+<DD>Defined as <CODE>#f</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX106"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>last-pair</B> <I>l</I>
+<DD>Returns the last pair in the list <VAR>l</VAR>. Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(last-pair (cons 1 2))
+ => (1 . 2)
+(last-pair '(1 2))
+ => (2)
+ == (cons 2 '())
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Scheme Syntax Extension Packages"></A>
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &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>
diff --git a/slib_20.html b/slib_20.html
new file mode 100644
index 0000000..ab7663e
--- /dev/null
+++ b/slib_20.html
@@ -0,0 +1,294 @@
+<!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: Concept and Feature Index: F -- P</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Concept and Feature Index: F -- P">
+<META NAME="keywords" CONTENT="SLIB: Concept and Feature Index: F -- P">
+<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="slib_20.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> &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 ALIGN="Left">Concept and Feature Index: F -- P</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_F"></A>F</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX524"><CODE>factor</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX9"><CODE>feature</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1651"><CODE>feature</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC291">8.5 About this manual</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX557"><CODE>fft</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX402">File Transfer Protocol</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1616">file-lock</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1617">file-lock</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX259"><CODE>filename</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX154"><CODE>fluid-let</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC39">3.7 Fluid-Let</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX311">form</A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX210"><CODE>format</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_G"></A>G</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX726">gamut</A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX407"><CODE>generic-write</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC79">4.11.1 Generic-Write</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX406">getit</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX230"><CODE>getopt</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX235"><CODE>getopt</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX981"><CODE>getopt</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX256"><CODE>getopt-parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX979"><CODE>getopt-parameters</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX260"><CODE>glob</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX293"><CODE>glob</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX501">Gray code</A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1648"><CODE>Guile</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_H"></A>H</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1347"><CODE>hash</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1240"><CODE>hash-table</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1353">Hilbert</A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1351"><CODE>hilbert-fill</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX23">HOME</A></TD><TD valign=top><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX63">HOME</A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX33">homecat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX366"><CODE>html-for-each</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX294"><CODE>html-form</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX351"><CODE>http</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX750">Hue</A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_I"></A>I</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX757"><CODE>ICC Profile</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX30">implcat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1190">indexed-sequential-access-method</A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX176"><CODE>infix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX52">Info</A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX182"><CODE>inmatchfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1639">install</A></TD><TD valign=top><A HREF="slib_8.html#SEC278">8.1 Installation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1640">installation</A></TD><TD valign=top><A HREF="slib_8.html#SEC278">8.1 Installation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX3">intrinsic feature</A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX950">ISAM</A></TD><TD valign=top><A HREF="slib_6.html#SEC151">6.1.2.4 Indexed Sequential Access Methods</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_L"></A>L</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX734"><CODE>L*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX747"><CODE>L*C*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX741"><CODE>L*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX197">Left Denotation, led</A></TD><TD valign=top><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX735">Lightness</A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX748">Lightness</A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1402"><CODE>line-i</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1484">list-processing library</A></TD><TD valign=top><A HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1061"><CODE>load-option</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX476"><CODE>logical</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC89">5.1 Bit-Twiddling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX477"><CODE>logical</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC89">5.1 Bit-Twiddling</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_M"></A>M</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX116"><CODE>macro</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1557"><CODE>macro</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX120"><CODE>macro-by-example</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC25">3.3 Macro by Example</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX123"><CODE>macros-that-work</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX37"><CODE>manifest</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1025">match</A></TD><TD valign=top><A HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX942">match-keys</A></TD><TD valign=top><A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1024">match-keys</A></TD><TD valign=top><A HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX181"><CODE>matchfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1197"><CODE>matfile</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1198"><CODE>matlab</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1417"><CODE>metric-units</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC231">7.3.6 Metric Units</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX891"><CODE>minimize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC135">5.11 Minimizing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX221">minimum field width (<CODE>printf</CODE>)</A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1647"><CODE>MIT Scheme</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX31">mkimpcat.scm</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX28">mklibcat.scm</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX509"><CODE>modular</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1455"><CODE>multiarg</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1458"><CODE>multiarg-apply</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC242">7.4.7 Multi-argument Apply</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1646"><CODE>MzScheme</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_N"></A>N</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX177"><CODE>nary</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX25">new-catalog</A></TD><TD valign=top><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX174"><CODE>nofix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX343">null</A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX196">Null Denotation, nud</A></TD><TD valign=top><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_O"></A>O</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1250"><CODE>object</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC197">7.1.12 Macroless Object System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1259"><CODE>object</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC200">7.1.15 Examples</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1260"><CODE>object</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC203">7.1.15.3 Inverter code</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX409"><CODE>object-&gt;string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX156"><CODE>oop</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC40">3.8 Yasos</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1060">option, run-time-loadable</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX245">options file</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX246">options file</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_P"></A>P</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX247"><CODE>parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX291"><CODE>parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX980"><CODE>parameters</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX170"><CODE>parse</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC46">4.1 Precedence Parsing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1205">pbm</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1206">pbm-raw</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1352">Peano</A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1355">Peano-Hilbert Space-Filling Curve</A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1207">pgm</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1208">pgm-raw</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX298">plain-text</A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1644"><CODE>PLT Scheme</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1202"><CODE>pnm</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1204">portable bitmap graphics</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1212">portable bitmap graphics</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1214">portable bitmap graphics</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX440"><CODE>posix-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX178"><CODE>postfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1209">ppm</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1210">ppm-raw</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX417"><CODE>pprint-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX422"><CODE>pprint-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX308">PRE</A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX171"><CODE>precedence</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC46">4.1 Precedence Parsing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX222">precision (<CODE>printf</CODE>)</A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX175"><CODE>prefix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX179"><CODE>prestfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX412"><CODE>pretty-print</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX525"><CODE>primes</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX215"><CODE>printf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1261"><CODE>priority-queue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX534">PRNG</A></TD><TD valign=top><A HREF="slib_5.html#SEC97">5.4 Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1411"><CODE>process</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1464"><CODE>promise</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> &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>
diff --git a/slib_21.html b/slib_21.html
new file mode 100644
index 0000000..7dae586
--- /dev/null
+++ b/slib_21.html
@@ -0,0 +1,271 @@
+<!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: Concept and Feature Index: Q -- U</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Concept and Feature Index: Q -- U">
+<META NAME="keywords" CONTENT="SLIB: Concept and Feature Index: Q -- U">
+<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="slib_21.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_22.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_22.html"> &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 ALIGN="Left">Concept and Feature Index: Q -- U</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_Q"></A>Q</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX237"><CODE>qp</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC63">4.4.2 Getopt---</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1559"><CODE>qp</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX360">query-string</A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX363">query-string</A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1266"><CODE>queue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_R"></A>R</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1419"><CODE>r2rs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1421"><CODE>r3rs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1649"><CODE>r3rs</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC285">8.3 Coding Guidelines</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1423"><CODE>r4rs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1425"><CODE>r5rs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX535"><CODE>random</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX544"><CODE>random-inexact</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX590">range</A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX591">range</A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1460"><CODE>rationalize</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX238"><CODE>read-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1279"><CODE>record</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX607">rectangle</A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX917"><CODE>relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC141">6.1 Relational Database</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX921">relational-system</A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX150"><CODE>repl</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1554"><CODE>repl</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1558"><CODE>repl</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX862">Resene</A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX866"><CODE>resene</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC132">The Short List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX322">reset</A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1433"><CODE>rev2-procedures</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1446"><CODE>rev4-optional-procedures</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX730"><CODE>RGB709</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX895">ring, commutative</A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX533">RNG</A></TD><TD valign=top><A HREF="slib_5.html#SEC97">5.4 Random Numbers</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX883"><CODE>root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1059">run-time-loadable option</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX999"><CODE>rwb-isam</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_S"></A>S</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX864"><CODE>saturate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC132">The Short List</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX223"><CODE>scanf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX398">scheme</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1480">Scheme Request For Implementation</A></TD><TD valign=top><A HREF="slib_7.html#SEC248">7.4.13 SRFI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1643"><CODE>Scheme48</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX471"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1641"><CODE>SCM</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX898"><CODE>self-set</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1376">Sequence Comparison</A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX387">Server-based Naming Authority</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX2">session</A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1057">sets, using binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX243">shell</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1358"><CODE>sierpinski</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC221">7.2.7.2 Sierpinski Curve</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX29">sitecat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX32">sitecat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX871"><CODE>sky</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX27">slibcat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX634"><CODE>solid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX635"><CODE>solid-modeling</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX633"><CODE>solids</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1336"><CODE>sort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1360"><CODE>soundex</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC222">7.2.8 Soundex</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX14">source</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1354">Space-Filling</A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1199">sparse</A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX770">Spectral Tristimulus Values</A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1378">spiff</A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1479"><CODE>srfi</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC248">7.4.13 SRFI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1483">SRFI-1</A></TD><TD valign=top><A HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1482"><CODE>srfi-1</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1548"><CODE>srfi-2</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC260">7.4.13.2 SRFI-2</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1550"><CODE>srfi-8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC261">7.4.13.3 SRFI-8</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1552"><CODE>srfi-9</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC262">7.4.13.4 SRFI-9</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX756"><CODE>sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX211"><CODE>stdio</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC55">4.3.1 stdio</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1388"><CODE>string-case</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1399"><CODE>string-port</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC228">7.3.3 String Ports</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1362"><CODE>string-search</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1131"><CODE>subarray</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX870"><CODE>sun</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX869"><CODE>sunlight</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX516">symmetric</A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX130"><CODE>syntactic-closures</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX173">syntax tree</A></TD><TD valign=top><A HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX142"><CODE>syntax-case</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX149"><CODE>syntax-case</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX151"><CODE>syntax-case</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_T"></A>T</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX424">time</A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX430"><CODE>time-zone</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX48">top-level variable references</A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX47"><CODE>top-refs</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1342"><CODE>topological-sort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1584"><CODE>trace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1615"><CODE>transact</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC271">7.6.2 Transactions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1430"><CODE>transcript</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC238">7.4.3 Transcripts</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1324"><CODE>tree</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1051">trees, balanced binary</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX723">tristimulus</A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX724">tristimulus</A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1343"><CODE>tsort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1346"><CODE>tsort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX875">turbidity</A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX429"><CODE>TZ-string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_U"></A>U</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX372">Uniform Resource Identifiers</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX404">Uniform Resource Locator</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX899">Unique Factorization</A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX392">unsafe</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX371"><CODE>uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX359">URI</A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX362">URI</A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX390">URI</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX34">usercat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX446">UTC</A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_22.html"> &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>
diff --git a/slib_22.html b/slib_22.html
new file mode 100644
index 0000000..6be8cda
--- /dev/null
+++ b/slib_22.html
@@ -0,0 +1,180 @@
+<!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: Concept and Feature Index: V -- Y</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Concept and Feature Index: V -- Y">
+<META NAME="keywords" CONTENT="SLIB: Concept and Feature Index: V -- Y">
+<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="slib_22.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt; ]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> &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 ALIGN="Left">Concept and Feature Index: V -- Y</H2>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_V"></A>V</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1476"><CODE>values</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC247">7.4.12 Values</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX49">variable references</A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX54"><CODE>vet</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC12">1.6.5 Module Analysis</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1642"><CODE>VSCM</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_W"></A>W</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX998">WB</A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX996"><CODE>wb-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1054">weight-balanced binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX860">wget</A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX719">white point</A></TD><TD valign=top><A HREF="slib_5.html#SEC121">5.9.1.2 White</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX720">white point</A></TD><TD valign=top><A HREF="slib_5.html#SEC121">5.9.1.2 White</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1026">wild-card</A></TD><TD valign=top><A HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1427"><CODE>with-file</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC237">7.4.2 With-File</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1619">Word</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1050"><CODE>wt-tree</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_X"></A>X</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX760"><CODE>xRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX797">xyY</A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="cp_Y"></A>Y</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX157"><CODE>yasos</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC40">3.8 Yasos</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+</td></tr></table><P>
+
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> &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>
diff --git a/slib_3.html b/slib_3.html
new file mode 100644
index 0000000..0f0e6e9
--- /dev/null
+++ b/slib_3.html
@@ -0,0 +1,2013 @@
+<!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: Scheme Syntax Extension Packages</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Scheme Syntax Extension Packages">
+<META NAME="keywords" CONTENT="SLIB: Scheme Syntax Extension 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="SEC21"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC20"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC22"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> &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_4.html#SEC45"> &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> 3. Scheme Syntax Extension Packages </H1>
+<!--docid::SEC21::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Supported by all implementations</TD></TR>
+<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP">
+</TH></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'macro</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC25">3.3 Macro by Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'macro-by-example</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'macros-that-work</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'syntactic-closures</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'syntax-case</TD></TR>
+<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP">
+</TH></TR>
+<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP">Syntax extensions (macros) included with SLIB.
+</TH></TR>
+<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP">
+</TH></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC39">3.7 Fluid-Let</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'fluid-let</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC40">3.8 Yasos</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'yasos, 'oop, 'collect</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Defmacro"></A>
+<HR SIZE="6">
+<A NAME="SEC22"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC23"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.1 Defmacro </H2>
+<!--docid::SEC22::-->
+<P>
+
+Defmacros are supported by all implementations.
+</P>
+<P>
+
+<A NAME="IDX107"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>gentemp</B>
+<DD>Returns a new (interned) symbol each time it is called. The symbol
+names are implementation-dependent
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(gentemp) => scm:G0
+(gentemp) => scm:G1
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX108"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>defmacro:eval</B> <I>e</I>
+<DD>Returns the <CODE>slib:eval</CODE> of expanding all defmacros in scheme
+expression <VAR>e</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX109"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>defmacro:load</B> <I>filename</I>
+<DD><VAR>filename</VAR> should be a string. If filename names an existing file,
+the <CODE>defmacro:load</CODE> procedure reads Scheme source code expressions
+and definitions from the file and evaluates them sequentially. These
+source code expressions and definitions may contain defmacro
+definitions. The <CODE>macro:load</CODE> procedure does not affect the values
+returned by <CODE>current-input-port</CODE> and
+<CODE>current-output-port</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX110"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>defmacro?</B> <I>sym</I>
+<DD>Returns <CODE>#t</CODE> if <VAR>sym</VAR> has been defined by <CODE>defmacro</CODE>,
+<CODE>#f</CODE> otherwise.
+</DL>
+<P>
+
+<A NAME="IDX111"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>macroexpand-1</B> <I>form</I>
+<DD><A NAME="IDX112"></A>
+<DT><U>Function:</U> <B>macroexpand</B> <I>form</I>
+<DD>If <VAR>form</VAR> is a macro call, <CODE>macroexpand-1</CODE> will expand the
+macro call once and return it. A <VAR>form</VAR> is considered to be a macro
+call only if it is a cons whose <CODE>car</CODE> is a symbol for which a
+<CODE>defmacro</CODE> has been defined.
+<P>
+
+<CODE>macroexpand</CODE> is similar to <CODE>macroexpand-1</CODE>, but repeatedly
+expands <VAR>form</VAR> until it is no longer a macro call.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX113"></A>
+</P>
+<DL>
+<DT><U>Macro:</U> <B>defmacro</B> <I>name lambda-list form <small>...</small></I>
+<DD>When encountered by <CODE>defmacro:eval</CODE>, <CODE>defmacro:macroexpand*</CODE>,
+or <CODE>defmacro:load</CODE> defines a new macro which will henceforth be
+expanded when encountered by <CODE>defmacro:eval</CODE>,
+<CODE>defmacro:macroexpand*</CODE>, or <CODE>defmacro:load</CODE>.
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC23"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC22"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC24"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.1.1 Defmacroexpand </H3>
+<!--docid::SEC23::-->
+<CODE>(require 'defmacroexpand)</CODE>
+<A NAME="IDX114"></A>
+<P>
+
+<A NAME="IDX115"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>defmacro:expand*</B> <I>e</I>
+<DD>Returns the result of expanding all defmacros in scheme expression
+<VAR>e</VAR>.
+</DL>
+<P>
+
+<A NAME="R4RS Macros"></A>
+<HR SIZE="6">
+<A NAME="SEC24"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC23"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC25"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.2 R4RS Macros </H2>
+<!--docid::SEC24::-->
+<P>
+
+<CODE>(require 'macro)</CODE> is the appropriate call if you want R4RS
+<A NAME="IDX116"></A>
+high-level macros but don't care about the low level implementation. If
+an SLIB R4RS macro implementation is already loaded it will be used.
+Otherwise, one of the R4RS macros implemetations is loaded.
+</P>
+<P>
+
+The SLIB R4RS macro implementations support the following uniform
+interface:
+</P>
+<P>
+
+<A NAME="IDX117"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>macro:expand</B> <I>sexpression</I>
+<DD>Takes an R4RS expression, macro-expands it, and returns the result of
+the macro expansion.
+</DL>
+<P>
+
+<A NAME="IDX118"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>macro:eval</B> <I>sexpression</I>
+<DD>Takes an R4RS expression, macro-expands it, evals the result of the
+macro expansion, and returns the result of the evaluation.
+</DL>
+<P>
+
+<A NAME="IDX119"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>macro:load</B> <I>filename</I>
+<DD><VAR>filename</VAR> should be a string. If filename names an existing file,
+the <CODE>macro:load</CODE> procedure reads Scheme source code expressions and
+definitions from the file and evaluates them sequentially. These source
+code expressions and definitions may contain macro definitions. The
+<CODE>macro:load</CODE> procedure does not affect the values returned by
+<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>.
+</DL>
+<P>
+
+<A NAME="Macro by Example"></A>
+<HR SIZE="6">
+<A NAME="SEC25"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC24"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC26"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.3 Macro by Example </H2>
+<!--docid::SEC25::-->
+<P>
+
+<CODE>(require 'macro-by-example)</CODE>
+<A NAME="IDX120"></A>
+</P>
+<P>
+
+A vanilla implementation of <CITE>Macro by Example</CITE> (Eugene Kohlbecker,
+R4RS) by Dorai Sitaram, (dorai @ cs.rice.edu) using <CODE>defmacro</CODE>.
+</P>
+<P>
+
+<UL>
+
+<LI>
+generating hygienic global <CODE>define-syntax</CODE> Macro-by-Example macros
+<STRONG>cheaply</STRONG>.
+<P>
+
+</P>
+<LI>
+can define macros which use <CODE>...</CODE>.
+<P>
+
+</P>
+<LI>
+needn't worry about a lexical variable in a macro definition
+clashing with a variable from the macro use context
+<P>
+
+</P>
+<LI>
+don't suffer the overhead of redefining the repl if <CODE>defmacro</CODE>
+natively supported (most implementations)
+<P>
+
+</UL>
+<HR SIZE="6">
+<A NAME="SEC26"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC25"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC27"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.3.1 Caveat </H3>
+<!--docid::SEC26::-->
+These macros are not referentially transparent (see section `Macros' in <CITE>Revised(4) Scheme</CITE>). Lexically scoped macros (i.e., <CODE>let-syntax</CODE>
+and <CODE>letrec-syntax</CODE>) are not supported. In any case, the problem
+of referential transparency gains poignancy only when <CODE>let-syntax</CODE>
+and <CODE>letrec-syntax</CODE> are used. So you will not be courting
+large-scale disaster unless you're using system-function names as local
+variables with unintuitive bindings that the macro can't use. However,
+if you must have the full <CITE>r4rs</CITE> macro functionality, look to the
+more featureful (but also more expensive) versions of syntax-rules
+available in slib <A HREF="slib_3.html#SEC27">3.4 Macros That Work</A>, <A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A>, and
+<A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A>.
+<P>
+
+<A NAME="IDX121"></A>
+</P>
+<DL>
+<DT><U>Macro:</U> <B>define-syntax</B> <I>keyword transformer-spec</I>
+<DD>The <VAR>keyword</VAR> is an identifier, and the <VAR>transformer-spec</VAR>
+should be an instance of <CODE>syntax-rules</CODE>.
+<P>
+
+The top-level syntactic environment is extended by binding the
+<VAR>keyword</VAR> to the specified transformer.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-syntax let*
+ (syntax-rules ()
+ ((let* () body1 body2 ...)
+ (let () body1 body2 ...))
+ ((let* ((name1 val1) (name2 val2) ...)
+ body1 body2 ...)
+ (let ((name1 val1))
+ (let* (( name2 val2) ...)
+ body1 body2 ...)))))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX122"></A>
+</P>
+<DL>
+<DT><U>Macro:</U> <B>syntax-rules</B> <I>literals syntax-rule <small>...</small></I>
+<DD><VAR>literals</VAR> is a list of identifiers, and each <VAR>syntax-rule</VAR>
+should be of the form
+<P>
+
+<CODE>(<VAR>pattern</VAR> <VAR>template</VAR>)</CODE>
+</P>
+<P>
+
+where the <VAR>pattern</VAR> and <VAR>template</VAR> are as in the grammar above.
+</P>
+<P>
+
+An instance of <CODE>syntax-rules</CODE> produces a new macro transformer by
+specifying a sequence of hygienic rewrite rules. A use of a macro whose
+keyword is associated with a transformer specified by
+<CODE>syntax-rules</CODE> is matched against the patterns contained in the
+<VAR>syntax-rule</VAR>s, beginning with the leftmost <VAR>syntax-rule</VAR>.
+When a match is found, the macro use is trancribed hygienically
+according to the template.
+</P>
+<P>
+
+Each pattern begins with the keyword for the macro. This keyword is not
+involved in the matching and is not considered a pattern variable or
+literal identifier.
+</P>
+</DL>
+<P>
+
+<A NAME="Macros That Work"></A>
+<HR SIZE="6">
+<A NAME="SEC27"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC26"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC28"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.4 Macros That Work </H2>
+<!--docid::SEC27::-->
+<P>
+
+<CODE>(require 'macros-that-work)</CODE>
+<A NAME="IDX123"></A>
+</P>
+<P>
+
+<CITE>Macros That Work</CITE> differs from the other R4RS macro
+implementations in that it does not expand derived expression types to
+primitive expression types.
+</P>
+<P>
+
+<A NAME="IDX124"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>macro:expand</B> <I>expression</I>
+<DD><A NAME="IDX125"></A>
+<DT><U>Function:</U> <B>macwork:expand</B> <I>expression</I>
+<DD>Takes an R4RS expression, macro-expands it, and returns the result of
+the macro expansion.
+</DL>
+<P>
+
+<A NAME="IDX126"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>macro:eval</B> <I>expression</I>
+<DD><A NAME="IDX127"></A>
+<DT><U>Function:</U> <B>macwork:eval</B> <I>expression</I>
+<DD><CODE>macro:eval</CODE> returns the value of <VAR>expression</VAR> in the current
+top level environment. <VAR>expression</VAR> can contain macro definitions.
+Side effects of <VAR>expression</VAR> will affect the top level
+environment.
+</DL>
+<P>
+
+<A NAME="IDX128"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>macro:load</B> <I>filename</I>
+<DD><A NAME="IDX129"></A>
+<DT><U>Procedure:</U> <B>macwork:load</B> <I>filename</I>
+<DD><VAR>filename</VAR> should be a string. If filename names an existing file,
+the <CODE>macro:load</CODE> procedure reads Scheme source code expressions and
+definitions from the file and evaluates them sequentially. These source
+code expressions and definitions may contain macro definitions. The
+<CODE>macro:load</CODE> procedure does not affect the values returned by
+<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>.
+</DL>
+<P>
+
+References:
+</P>
+<P>
+
+The <CITE>Revised^4 Report on the Algorithmic Language Scheme</CITE> Clinger
+and Rees [editors]. To appear in LISP Pointers. Also available as a
+technical report from the University of Oregon, MIT AI Lab, and
+Cornell.
+</P>
+<P>
+
+<center>
+ Macros That Work. Clinger and Rees. POPL '91.
+</center>
+</P>
+<P>
+
+The supported syntax differs from the R4RS in that vectors are allowed
+as patterns and as templates and are not allowed as pattern or template
+data.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>transformer spec ==> (syntax-rules literals rules)
+
+rules ==> ()
+ | (rule . rules)
+
+rule ==> (pattern template)
+
+pattern ==> pattern_var ; a symbol not in literals
+ | symbol ; a symbol in literals
+ | ()
+ | (pattern . pattern)
+ | (ellipsis_pattern)
+ | #(pattern*) ; extends R4RS
+ | #(pattern* ellipsis_pattern) ; extends R4RS
+ | pattern_datum
+
+template ==> pattern_var
+ | symbol
+ | ()
+ | (template2 . template2)
+ | #(template*) ; extends R4RS
+ | pattern_datum
+
+template2 ==> template
+ | ellipsis_template
+
+pattern_datum ==> string ; no vector
+ | character
+ | boolean
+ | number
+
+ellipsis_pattern ==> pattern ...
+
+ellipsis_template ==> template ...
+
+pattern_var ==> symbol ; not in literals
+
+literals ==> ()
+ | (symbol . literals)
+</pre></td></tr></table><P>
+
+<HR SIZE="6">
+<A NAME="SEC28"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC27"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC29"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.4.1 Definitions </H3>
+<!--docid::SEC28::-->
+<P>
+
+</P>
+<DL COMPACT>
+
+<DT>Scope of an ellipsis
+<DD>Within a pattern or template, the scope of an ellipsis (<CODE>...</CODE>) is
+the pattern or template that appears to its left.
+<P>
+
+</P>
+<DT>Rank of a pattern variable
+<DD>The rank of a pattern variable is the number of ellipses within whose
+scope it appears in the pattern.
+<P>
+
+</P>
+<DT>Rank of a subtemplate
+<DD>The rank of a subtemplate is the number of ellipses within whose scope
+it appears in the template.
+<P>
+
+</P>
+<DT>Template rank of an occurrence of a pattern variable
+<DD>The template rank of an occurrence of a pattern variable within a
+template is the rank of that occurrence, viewed as a subtemplate.
+<P>
+
+</P>
+<DT>Variables bound by a pattern
+<DD>The variables bound by a pattern are the pattern variables that appear
+within it.
+<P>
+
+</P>
+<DT>Referenced variables of a subtemplate
+<DD>The referenced variables of a subtemplate are the pattern variables that
+appear within it.
+<P>
+
+</P>
+<DT>Variables opened by an ellipsis template
+<DD>The variables opened by an ellipsis template are the referenced pattern
+variables whose rank is greater than the rank of the ellipsis template.
+<P>
+
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC29"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC28"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC30"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.4.2 Restrictions </H3>
+<!--docid::SEC29::-->
+<P>
+
+No pattern variable appears more than once within a pattern.
+</P>
+<P>
+
+For every occurrence of a pattern variable within a template, the
+template rank of the occurrence must be greater than or equal to the
+pattern variable's rank.
+</P>
+<P>
+
+Every ellipsis template must open at least one variable.
+</P>
+<P>
+
+For every ellipsis template, the variables opened by an ellipsis
+template must all be bound to sequences of the same length.
+</P>
+<P>
+
+The compiled form of a <VAR>rule</VAR> is
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>rule ==> (pattern template inserted)
+
+pattern ==> pattern_var
+ | symbol
+ | ()
+ | (pattern . pattern)
+ | ellipsis_pattern
+ | #(pattern)
+ | pattern_datum
+
+template ==> pattern_var
+ | symbol
+ | ()
+ | (template2 . template2)
+ | #(pattern)
+ | pattern_datum
+
+template2 ==> template
+ | ellipsis_template
+
+pattern_datum ==> string
+ | character
+ | boolean
+ | number
+
+pattern_var ==> #(V symbol rank)
+
+ellipsis_pattern ==> #(E pattern pattern_vars)
+
+ellipsis_template ==> #(E template pattern_vars)
+
+inserted ==> ()
+ | (symbol . inserted)
+
+pattern_vars ==> ()
+ | (pattern_var . pattern_vars)
+
+rank ==> exact non-negative integer
+</pre></td></tr></table><P>
+
+where V and E are unforgeable values.
+</P>
+<P>
+
+The pattern variables associated with an ellipsis pattern are the
+variables bound by the pattern, and the pattern variables associated
+with an ellipsis template are the variables opened by the ellipsis
+template.
+</P>
+<P>
+
+If the template contains a big chunk that contains no pattern variables
+or inserted identifiers, then the big chunk will be copied
+unnecessarily. That shouldn't matter very often.
+</P>
+<P>
+
+<A NAME="Syntactic Closures"></A>
+<HR SIZE="6">
+<A NAME="SEC30"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC29"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC31"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.5 Syntactic Closures </H2>
+<!--docid::SEC30::-->
+<P>
+
+<CODE>(require 'syntactic-closures)</CODE>
+<A NAME="IDX130"></A>
+</P>
+<P>
+
+<A NAME="IDX131"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>macro:expand</B> <I>expression</I>
+<DD><A NAME="IDX132"></A>
+<DT><U>Function:</U> <B>synclo:expand</B> <I>expression</I>
+<DD>Returns scheme code with the macros and derived expression types of
+<VAR>expression</VAR> expanded to primitive expression types.
+</DL>
+<P>
+
+<A NAME="IDX133"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>macro:eval</B> <I>expression</I>
+<DD><A NAME="IDX134"></A>
+<DT><U>Function:</U> <B>synclo:eval</B> <I>expression</I>
+<DD><CODE>macro:eval</CODE> returns the value of <VAR>expression</VAR> in the current
+top level environment. <VAR>expression</VAR> can contain macro definitions.
+Side effects of <VAR>expression</VAR> will affect the top level
+environment.
+</DL>
+<P>
+
+<A NAME="IDX135"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>macro:load</B> <I>filename</I>
+<DD><A NAME="IDX136"></A>
+<DT><U>Procedure:</U> <B>synclo:load</B> <I>filename</I>
+<DD><VAR>filename</VAR> should be a string. If filename names an existing file,
+the <CODE>macro:load</CODE> procedure reads Scheme source code expressions and
+definitions from the file and evaluates them sequentially. These
+source code expressions and definitions may contain macro definitions.
+The <CODE>macro:load</CODE> procedure does not affect the values returned by
+<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>.
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC31"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC30"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC32"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.5.1 Syntactic Closure Macro Facility </H3>
+<!--docid::SEC31::-->
+<P>
+
+<center>
+ A Syntactic Closures Macro Facility
+</center>
+<center>
+ by Chris Hanson
+</center>
+<center>
+ 9 November 1991
+</center>
+</P>
+<P>
+
+This document describes <EM>syntactic closures</EM>, a low-level macro
+facility for the Scheme programming language. The facility is an
+alternative to the low-level macro facility described in the
+<CITE>Revised^4 Report on Scheme.</CITE> This document is an addendum to that
+report.
+</P>
+<P>
+
+The syntactic closures facility extends the BNF rule for
+<VAR>transformer spec</VAR> to allow a new keyword that introduces a
+low-level macro transformer:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><VAR>transformer spec</VAR> := (transformer <VAR>expression</VAR>)
+</pre></td></tr></table><P>
+
+Additionally, the following procedures are added:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>make-syntactic-closure
+capture-syntactic-environment
+identifier?
+identifier=?
+</pre></td></tr></table><P>
+
+The description of the facility is divided into three parts. The first
+part defines basic terminology. The second part describes how macro
+transformers are defined. The third part describes the use of
+<EM>identifiers</EM>, which extend the syntactic closure mechanism to be
+compatible with <CODE>syntax-rules</CODE>.
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC32"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC31"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC33"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.5.1.1 Terminology </H4>
+<!--docid::SEC32::-->
+<P>
+
+This section defines the concepts and data types used by the syntactic
+closures facility.
+</P>
+<P>
+
+<UL>
+
+<LI><EM>Forms</EM> are the syntactic entities out of which programs are
+recursively constructed. A form is any expression, any definition, any
+syntactic keyword, or any syntactic closure. The variable name that
+appears in a <CODE>set!</CODE> special form is also a form. Examples of
+forms:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>17
+#t
+car
+(+ x 4)
+(lambda (x) x)
+(define pi 3.14159)
+if
+define
+</pre></td></tr></table><P>
+
+</P>
+<LI>An <EM>alias</EM> is an alternate name for a given symbol. It can
+appear anywhere in a form that the symbol could be used, and when quoted
+it is replaced by the symbol; however, it does not satisfy the predicate
+<CODE>symbol?</CODE>. Macro transformers rarely distinguish symbols from
+aliases, referring to both as identifiers.
+<P>
+
+</P>
+<LI>A <EM>syntactic</EM> environment maps identifiers to their
+meanings. More precisely, it determines whether an identifier is a
+syntactic keyword or a variable. If it is a keyword, the meaning is an
+interpretation for the form in which that keyword appears. If it is a
+variable, the meaning identifies which binding of that variable is
+referenced. In short, syntactic environments contain all of the
+contextual information necessary for interpreting the meaning of a
+particular form.
+<P>
+
+</P>
+<LI>A <EM>syntactic closure</EM> consists of a form, a syntactic
+environment, and a list of identifiers. All identifiers in the form
+take their meaning from the syntactic environment, except those in the
+given list. The identifiers in the list are to have their meanings
+determined later. A syntactic closure may be used in any context in
+which its form could have been used. Since a syntactic closure is also
+a form, it may not be used in contexts where a form would be illegal.
+For example, a form may not appear as a clause in the cond special form.
+A syntactic closure appearing in a quoted structure is replaced by its
+form.
+<P>
+
+</UL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC33"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC32"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC34"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.5.1.2 Transformer Definition </H4>
+<!--docid::SEC33::-->
+<P>
+
+This section describes the <CODE>transformer</CODE> special form and the
+procedures <CODE>make-syntactic-closure</CODE> and
+<CODE>capture-syntactic-environment</CODE>.
+</P>
+<P>
+
+<A NAME="IDX137"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>transformer</B> <I>expression</I>
+<DD><P>
+
+Syntax: It is an error if this syntax occurs except as a
+<VAR>transformer spec</VAR>.
+</P>
+<P>
+
+Semantics: The <VAR>expression</VAR> is evaluated in the standard transformer
+environment to yield a macro transformer as described below. This macro
+transformer is bound to a macro keyword by the special form in which the
+<CODE>transformer</CODE> expression appears (for example,
+<CODE>let-syntax</CODE>).
+</P>
+<P>
+
+A <EM>macro transformer</EM> is a procedure that takes two arguments, a
+form and a syntactic environment, and returns a new form. The first
+argument, the <EM>input form</EM>, is the form in which the macro keyword
+occurred. The second argument, the <EM>usage environment</EM>, is the
+syntactic environment in which the input form occurred. The result of
+the transformer, the <EM>output form</EM>, is automatically closed in the
+<EM>transformer environment</EM>, which is the syntactic environment in
+which the <CODE>transformer</CODE> expression occurred.
+</P>
+<P>
+
+For example, here is a definition of a push macro using
+<CODE>syntax-rules</CODE>:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-syntax push
+ (syntax-rules ()
+ ((push item list)
+ (set! list (cons item list)))))
+</pre></td></tr></table><P>
+
+Here is an equivalent definition using <CODE>transformer</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-syntax push
+ (transformer
+ (lambda (exp env)
+ (let ((item
+ (make-syntactic-closure env '() (cadr exp)))
+ (list
+ (make-syntactic-closure env '() (caddr exp))))
+ `(set! ,list (cons ,item ,list))))))
+</pre></td></tr></table><P>
+
+In this example, the identifiers <CODE>set!</CODE> and <CODE>cons</CODE> are closed
+in the transformer environment, and thus will not be affected by the
+meanings of those identifiers in the usage environment
+<CODE>env</CODE>.
+</P>
+<P>
+
+Some macros may be non-hygienic by design. For example, the following
+defines a loop macro that implicitly binds <CODE>exit</CODE> to an escape
+procedure. The binding of <CODE>exit</CODE> is intended to capture free
+references to <CODE>exit</CODE> in the body of the loop, so <CODE>exit</CODE> must
+be left free when the body is closed:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-syntax loop
+ (transformer
+ (lambda (exp env)
+ (let ((body (cdr exp)))
+ `(call-with-current-continuation
+ (lambda (exit)
+ (let f ()
+ ,@(map (lambda (exp)
+ (make-syntactic-closure env '(exit)
+ exp))
+ body)
+ (f))))))))
+</pre></td></tr></table><P>
+
+To assign meanings to the identifiers in a form, use
+<CODE>make-syntactic-closure</CODE> to close the form in a syntactic
+environment.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX138"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-syntactic-closure</B> <I>environment free-names form</I>
+<DD><P>
+
+<VAR>environment</VAR> must be a syntactic environment, <VAR>free-names</VAR> must
+be a list of identifiers, and <VAR>form</VAR> must be a form.
+<CODE>make-syntactic-closure</CODE> constructs and returns a syntactic closure
+of <VAR>form</VAR> in <VAR>environment</VAR>, which can be used anywhere that
+<VAR>form</VAR> could have been used. All the identifiers used in
+<VAR>form</VAR>, except those explicitly excepted by <VAR>free-names</VAR>, obtain
+their meanings from <VAR>environment</VAR>.
+</P>
+<P>
+
+Here is an example where <VAR>free-names</VAR> is something other than the
+empty list. It is instructive to compare the use of <VAR>free-names</VAR> in
+this example with its use in the <CODE>loop</CODE> example above: the examples
+are similar except for the source of the identifier being left
+free.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-syntax let1
+ (transformer
+ (lambda (exp env)
+ (let ((id (cadr exp))
+ (init (caddr exp))
+ (exp (cadddr exp)))
+ `((lambda (,id)
+ ,(make-syntactic-closure env (list id) exp))
+ ,(make-syntactic-closure env '() init))))))
+</pre></td></tr></table><P>
+
+<CODE>let1</CODE> is a simplified version of <CODE>let</CODE> that only binds a
+single identifier, and whose body consists of a single expression. When
+the body expression is syntactically closed in its original syntactic
+environment, the identifier that is to be bound by <CODE>let1</CODE> must be
+left free, so that it can be properly captured by the <CODE>lambda</CODE> in
+the output form.
+</P>
+<P>
+
+To obtain a syntactic environment other than the usage environment, use
+<CODE>capture-syntactic-environment</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX139"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>capture-syntactic-environment</B> <I>procedure</I>
+<DD><P>
+
+<CODE>capture-syntactic-environment</CODE> returns a form that will, when
+transformed, call <VAR>procedure</VAR> on the current syntactic environment.
+<VAR>procedure</VAR> should compute and return a new form to be transformed,
+in that same syntactic environment, in place of the form.
+</P>
+<P>
+
+An example will make this clear. Suppose we wanted to define a simple
+<CODE>loop-until</CODE> keyword equivalent to
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-syntax loop-until
+ (syntax-rules ()
+ ((loop-until id init test return step)
+ (letrec ((loop
+ (lambda (id)
+ (if test return (loop step)))))
+ (loop init)))))
+</pre></td></tr></table><P>
+
+The following attempt at defining <CODE>loop-until</CODE> has a subtle bug:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-syntax loop-until
+ (transformer
+ (lambda (exp env)
+ (let ((id (cadr exp))
+ (init (caddr exp))
+ (test (cadddr exp))
+ (return (cadddr (cdr exp)))
+ (step (cadddr (cddr exp)))
+ (close
+ (lambda (exp free)
+ (make-syntactic-closure env free exp))))
+ `(letrec ((loop
+ (lambda (,id)
+ (if ,(close test (list id))
+ ,(close return (list id))
+ (loop ,(close step (list id)))))))
+ (loop ,(close init '())))))))
+</pre></td></tr></table><P>
+
+This definition appears to take all of the proper precautions to prevent
+unintended captures. It carefully closes the subexpressions in their
+original syntactic environment and it leaves the <CODE>id</CODE> identifier
+free in the <CODE>test</CODE>, <CODE>return</CODE>, and <CODE>step</CODE> expressions, so
+that it will be captured by the binding introduced by the <CODE>lambda</CODE>
+expression. Unfortunately it uses the identifiers <CODE>if</CODE> and
+<CODE>loop</CODE> within that <CODE>lambda</CODE> expression, so if the user of
+<CODE>loop-until</CODE> just happens to use, say, <CODE>if</CODE> for the
+identifier, it will be inadvertently captured.
+</P>
+<P>
+
+The syntactic environment that <CODE>if</CODE> and <CODE>loop</CODE> want to be
+exposed to is the one just outside the <CODE>lambda</CODE> expression: before
+the user's identifier is added to the syntactic environment, but after
+the identifier loop has been added.
+<CODE>capture-syntactic-environment</CODE> captures exactly that environment
+as follows:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-syntax loop-until
+ (transformer
+ (lambda (exp env)
+ (let ((id (cadr exp))
+ (init (caddr exp))
+ (test (cadddr exp))
+ (return (cadddr (cdr exp)))
+ (step (cadddr (cddr exp)))
+ (close
+ (lambda (exp free)
+ (make-syntactic-closure env free exp))))
+ `(letrec ((loop
+ ,(capture-syntactic-environment
+ (lambda (env)
+ `(lambda (,id)
+ (,(make-syntactic-closure env '() `if)
+ ,(close test (list id))
+ ,(close return (list id))
+ (,(make-syntactic-closure env '()
+ `loop)
+ ,(close step (list id)))))))))
+ (loop ,(close init '())))))))
+</pre></td></tr></table><P>
+
+In this case, having captured the desired syntactic environment, it is
+convenient to construct syntactic closures of the identifiers <CODE>if</CODE>
+and the <CODE>loop</CODE> and use them in the body of the
+<CODE>lambda</CODE>.
+</P>
+<P>
+
+A common use of <CODE>capture-syntactic-environment</CODE> is to get the
+transformer environment of a macro transformer:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(transformer
+ (lambda (exp env)
+ (capture-syntactic-environment
+ (lambda (transformer-env)
+ ...))))
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC34"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC33"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC35"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.5.1.3 Identifiers </H4>
+<!--docid::SEC34::-->
+<P>
+
+This section describes the procedures that create and manipulate
+identifiers. Previous syntactic closure proposals did not have an
+identifier data type -- they just used symbols. The identifier data
+type extends the syntactic closures facility to be compatible with the
+high-level <CODE>syntax-rules</CODE> facility.
+</P>
+<P>
+
+As discussed earlier, an identifier is either a symbol or an
+<EM>alias</EM>. An alias is implemented as a syntactic closure whose
+<EM>form</EM> is an identifier:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(make-syntactic-closure env '() 'a)
+ => an <EM>alias</EM>
+</pre></td></tr></table><P>
+
+Aliases are implemented as syntactic closures because they behave just
+like syntactic closures most of the time. The difference is that an
+alias may be bound to a new value (for example by <CODE>lambda</CODE> or
+<CODE>let-syntax</CODE>); other syntactic closures may not be used this way.
+If an alias is bound, then within the scope of that binding it is looked
+up in the syntactic environment just like any other identifier.
+</P>
+<P>
+
+Aliases are used in the implementation of the high-level facility
+<CODE>syntax-rules</CODE>. A macro transformer created by <CODE>syntax-rules</CODE>
+uses a template to generate its output form, substituting subforms of
+the input form into the template. In a syntactic closures
+implementation, all of the symbols in the template are replaced by
+aliases closed in the transformer environment, while the output form
+itself is closed in the usage environment. This guarantees that the
+macro transformation is hygienic, without requiring the transformer to
+know the syntactic roles of the substituted input subforms.
+</P>
+<P>
+
+<A NAME="IDX140"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>identifier?</B> <I>object</I>
+<DD>Returns <CODE>#t</CODE> if <VAR>object</VAR> is an identifier, otherwise returns
+<CODE>#f</CODE>. Examples:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(identifier? 'a)
+ => #t
+(identifier? (make-syntactic-closure env '() 'a))
+ => #t
+(identifier? &quot;a&quot;)
+ => #f
+(identifier? #\a)
+ => #f
+(identifier? 97)
+ => #f
+(identifier? #f)
+ => #f
+(identifier? '(a))
+ => #f
+(identifier? '#(a))
+ => #f
+</pre></td></tr></table><P>
+
+The predicate <CODE>eq?</CODE> is used to determine if two identifers are
+&quot;the same&quot;. Thus <CODE>eq?</CODE> can be used to compare identifiers
+exactly as it would be used to compare symbols. Often, though, it is
+useful to know whether two identifiers &quot;mean the same thing&quot;. For
+example, the <CODE>cond</CODE> macro uses the symbol <CODE>else</CODE> to identify
+the final clause in the conditional. A macro transformer for
+<CODE>cond</CODE> cannot just look for the symbol <CODE>else</CODE>, because the
+<CODE>cond</CODE> form might be the output of another macro transformer that
+replaced the symbol <CODE>else</CODE> with an alias. Instead the transformer
+must look for an identifier that &quot;means the same thing&quot; in the usage
+environment as the symbol <CODE>else</CODE> means in the transformer
+environment.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX141"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>identifier=?</B> <I>environment1 identifier1 environment2 identifier2</I>
+<DD><VAR>environment1</VAR> and <VAR>environment2</VAR> must be syntactic
+environments, and <VAR>identifier1</VAR> and <VAR>identifier2</VAR> must be
+identifiers. <CODE>identifier=?</CODE> returns <CODE>#t</CODE> if the meaning of
+<VAR>identifier1</VAR> in <VAR>environment1</VAR> is the same as that of
+<VAR>identifier2</VAR> in <VAR>environment2</VAR>, otherwise it returns <CODE>#f</CODE>.
+Examples:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(let-syntax
+ ((foo
+ (transformer
+ (lambda (form env)
+ (capture-syntactic-environment
+ (lambda (transformer-env)
+ (identifier=? transformer-env 'x env 'x)))))))
+ (list (foo)
+ (let ((x 3))
+ (foo))))
+ => (#t #f)
+</pre></td></tr></table><P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(let-syntax ((bar foo))
+ (let-syntax
+ ((foo
+ (transformer
+ (lambda (form env)
+ (capture-syntactic-environment
+ (lambda (transformer-env)
+ (identifier=? transformer-env 'foo
+ env (cadr form))))))))
+ (list (foo foo)
+ (foobar))))
+ => (#f #t)
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC35"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC34"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC36"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.5.1.4 Acknowledgements </H4>
+<!--docid::SEC35::-->
+<P>
+
+The syntactic closures facility was invented by Alan Bawden and Jonathan
+Rees. The use of aliases to implement <CODE>syntax-rules</CODE> was invented
+by Alan Bawden (who prefers to call them <EM>synthetic names</EM>). Much
+of this proposal is derived from an earlier proposal by Alan
+Bawden.
+</P>
+<P>
+
+<A NAME="Syntax-Case Macros"></A>
+<HR SIZE="6">
+<A NAME="SEC36"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC35"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC37"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.6 Syntax-Case Macros </H2>
+<!--docid::SEC36::-->
+<P>
+
+<CODE>(require 'syntax-case)</CODE>
+<A NAME="IDX142"></A>
+</P>
+<P>
+
+<A NAME="IDX143"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>macro:expand</B> <I>expression</I>
+<DD><A NAME="IDX144"></A>
+<DT><U>Function:</U> <B>syncase:expand</B> <I>expression</I>
+<DD>Returns scheme code with the macros and derived expression types of
+<VAR>expression</VAR> expanded to primitive expression types.
+</DL>
+<P>
+
+<A NAME="IDX145"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>macro:eval</B> <I>expression</I>
+<DD><A NAME="IDX146"></A>
+<DT><U>Function:</U> <B>syncase:eval</B> <I>expression</I>
+<DD><CODE>macro:eval</CODE> returns the value of <VAR>expression</VAR> in the current
+top level environment. <VAR>expression</VAR> can contain macro definitions.
+Side effects of <VAR>expression</VAR> will affect the top level
+environment.
+</DL>
+<P>
+
+<A NAME="IDX147"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>macro:load</B> <I>filename</I>
+<DD><A NAME="IDX148"></A>
+<DT><U>Procedure:</U> <B>syncase:load</B> <I>filename</I>
+<DD><VAR>filename</VAR> should be a string. If filename names an existing file,
+the <CODE>macro:load</CODE> procedure reads Scheme source code expressions and
+definitions from the file and evaluates them sequentially. These
+source code expressions and definitions may contain macro definitions.
+The <CODE>macro:load</CODE> procedure does not affect the values returned by
+<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>.
+</DL>
+<P>
+
+This is version 2.1 of <CODE>syntax-case</CODE>, the low-level macro facility
+proposed and implemented by Robert Hieb and R. Kent Dybvig.
+</P>
+<P>
+
+This version is further adapted by Harald Hanche-Olsen
+&lt;hanche @ imf.unit.no&gt; to make it compatible with, and easily usable
+with, SLIB. Mainly, these adaptations consisted of:
+</P>
+<P>
+
+<UL>
+<LI>
+Removing white space from `<TT>expand.pp</TT>' to save space in the
+distribution. This file is not meant for human readers anyway<small>...</small>
+<P>
+
+</P>
+<LI>
+Removed a couple of Chez scheme dependencies.
+<P>
+
+</P>
+<LI>
+Renamed global variables used to minimize the possibility of name
+conflicts.
+<P>
+
+</P>
+<LI>
+Adding an SLIB-specific initialization file.
+<P>
+
+</P>
+<LI>
+Removing a couple extra files, most notably the documentation (but see
+below).
+</UL>
+<P>
+
+If you wish, you can see exactly what changes were done by reading the
+shell script in the file `<TT>syncase.sh</TT>'.
+</P>
+<P>
+
+The two PostScript files were omitted in order to not burden the SLIB
+distribution with them. If you do intend to use <CODE>syntax-case</CODE>,
+however, you should get these files and print them out on a PostScript
+printer. They are available with the original <CODE>syntax-case</CODE>
+distribution by anonymous FTP in
+`<TT>cs.indiana.edu:/pub/scheme/syntax-case</TT>'.
+</P>
+<P>
+
+In order to use syntax-case from an interactive top level, execute:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'syntax-case)
+<A NAME="IDX149"></A>(require 'repl)
+<A NAME="IDX150"></A>(repl:top-level macro:eval)
+</pre></td></tr></table>See the section Repl (see section <A HREF="slib_7.html#SEC264">7.5.1 Repl</A>) for more information.
+<P>
+
+To check operation of syntax-case get
+`<TT>cs.indiana.edu:/pub/scheme/syntax-case</TT>', and type
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'syntax-case)
+<A NAME="IDX151"></A><A NAME="IDX152"></A>(syncase:sanity-check)
+</pre></td></tr></table><P>
+
+Beware that <CODE>syntax-case</CODE> takes a long time to load -- about 20s on
+a SPARCstation SLC (with SCM) and about 90s on a Macintosh SE/30 (with
+Gambit).
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC37"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC36"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC38"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.6.1 Notes </H3>
+<!--docid::SEC37::-->
+<P>
+
+All R4RS syntactic forms are defined, including <CODE>delay</CODE>. Along
+with <CODE>delay</CODE> are simple definitions for <CODE>make-promise</CODE> (into
+which <CODE>delay</CODE> expressions expand) and <CODE>force</CODE>.
+</P>
+<P>
+
+<CODE>syntax-rules</CODE> and <CODE>with-syntax</CODE> (described in <CITE>TR356</CITE>)
+are defined.
+</P>
+<P>
+
+<CODE>syntax-case</CODE> is actually defined as a macro that expands into
+calls to the procedure <CODE>syntax-dispatch</CODE> and the core form
+<CODE>syntax-lambda</CODE>; do not redefine these names.
+</P>
+<P>
+
+Several other top-level bindings not documented in TR356 are created:
+<UL>
+<LI>the &quot;hooks&quot; in `<TT>hooks.ss</TT>'
+<LI>the <CODE>build-</CODE> procedures in `<TT>output.ss</TT>'
+<LI><CODE>expand-syntax</CODE> (the expander)
+</UL>
+<P>
+
+The syntax of define has been extended to allow <CODE>(define <VAR>id</VAR>)</CODE>,
+which assigns <VAR>id</VAR> to some unspecified value.
+</P>
+<P>
+
+We have attempted to maintain R4RS compatibility where possible. The
+incompatibilities should be confined to `<TT>hooks.ss</TT>'. Please let us
+know if there is some incompatibility that is not flagged as such.
+</P>
+<P>
+
+Send bug reports, comments, suggestions, and questions to Kent Dybvig
+(dyb @ iuvax.cs.indiana.edu).
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC38"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC37"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC39"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.6.2 Note from SLIB maintainer </H3>
+<!--docid::SEC38::-->
+<P>
+
+<CODE>(require 'structure)</CODE>
+</P>
+<P>
+
+<A NAME="IDX153"></A>
+Included with the <CODE>syntax-case</CODE> files was `<TT>structure.scm</TT>'
+which defines a macro <CODE>define-structure</CODE>. I have no
+documentation for this macro; it is not used by any other code in
+SLIB.
+</P>
+<P>
+
+<A NAME="Fluid-Let"></A>
+<HR SIZE="6">
+<A NAME="SEC39"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC38"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.7 Fluid-Let </H2>
+<!--docid::SEC39::-->
+<P>
+
+<CODE>(require 'fluid-let)</CODE>
+<A NAME="IDX154"></A>
+</P>
+<P>
+
+<A NAME="IDX155"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>fluid-let</B> <I><CODE>(<VAR>bindings</VAR> <small>...</small>)</CODE> <VAR>forms</VAR><small>...</small></I>
+<DD></DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(fluid-let ((<VAR>variable</VAR> <VAR>init</VAR>) <small>...</small>)
+ <VAR>expression</VAR> <VAR>expression</VAR> <small>...</small>)
+</pre></td></tr></table><P>
+
+The <VAR>init</VAR>s are evaluated in the current environment (in some
+unspecified order), the current values of the <VAR>variable</VAR>s are saved,
+the results are assigned to the <VAR>variable</VAR>s, the <VAR>expression</VAR>s
+are evaluated sequentially in the current environment, the
+<VAR>variable</VAR>s are restored to their original values, and the value of
+the last <VAR>expression</VAR> is returned.
+</P>
+<P>
+
+The syntax of this special form is similar to that of <CODE>let</CODE>, but
+<CODE>fluid-let</CODE> temporarily rebinds existing <VAR>variable</VAR>s. Unlike
+<CODE>let</CODE>, <CODE>fluid-let</CODE> creates no new bindings; instead it
+<EM>assigns</EM> the values of each <VAR>init</VAR> to the binding (determined
+by the rules of lexical scoping) of its corresponding
+<VAR>variable</VAR>.
+</P>
+<P>
+
+<A NAME="Yasos"></A>
+<HR SIZE="6">
+<A NAME="SEC40"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC39"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC41"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.8 Yasos </H2>
+<!--docid::SEC40::-->
+<P>
+
+<CODE>(require 'oop)</CODE> or <CODE>(require 'yasos)</CODE>
+<A NAME="IDX156"></A>
+<A NAME="IDX157"></A>
+</P>
+<P>
+
+`Yet Another Scheme Object System' is a simple object system for Scheme
+based on the paper by Norman Adams and Jonathan Rees: <CITE>Object
+Oriented Programming in Scheme</CITE>, Proceedings of the 1988 ACM Conference
+on LISP and Functional Programming, July 1988 [ACM #552880].
+</P>
+<P>
+
+Another reference is:
+</P>
+<P>
+
+Ken Dickey.
+&lt;A HREF=&quot;ftp://ftp.cs.indiana.edu/pub/scheme-repository/doc/pubs/swob.txt&quot;&gt;
+Scheming with Objects
+&lt;/A&gt;
+<CITE>AI Expert</CITE> Volume 7, Number 10 (October 1992), pp. 24-33.
+</P>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC41">3.8.1 Terms</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Definitions and disclaimer.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">The Yasos macros and procedures.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Dylan-like setters in Yasos.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC44">3.8.4 Examples</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Usage of Yasos and setters.</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Yasos terms"></A>
+<HR SIZE="6">
+<A NAME="SEC41"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC42"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.8.1 Terms </H3>
+<!--docid::SEC41::-->
+<P>
+
+</P>
+<DL COMPACT>
+<DT><EM>Object</EM>
+<DD>Any Scheme data object.
+<P>
+
+</P>
+<DT><EM>Instance</EM>
+<DD>An instance of the OO system; an <EM>object</EM>.
+<P>
+
+</P>
+<DT><EM>Operation</EM>
+<DD>A <VAR>method</VAR>.
+</DL>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><EM>Notes:</EM>
+<DD>The object system supports multiple inheritance. An instance can
+inherit from 0 or more ancestors. In the case of multiple inherited
+operations with the same identity, the operation used is that from the
+first ancestor which contains it (in the ancestor <CODE>let</CODE>). An
+operation may be applied to any Scheme data object--not just instances.
+As code which creates instances is just code, there are no <EM>classes</EM>
+and no meta-<VAR>anything</VAR>. Method dispatch is by a procedure call a la
+CLOS rather than by <CODE>send</CODE> syntax a la Smalltalk.
+<P>
+
+</P>
+<DT><EM>Disclaimer:</EM>
+<DD>There are a number of optimizations which can be made. This
+implementation is expository (although performance should be quite
+reasonable). See the L&amp;FP paper for some suggestions.
+</DL>
+<P>
+
+<A NAME="Yasos interface"></A>
+<HR SIZE="6">
+<A NAME="SEC42"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC41"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC43"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.8.2 Interface </H3>
+<!--docid::SEC42::-->
+<P>
+
+<A NAME="IDX158"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>define-operation</B> <I><CODE>(</CODE>opname self arg <small>...</small><CODE>)</CODE> <VAR>default-body</VAR></I>
+<DD>Defines a default behavior for data objects which don't handle the
+operation <VAR>opname</VAR>. The default behavior (for an empty
+<VAR>default-body</VAR>) is to generate an error.
+</DL>
+<P>
+
+<A NAME="IDX159"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>define-predicate</B> <I>opname?</I>
+<DD>Defines a predicate <VAR>opname?</VAR>, usually used for determining the
+<EM>type</EM> of an object, such that <CODE>(<VAR>opname?</VAR> <VAR>object</VAR>)</CODE>
+returns <CODE>#t</CODE> if <VAR>object</VAR> has an operation <VAR>opname?</VAR> and
+<CODE>#f</CODE> otherwise.
+</DL>
+<P>
+
+<A NAME="IDX160"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>object</B> <I><CODE>((<VAR>name</VAR> <VAR>self</VAR> <VAR>arg</VAR> <small>...</small>) <VAR>body</VAR>)</CODE> <small>...</small></I>
+<DD>Returns an object (an instance of the object system) with operations.
+Invoking <CODE>(<VAR>name</VAR> <VAR>object</VAR> <VAR>arg</VAR> <small>...</small></CODE> executes the
+<VAR>body</VAR> of the <VAR>object</VAR> with <VAR>self</VAR> bound to <VAR>object</VAR> and
+with argument(s) <VAR>arg</VAR><small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX161"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>object-with-ancestors</B> <I><CODE>((</CODE>ancestor1 init1<CODE>)</CODE> <small>...</small><CODE>)</CODE> operation <small>...</small></I>
+<DD>A <CODE>let</CODE>-like form of <CODE>object</CODE> for multiple inheritance. It
+returns an object inheriting the behaviour of <VAR>ancestor1</VAR> etc. An
+operation will be invoked in an ancestor if the object itself does not
+provide such a method. In the case of multiple inherited operations
+with the same identity, the operation used is the one found in the first
+ancestor in the ancestor list.
+</DL>
+<P>
+
+<A NAME="IDX162"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>operate-as</B> <I>component operation self arg <small>...</small></I>
+<DD>Used in an operation definition (of <VAR>self</VAR>) to invoke the
+<VAR>operation</VAR> in an ancestor <VAR>component</VAR> but maintain the object's
+identity. Also known as &quot;send-to-super&quot;.
+</DL>
+<P>
+
+<A NAME="IDX163"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>print</B> <I>obj port</I>
+<DD>A default <CODE>print</CODE> operation is provided which is just <CODE>(format
+<VAR>port</VAR> <VAR>obj</VAR>)</CODE> (see section <A HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A>) for non-instances and prints
+<VAR>obj</VAR> preceded by `<SAMP>#&lt;INSTANCE&gt;</SAMP>' for instances.
+</DL>
+<P>
+
+<A NAME="IDX164"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>size</B> <I>obj</I>
+<DD>The default method returns the number of elements in <VAR>obj</VAR> if it is
+a vector, string or list, <CODE>2</CODE> for a pair, <CODE>1</CODE> for a character
+and by default id an error otherwise. Objects such as collections
+(see section <A HREF="slib_7.html#SEC194">7.1.9 Collections</A>) may override the default in an obvious way.
+</DL>
+<P>
+
+<A NAME="Setters"></A>
+<HR SIZE="6">
+<A NAME="SEC43"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC42"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC44"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.8.3 Setters </H3>
+<!--docid::SEC43::-->
+<P>
+
+<EM>Setters</EM> implement <EM>generalized locations</EM> for objects
+associated with some sort of mutable state. A <EM>getter</EM> operation
+retrieves a value from a generalized location and the corresponding
+setter operation stores a value into the location. Only the getter is
+named -- the setter is specified by a procedure call as below. (Dylan
+uses special syntax.) Typically, but not necessarily, getters are
+access operations to extract values from Yasos objects (see section <A HREF="slib_3.html#SEC40">3.8 Yasos</A>).
+Several setters are predefined, corresponding to getters <CODE>car</CODE>,
+<CODE>cdr</CODE>, <CODE>string-ref</CODE> and <CODE>vector-ref</CODE> e.g., <CODE>(setter
+car)</CODE> is equivalent to <CODE>set-car!</CODE>.
+</P>
+<P>
+
+This implementation of setters is similar to that in Dylan(TM)
+(<CITE>Dylan: An object-oriented dynamic language</CITE>, Apple Computer
+Eastern Research and Technology). Common LISP provides similar
+facilities through <CODE>setf</CODE>.
+</P>
+<P>
+
+<A NAME="IDX165"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>setter</B> <I>getter</I>
+<DD>Returns the setter for the procedure <VAR>getter</VAR>. E.g., since
+<CODE>string-ref</CODE> is the getter corresponding to a setter which is
+actually <CODE>string-set!</CODE>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define foo &quot;foo&quot;)
+((setter string-ref) foo 0 #\F) ; set element 0 of foo
+foo => &quot;Foo&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX166"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>set</B> <I>place new-value</I>
+<DD>If <VAR>place</VAR> is a variable name, <CODE>set</CODE> is equivalent to
+<CODE>set!</CODE>. Otherwise, <VAR>place</VAR> must have the form of a procedure
+call, where the procedure name refers to a getter and the call indicates
+an accessible generalized location, i.e., the call would return a value.
+The return value of <CODE>set</CODE> is usually unspecified unless used with a
+setter whose definition guarantees to return a useful value.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set (string-ref foo 2) #\O) ; generalized location with getter
+foo => &quot;FoO&quot;
+(set foo &quot;foo&quot;) ; like set!
+foo => &quot;foo&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX167"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>add-setter</B> <I>getter setter</I>
+<DD>Add procedures <VAR>getter</VAR> and <VAR>setter</VAR> to the (inaccessible) list
+of valid setter/getter pairs. <VAR>setter</VAR> implements the store
+operation corresponding to the <VAR>getter</VAR> access operation for the
+relevant state. The return value is unspecified.
+</DL>
+<P>
+
+<A NAME="IDX168"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>remove-setter-for</B> <I>getter</I>
+<DD>Removes the setter corresponding to the specified <VAR>getter</VAR> from the
+list of valid setters. The return value is unspecified.
+</DL>
+<P>
+
+<A NAME="IDX169"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>define-access-operation</B> <I>getter-name</I>
+<DD>Shorthand for a Yasos <CODE>define-operation</CODE> defining an operation
+<VAR>getter-name</VAR> that objects may support to return the value of some
+mutable state. The default operation is to signal an error. The return
+value is unspecified.
+</DL>
+<P>
+
+<A NAME="Yasos examples"></A>
+<HR SIZE="6">
+<A NAME="SEC44"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC43"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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> 3.8.4 Examples </H3>
+<!--docid::SEC44::-->
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>;;; These definitions for PRINT and SIZE are
+;;; already supplied by
+(require 'yasos)
+
+(define-operation (print obj port)
+ (format port
+ (if (instance? obj) &quot;#&lt;instance&gt;&quot; &quot;~s&quot;)
+ obj))
+
+(define-operation (size obj)
+ (cond
+ ((vector? obj) (vector-length obj))
+ ((list? obj) (length obj))
+ ((pair? obj) 2)
+ ((string? obj) (string-length obj))
+ ((char? obj) 1)
+ (else
+ (slib:error &quot;Operation not supported: size&quot; obj))))
+
+(define-predicate cell?)
+(define-operation (fetch obj))
+(define-operation (store! obj newValue))
+
+(define (make-cell value)
+ (object
+ ((cell? self) #t)
+ ((fetch self) value)
+ ((store! self newValue)
+ (set! value newValue)
+ newValue)
+ ((size self) 1)
+ ((print self port)
+ (format port &quot;#&lt;Cell: ~s&gt;&quot; (fetch self)))))
+
+(define-operation (discard obj value)
+ (format #t &quot;Discarding ~s~%&quot; value))
+
+(define (make-filtered-cell value filter)
+ (object-with-ancestors
+ ((cell (make-cell value)))
+ ((store! self newValue)
+ (if (filter newValue)
+ (store! cell newValue)
+ (discard self newValue)))))
+
+(define-predicate array?)
+(define-operation (array-ref array index))
+(define-operation (array-set! array index value))
+
+(define (make-array num-slots)
+ (let ((anArray (make-vector num-slots)))
+ (object
+ ((array? self) #t)
+ ((size self) num-slots)
+ ((array-ref self index)
+ (vector-ref anArray index))
+ ((array-set! self index newValue)
+ (vector-set! anArray index newValue))
+ ((print self port)
+ (format port &quot;#&lt;Array ~s&gt;&quot; (size self))))))
+
+(define-operation (position obj))
+(define-operation (discarded-value obj))
+
+(define (make-cell-with-history value filter size)
+ (let ((pos 0) (most-recent-discard #f))
+ (object-with-ancestors
+ ((cell (make-filtered-call value filter))
+ (sequence (make-array size)))
+ ((array? self) #f)
+ ((position self) pos)
+ ((store! self newValue)
+ (operate-as cell store! self newValue)
+ (array-set! self pos newValue)
+ (set! pos (+ pos 1)))
+ ((discard self value)
+ (set! most-recent-discard value))
+ ((discarded-value self) most-recent-discard)
+ ((print self port)
+ (format port &quot;#&lt;Cell-with-history ~s&gt;&quot;
+ (fetch self))))))
+
+(define-access-operation fetch)
+(add-setter fetch store!)
+(define foo (make-cell 1))
+(print foo #f)
+=> &quot;#&lt;Cell: 1&gt;&quot;
+(set (fetch foo) 2)
+=>
+(print foo #f)
+=> &quot;#&lt;Cell: 2&gt;&quot;
+(fetch foo)
+=> 2
+</pre></td></tr></table><P>
+
+<A NAME="Textual Conversion Packages"></A>
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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>
diff --git a/slib_4.html b/slib_4.html
new file mode 100644
index 0000000..4aa89a0
--- /dev/null
+++ b/slib_4.html
@@ -0,0 +1,5157 @@
+<!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: Textual Conversion Packages</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Textual Conversion Packages">
+<META NAME="keywords" CONTENT="SLIB: Textual Conversion 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="SEC45"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC44"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &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_5.html#SEC88"> &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> 4. Textual Conversion Packages </H1>
+<!--docid::SEC45::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC46">4.1 Precedence Parsing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Common-Lisp Format</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC54">4.3 Standard Formatted I/O</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Posix printf and scanf</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC61">4.4 Program and Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Generating</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Databases meet HTML</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Serve WWW sites</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'html-for-each</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC76">4.10 URI</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Uniform Resource Identifier</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC78">4.11 Printing Scheme</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Nicely</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">DNA and protein sequences</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Documentation markup for Scheme programs</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Precedence Parsing"></A>
+<HR SIZE="6">
+<A NAME="SEC46"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC47"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.1 Precedence Parsing </H2>
+<!--docid::SEC46::-->
+<P>
+
+<CODE>(require 'precedence-parse)</CODE> or <CODE>(require 'parse)</CODE>
+<A NAME="IDX170"></A>
+<A NAME="IDX171"></A>
+</P>
+<P>
+
+This package implements:
+</P>
+<P>
+
+<UL>
+<LI>
+a Pratt style precedence parser;
+<LI>
+a <EM>tokenizer</EM> which congeals tokens according to assigned classes of
+constituent characters;
+<LI>
+procedures giving direct control of parser rulesets;
+<LI>
+procedures for higher level specification of rulesets.
+</UL>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Precedence Parsing Overview"></A>
+<HR SIZE="6">
+<A NAME="SEC47"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC48"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.1.1 Precedence Parsing Overview </H3>
+<!--docid::SEC47::-->
+<P>
+
+This package offers improvements over previous parsers.
+</P>
+<P>
+
+<UL>
+<LI>
+Common computer language constructs are concisely specified.
+<LI>
+Grammars can be changed dynamically. Operators can be assigned
+different meanings within a lexical context.
+<LI>
+Rulesets don't need compilation. Grammars can be changed incrementally.
+<LI>
+Operator precedence is specified by integers.
+<LI>
+All possibilities of bad input are handled <A NAME="DOCF3" HREF="slib_fot.html#FOOT3">(3)</A> and return as much structure as was
+parsed when the error occured; The symbol <CODE>?</CODE> is substituted for
+missing input.
+</UL>
+<P>
+
+<A NAME="IDX172"></A>
+The notion of <EM>binding power</EM> may be unfamiliar to those
+accustomed to BNF grammars.
+</P>
+<P>
+
+When two consecutive objects are parsed, the first might be the prefix
+to the second, or the second might be a suffix of the first.
+Comparing the left and right binding powers of the two objects decides
+which way to interpret them.
+</P>
+<P>
+
+Objects at each level of syntactic grouping have binding powers.
+</P>
+<P>
+
+<A NAME="IDX173"></A>
+A syntax tree is not built unless the rules explicitly do so. The
+call graph of grammar rules effectively instantiate the sytnax tree.
+</P>
+<P>
+
+The JACAL symbolic math system
+(<A HREF="http://swissnet.ai.mit.edu/~jaffer/JACAL.html">http://swissnet.ai.mit.edu/~jaffer/JACAL.html</A>) uses
+<TT>precedence-parse</TT>. Its grammar definitions in the file
+`<TT>jacal/English.scm</TT>' can serve as examples of use.
+</P>
+<P>
+
+<A NAME="Rule Types"></A>
+<HR SIZE="6">
+<A NAME="SEC48"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC47"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC49"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.1.2 Rule Types </H3>
+<!--docid::SEC48::-->
+<P>
+
+Here are the higher-level syntax types and an example of each.
+Precedence considerations are omitted for clarity. See <A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A> for full details.
+<A NAME="IDX174"></A>
+</P>
+<DL>
+<DT><U>Grammar:</U> <B>nofix</B> <I>bye exit</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>bye
+</pre></td></tr></table>calls the function <CODE>exit</CODE> with no arguments.
+</DL>
+<A NAME="IDX175"></A>
+<DL>
+<DT><U>Grammar:</U> <B>prefix</B> <I>- negate</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>- 42
+</pre></td></tr></table>Calls the function <CODE>negate</CODE> with the argument <CODE>42</CODE>.
+</DL>
+<A NAME="IDX176"></A>
+<DL>
+<DT><U>Grammar:</U> <B>infix</B> <I>- difference</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>x - y
+</pre></td></tr></table>Calls the function <CODE>difference</CODE> with arguments <CODE>x</CODE> and <CODE>y</CODE>.
+</DL>
+<A NAME="IDX177"></A>
+<DL>
+<DT><U>Grammar:</U> <B>nary</B> <I>+ sum</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>x + y + z
+</pre></td></tr></table>Calls the function <CODE>sum</CODE> with arguments <CODE>x</CODE>, <CODE>y</CODE>, and
+<CODE>y</CODE>.
+</DL>
+<A NAME="IDX178"></A>
+<DL>
+<DT><U>Grammar:</U> <B>postfix</B> <I>! factorial</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>5 !
+</pre></td></tr></table>Calls the function <CODE>factorial</CODE> with the argument <CODE>5</CODE>.
+</DL>
+<A NAME="IDX179"></A>
+<DL>
+<DT><U>Grammar:</U> <B>prestfix</B> <I>set set!</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>set foo bar
+</pre></td></tr></table>Calls the function <CODE>set!</CODE> with the arguments <CODE>foo</CODE> and
+<CODE>bar</CODE>.
+</DL>
+<A NAME="IDX180"></A>
+<DL>
+<DT><U>Grammar:</U> <B>commentfix</B> <I>/* */</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>/* almost any text here */
+</pre></td></tr></table>Ignores the comment delimited by <CODE>/*</CODE> and <CODE>*/</CODE>.
+</DL>
+<A NAME="IDX181"></A>
+<DL>
+<DT><U>Grammar:</U> <B>matchfix</B> <I>{ list }</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>{0, 1, 2}
+</pre></td></tr></table>Calls the function <CODE>list</CODE> with the arguments <CODE>0</CODE>, <CODE>1</CODE>,
+and <CODE>2</CODE>.
+</DL>
+<A NAME="IDX182"></A>
+<DL>
+<DT><U>Grammar:</U> <B>inmatchfix</B> <I>( funcall )</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>f(x, y)
+</pre></td></tr></table>Calls the function <CODE>funcall</CODE> with the arguments <CODE>f</CODE>, <CODE>x</CODE>,
+and <CODE>y</CODE>.
+</DL>
+<A NAME="IDX183"></A>
+<DL>
+<DT><U>Grammar:</U> <B>delim</B> <I>;</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>set foo bar;
+</pre></td></tr></table>delimits the extent of the restfix operator <CODE>set</CODE>.
+</DL>
+<P>
+
+<A NAME="Ruleset Definition and Use"></A>
+<HR SIZE="6">
+<A NAME="SEC49"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC48"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC50"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.1.3 Ruleset Definition and Use </H3>
+<!--docid::SEC49::-->
+<P>
+
+<A NAME="IDX184"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*syn-defs*</B>
+<DD>A grammar is built by one or more calls to <CODE>prec:define-grammar</CODE>.
+The rules are appended to <VAR>*syn-defs*</VAR>. The value of
+<VAR>*syn-defs*</VAR> is the grammar suitable for passing as an argument to
+<CODE>prec:parse</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX185"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>*syn-ignore-whitespace*</B>
+<DD>Is a nearly empty grammar with whitespace characters set to group 0,
+which means they will not be made into tokens. Most rulesets will want
+to start with <CODE>*syn-ignore-whitespace*</CODE>
+</DL>
+<P>
+
+In order to start defining a grammar, either
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! *syn-defs* '())
+</pre></td></tr></table>or
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! *syn-defs* *syn-ignore-whitespace*)
+</pre></td></tr></table><P>
+
+<A NAME="IDX186"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:define-grammar</B> <I>rule1 <small>...</small></I>
+<DD>Appends <VAR>rule1</VAR> <small>...</small> to <VAR>*syn-defs*</VAR>.
+<CODE>prec:define-grammar</CODE> is used to define both the character classes
+and rules for tokens.
+</DL>
+<P>
+
+Once your grammar is defined, save the value of <CODE>*syn-defs*</CODE> in a
+variable (for use when calling <CODE>prec:parse</CODE>).
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define my-ruleset *syn-defs*)
+</pre></td></tr></table><P>
+
+<A NAME="IDX187"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:parse</B> <I>ruleset delim</I>
+<DD><A NAME="IDX188"></A>
+<DT><U>Function:</U> <B>prec:parse</B> <I>ruleset delim port</I>
+<DD>The <VAR>ruleset</VAR> argument must be a list of rules as constructed by
+<CODE>prec:define-grammar</CODE> and extracted from <VAR>*syn-defs*</VAR>.
+<P>
+
+The token <VAR>delim</VAR> may be a character, symbol, or string. A
+character <VAR>delim</VAR> argument will match only a character token; i.e. a
+character for which no token-group is assigned. A symbols or string
+will match only a token string; i.e. a token resulting from a token
+group.
+</P>
+<P>
+
+<CODE>prec:parse</CODE> reads a <VAR>ruleset</VAR> grammar expression delimited
+by <VAR>delim</VAR> from the given input <VAR>port</VAR>. <CODE>prec:parse</CODE>
+returns the next object parsable from the given input <VAR>port</VAR>,
+updating <VAR>port</VAR> to point to the first character past the end of the
+external representation of the object.
+</P>
+<P>
+
+If an end of file is encountered in the input before any characters are
+found that can begin an object, then an end of file object is returned.
+If a delimiter (such as <VAR>delim</VAR>) is found before any characters are
+found that can begin an object, then <CODE>#f</CODE> is returned.
+</P>
+<P>
+
+The <VAR>port</VAR> argument may be omitted, in which case it defaults to the
+value returned by <CODE>current-input-port</CODE>. It is an error to parse
+from a closed port.
+<A NAME="IDX189"></A>
+</P>
+</DL>
+<P>
+
+<A NAME="Token definition"></A>
+<HR SIZE="6">
+<A NAME="SEC50"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC49"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC51"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.1.4 Token definition </H3>
+<!--docid::SEC50::-->
+<P>
+
+<A NAME="IDX190"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tok:char-group</B> <I>group chars chars-proc</I>
+<DD>The argument <VAR>chars</VAR> may be a single character, a list of
+characters, or a string. Each character in <VAR>chars</VAR> is treated as
+though <CODE>tok:char-group</CODE> was called with that character alone.
+<P>
+
+The argument <VAR>chars-proc</VAR> must be a procedure of one argument, a
+list of characters. After <CODE>tokenize</CODE> has finished
+accumulating the characters for a token, it calls <VAR>chars-proc</VAR> with
+the list of characters. The value returned is the token which
+<CODE>tokenize</CODE> returns.
+</P>
+<P>
+
+The argument <VAR>group</VAR> may be an exact integer or a procedure of one
+character argument. The following discussion concerns the treatment
+which the tokenizing routine, <CODE>tokenize</CODE>, will accord to characters
+on the basis of their groups.
+</P>
+<P>
+
+When <VAR>group</VAR> is a non-zero integer, characters whose group number is
+equal to or exactly one less than <VAR>group</VAR> will continue to
+accumulate. Any other character causes the accumulation to stop (until
+a new token is to be read).
+</P>
+<P>
+
+The <VAR>group</VAR> of zero is special. These characters are ignored when
+parsed pending a token, and stop the accumulation of token characters
+when the accumulation has already begun. Whitespace characters are
+usually put in group 0.
+</P>
+<P>
+
+If <VAR>group</VAR> is a procedure, then, when triggerd by the occurence of
+an initial (no accumulation) <VAR>chars</VAR> character, this procedure will
+be repeatedly called with each successive character from the input
+stream until the <VAR>group</VAR> procedure returns a non-false value.
+</P>
+</DL>
+<P>
+
+The following convenient constants are provided for use with
+<CODE>tok:char-group</CODE>.
+</P>
+<P>
+
+<A NAME="IDX191"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>tok:decimal-digits</B>
+<DD>Is the string <CODE>&quot;0123456789&quot;</CODE>.
+</DL>
+<A NAME="IDX192"></A>
+<DL>
+<DT><U>Constant:</U> <B>tok:upper-case</B>
+<DD>Is the string consisting of all upper-case letters
+(&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;).
+</DL>
+<A NAME="IDX193"></A>
+<DL>
+<DT><U>Constant:</U> <B>tok:lower-case</B>
+<DD>Is the string consisting of all lower-case letters
+(&quot;abcdefghijklmnopqrstuvwxyz&quot;).
+</DL>
+<A NAME="IDX194"></A>
+<DL>
+<DT><U>Constant:</U> <B>tok:whitespaces</B>
+<DD>Is the string consisting of all characters between 0 and 255 for which
+<CODE>char-whitespace?</CODE> returns true.
+</DL>
+<P>
+
+For the purpose of reporting problems in error messages, this package
+keeps track of the <EM>current column</EM>. When the column does not
+simply track input characters, <CODE>tok:bump-column</CODE> can be used to
+adjust the current-column.
+</P>
+<P>
+
+<A NAME="IDX195"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tok:bump-column</B> <I>pos port</I>
+<DD>Adds <VAR>pos</VAR> to the current-column for input-port <VAR>port</VAR>.
+</DL>
+<P>
+
+<A NAME="Nud and Led Definition"></A>
+<HR SIZE="6">
+<A NAME="SEC51"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC50"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC52"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.1.5 Nud and Led Definition </H3>
+<!--docid::SEC51::-->
+<P>
+
+This section describes advanced features. You can skip this section on
+first reading.
+</P>
+<P>
+
+The <EM>Null Denotation</EM> (or <EM>nud</EM>)
+<A NAME="IDX196"></A>
+of a token is the procedure and arguments applying for that token when
+<EM>Left</EM>, an unclaimed parsed expression is not extant.
+</P>
+<P>
+
+The <EM>Left Denotation</EM> (or <EM>led</EM>)
+<A NAME="IDX197"></A>
+of a token is the procedure, arguments, and lbp applying for that token
+when there is a <EM>Left</EM>, an unclaimed parsed expression.
+</P>
+<P>
+
+In his paper,
+</P>
+<P>
+
+<BLOCKQUOTE>
+Pratt, V. R.
+Top Down Operator Precendence.
+<CITE>SIGACT/SIGPLAN Symposium on Principles of Programming Languages</CITE>,
+Boston, 1973, pages 41-51
+</BLOCKQUOTE>
+<P>
+
+the <EM>left binding power</EM> (or <EM>lbp</EM>) was an independent property
+of tokens. I think this was done in order to allow tokens with NUDs but
+not LEDs to also be used as delimiters, which was a problem for
+statically defined syntaxes. It turns out that <EM>dynamically
+binding</EM> NUDs and LEDs allows them independence.
+</P>
+<P>
+
+For the rule-defining procedures that follow, the variable <VAR>tk</VAR> may
+be a character, string, or symbol, or a list composed of characters,
+strings, and symbols. Each element of <VAR>tk</VAR> is treated as though the
+procedure were called for each element.
+</P>
+<P>
+
+Character <VAR>tk</VAR> arguments will match only character tokens;
+i.e. characters for which no token-group is assigned. Symbols and
+strings will both match token strings; i.e. tokens resulting from token
+groups.
+</P>
+<P>
+
+<A NAME="IDX198"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:make-nud</B> <I>tk sop arg1 <small>...</small></I>
+<DD>Returns a rule specifying that <VAR>sop</VAR> be called when <VAR>tk</VAR> is
+parsed. If <VAR>sop</VAR> is a procedure, it is called with <VAR>tk</VAR> and
+<VAR>arg1</VAR> <small>...</small> as its arguments; the resulting value is incorporated
+into the expression being built. Otherwise, <CODE>(list <VAR>sop</VAR>
+<VAR>arg1</VAR> <small>...</small>)</CODE> is incorporated.
+</DL>
+<P>
+
+If no NUD has been defined for a token; then if that token is a string,
+it is converted to a symbol and returned; if not a string, the token is
+returned.
+</P>
+<P>
+
+<A NAME="IDX199"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:make-led</B> <I>tk sop arg1 <small>...</small></I>
+<DD>Returns a rule specifying that <VAR>sop</VAR> be called when <VAR>tk</VAR> is
+parsed and <VAR>left</VAR> has an unclaimed parsed expression. If <VAR>sop</VAR>
+is a procedure, it is called with <VAR>left</VAR>, <VAR>tk</VAR>, and <VAR>arg1</VAR>
+<small>...</small> as its arguments; the resulting value is incorporated into the
+expression being built. Otherwise, <VAR>left</VAR> is incorporated.
+</DL>
+<P>
+
+If no LED has been defined for a token, and <VAR>left</VAR> is set, the
+parser issues a warning.
+</P>
+<P>
+
+<A NAME="Grammar Rule Definition"></A>
+<HR SIZE="6">
+<A NAME="SEC52"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC51"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC53"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.1.6 Grammar Rule Definition </H3>
+<!--docid::SEC52::-->
+<P>
+
+Here are procedures for defining rules for the syntax types introduced
+in <A HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A>.
+</P>
+<P>
+
+For the rule-defining procedures that follow, the variable <VAR>tk</VAR> may
+be a character, string, or symbol, or a list composed of characters,
+strings, and symbols. Each element of <VAR>tk</VAR> is treated as though the
+procedure were called for each element.
+</P>
+<P>
+
+For procedures prec:delim, <small>...</small>, prec:prestfix, if the <VAR>sop</VAR>
+argument is <CODE>#f</CODE>, then the token which triggered this rule is
+converted to a symbol and returned. A false <VAR>sop</VAR> argument to the
+procedures prec:commentfix, prec:matchfix, or prec:inmatchfix has a
+different meaning.
+</P>
+<P>
+
+Character <VAR>tk</VAR> arguments will match only character tokens;
+i.e. characters for which no token-group is assigned. Symbols and
+strings will both match token strings; i.e. tokens resulting from token
+groups.
+</P>
+<P>
+
+<A NAME="IDX200"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:delim</B> <I>tk</I>
+<DD>Returns a rule specifying that <VAR>tk</VAR> should not be returned from
+parsing; i.e. <VAR>tk</VAR>'s function is purely syntactic. The end-of-file
+is always treated as a delimiter.
+</DL>
+<P>
+
+<A NAME="IDX201"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:nofix</B> <I>tk sop</I>
+<DD>Returns a rule specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+If <VAR>sop</VAR> is a procedure, it is called with no arguments; the
+resulting value is incorporated into the expression being built.
+Otherwise, the list of <VAR>sop</VAR> is incorporated.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX202"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:prefix</B> <I>tk sop bp rule1 <small>...</small></I>
+<DD>Returns a rule specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+<CODE>prec:parse1</CODE> is called with binding-power <VAR>bp</VAR>.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is called with the expression returned
+from <CODE>prec:parse1</CODE>; the resulting value is incorporated into the
+expression being built. Otherwise, the list of <VAR>sop</VAR> and the
+expression returned from <CODE>prec:parse1</CODE> is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX203"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:infix</B> <I>tk sop lbp bp rule1 <small>...</small></I>
+<DD>Returns a rule declaring the left-binding-precedence of the token
+<VAR>tk</VAR> is <VAR>lbp</VAR> and specifying the following actions take place
+when <VAR>tk</VAR> is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+One expression is parsed with binding-power <VAR>lbp</VAR>. If instead a
+delimiter is encountered, a warning is issued.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of <VAR>left</VAR> and
+the parsed expression; the resulting value is incorporated into the
+expression being built. Otherwise, the list of <VAR>sop</VAR>, the
+<VAR>left</VAR> expression, and the parsed expression is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX204"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:nary</B> <I>tk sop bp</I>
+<DD>Returns a rule declaring the left-binding-precedence of the token
+<VAR>tk</VAR> is <VAR>bp</VAR> and specifying the following actions take place
+when <VAR>tk</VAR> is parsed:
+<UL>
+<LI>
+Expressions are parsed with binding-power <VAR>bp</VAR> as far as they are
+interleaved with the token <VAR>tk</VAR>.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of <VAR>left</VAR> and
+the parsed expressions; the resulting value is incorporated into the
+expression being built. Otherwise, the list of <VAR>sop</VAR>, the
+<VAR>left</VAR> expression, and the parsed expressions is incorporated.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX205"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:postfix</B> <I>tk sop lbp</I>
+<DD>Returns a rule declaring the left-binding-precedence of the token
+<VAR>tk</VAR> is <VAR>lbp</VAR> and specifying the following actions take place
+when <VAR>tk</VAR> is parsed:
+<UL>
+<LI>
+If <VAR>sop</VAR> is a procedure, it is called with the <VAR>left</VAR> expression;
+the resulting value is incorporated into the expression being built.
+Otherwise, the list of <VAR>sop</VAR> and the <VAR>left</VAR> expression is
+incorporated.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX206"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:prestfix</B> <I>tk sop bp rule1 <small>...</small></I>
+<DD>Returns a rule specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+Expressions are parsed with binding-power <VAR>bp</VAR> until a delimiter is
+reached.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of parsed
+expressions; the resulting value is incorporated into the expression
+being built. Otherwise, the list of <VAR>sop</VAR> and the parsed
+expressions is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX207"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:commentfix</B> <I>tk stp match rule1 <small>...</small></I>
+<DD>Returns rules specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+Characters are read until and end-of-file or a sequence of characters
+is read which matches the <EM>string</EM> <VAR>match</VAR>.
+<LI>
+If <VAR>stp</VAR> is a procedure, it is called with the string of all that
+was read between the <VAR>tk</VAR> and <VAR>match</VAR> (exclusive).
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+<P>
+
+Parsing of commentfix syntax differs from the others in several ways.
+It reads directly from input without tokenizing; It calls <VAR>stp</VAR> but
+does not return its value; nay any value. I added the <VAR>stp</VAR>
+argument so that comment text could be echoed.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX208"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:matchfix</B> <I>tk sop sep match rule1 <small>...</small></I>
+<DD>Returns a rule specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+A rule declaring the token <VAR>match</VAR> a delimiter takes effect.
+<LI>
+Expressions are parsed with binding-power <CODE>0</CODE> until the token
+<VAR>match</VAR> is reached. If the token <VAR>sep</VAR> does not appear between
+each pair of expressions parsed, a warning is issued.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of parsed
+expressions; the resulting value is incorporated into the expression
+being built. Otherwise, the list of <VAR>sop</VAR> and the parsed
+expressions is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX209"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:inmatchfix</B> <I>tk sop sep match lbp rule1 <small>...</small></I>
+<DD>Returns a rule declaring the left-binding-precedence of the token
+<VAR>tk</VAR> is <VAR>lbp</VAR> and specifying the following actions take place
+when <VAR>tk</VAR> is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+A rule declaring the token <VAR>match</VAR> a delimiter takes effect.
+<LI>
+Expressions are parsed with binding-power <CODE>0</CODE> until the token
+<VAR>match</VAR> is reached. If the token <VAR>sep</VAR> does not appear between
+each pair of expressions parsed, a warning is issued.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of <VAR>left</VAR> and
+the parsed expressions; the resulting value is incorporated into the
+expression being built. Otherwise, the list of <VAR>sop</VAR>, the
+<VAR>left</VAR> expression, and the parsed expressions is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="Format"></A>
+<HR SIZE="6">
+<A NAME="SEC53"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC52"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.2 Format (version 3.0) </H2>
+<!--docid::SEC53::-->
+<P>
+
+&lt;A NAME=&quot;format&quot;&gt;&lt;/A&gt;
+<A NAME="IDX210"></A>
+</P>
+<P>
+
+The `<TT>format.scm</TT>' package was removed because it was not
+reentrant. <A HREF="http://swissnet.ai.mit.edu/~jaffer/SLIB.FAQ">http://swissnet.ai.mit.edu/~jaffer/SLIB.FAQ</A> explains
+more about FORMAT's woes.
+</P>
+<P>
+
+<A NAME="Standard Formatted I/O"></A>
+<HR SIZE="6">
+<A NAME="SEC54"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC53"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC55"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.3 Standard Formatted I/O </H2>
+<!--docid::SEC54::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'printf</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'scanf</TD></TR>
+</TABLE>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC55"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC56"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.3.1 stdio </H3>
+<!--docid::SEC55::-->
+<P>
+
+<CODE>(require 'stdio)</CODE>
+<A NAME="IDX211"></A>
+</P>
+<P>
+
+<CODE>require</CODE>s <CODE>printf</CODE> and <CODE>scanf</CODE> and additionally defines
+the symbols:
+</P>
+<P>
+
+<A NAME="IDX212"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>stdin</B>
+<DD>Defined to be <CODE>(current-input-port)</CODE>.
+</DL>
+<A NAME="IDX213"></A>
+<DL>
+<DT><U>Variable:</U> <B>stdout</B>
+<DD>Defined to be <CODE>(current-output-port)</CODE>.
+</DL>
+<A NAME="IDX214"></A>
+<DL>
+<DT><U>Variable:</U> <B>stderr</B>
+<DD>Defined to be <CODE>(current-error-port)</CODE>.
+</DL>
+<P>
+
+<A NAME="Standard Formatted Output"></A>
+<HR SIZE="6">
+<A NAME="SEC56"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC55"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC57"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.3.2 Standard Formatted Output </H3>
+<!--docid::SEC56::-->
+<P>
+
+&lt;A NAME=&quot;printf&quot;&gt;&lt;/A&gt;
+<CODE>(require 'printf)</CODE>
+<A NAME="IDX215"></A>
+</P>
+<P>
+
+<A NAME="IDX216"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>printf</B> <I>format arg1 <small>...</small></I>
+<DD><A NAME="IDX217"></A>
+<DT><U>Procedure:</U> <B>fprintf</B> <I>port format arg1 <small>...</small></I>
+<DD><A NAME="IDX218"></A>
+<DT><U>Procedure:</U> <B>sprintf</B> <I>str format arg1 <small>...</small></I>
+<DD><A NAME="IDX219"></A>
+<DT><U>Procedure:</U> <B>sprintf</B> <I>#f format arg1 <small>...</small></I>
+<DD><A NAME="IDX220"></A>
+<DT><U>Procedure:</U> <B>sprintf</B> <I>k format arg1 <small>...</small></I>
+<DD><P>
+
+Each function converts, formats, and outputs its <VAR>arg1</VAR> <small>...</small>
+arguments according to the control string <VAR>format</VAR> argument and
+returns the number of characters output.
+</P>
+<P>
+
+<CODE>printf</CODE> sends its output to the port <CODE>(current-output-port)</CODE>.
+<CODE>fprintf</CODE> sends its output to the port <VAR>port</VAR>. <CODE>sprintf</CODE>
+<CODE>string-set!</CODE>s locations of the non-constant string argument
+<VAR>str</VAR> to the output characters.
+</P>
+<P>
+
+Two extensions of <CODE>sprintf</CODE> return new strings. If the first
+argument is <CODE>#f</CODE>, then the returned string's length is as many
+characters as specified by the <VAR>format</VAR> and data; if the first
+argument is a non-negative integer <VAR>k</VAR>, then the length of the
+returned string is also bounded by <VAR>k</VAR>.
+</P>
+<P>
+
+The string <VAR>format</VAR> contains plain characters which are copied to
+the output stream, and conversion specifications, each of which results
+in fetching zero or more of the arguments <VAR>arg1</VAR> <small>...</small>. The
+results are undefined if there are an insufficient number of arguments
+for the format. If <VAR>format</VAR> is exhausted while some of the
+<VAR>arg1</VAR> <small>...</small> arguments remain unused, the excess <VAR>arg1</VAR>
+<small>...</small> arguments are ignored.
+</P>
+<P>
+
+The conversion specifications in a format string have the form:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>% [ <VAR>flags</VAR> ] [ <VAR>width</VAR> ] [ . <VAR>precision</VAR> ] [ <VAR>type</VAR> ] <VAR>conversion</VAR>
+</pre></td></tr></table><P>
+
+An output conversion specifications consist of an initial `<SAMP>%</SAMP>'
+character followed in sequence by:
+</P>
+<P>
+
+<UL>
+<LI>
+Zero or more <EM>flag characters</EM> that modify the normal behavior of
+the conversion specification.
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>-</SAMP>'
+<DD>Left-justify the result in the field. Normally the result is
+right-justified.
+<P>
+
+</P>
+<DT>`<SAMP>+</SAMP>'
+<DD>For the signed `<SAMP>%d</SAMP>' and `<SAMP>%i</SAMP>' conversions and all inexact
+conversions, prefix a plus sign if the value is positive.
+<P>
+
+</P>
+<DT>`<SAMP> </SAMP>'
+<DD>For the signed `<SAMP>%d</SAMP>' and `<SAMP>%i</SAMP>' conversions, if the result
+doesn't start with a plus or minus sign, prefix it with a space
+character instead. Since the `<SAMP>+</SAMP>' flag ensures that the result
+includes a sign, this flag is ignored if both are specified.
+<P>
+
+</P>
+<DT>`<SAMP>#</SAMP>'
+<DD>For inexact conversions, `<SAMP>#</SAMP>' specifies that the result should
+always include a decimal point, even if no digits follow it. For the
+`<SAMP>%g</SAMP>' and `<SAMP>%G</SAMP>' conversions, this also forces trailing zeros
+after the decimal point to be printed where they would otherwise be
+elided.
+<P>
+
+For the `<SAMP>%o</SAMP>' conversion, force the leading digit to be `<SAMP>0</SAMP>', as
+if by increasing the precision. For `<SAMP>%x</SAMP>' or `<SAMP>%X</SAMP>', prefix a
+leading `<SAMP>0x</SAMP>' or `<SAMP>0X</SAMP>' (respectively) to the result. This
+doesn't do anything useful for the `<SAMP>%d</SAMP>', `<SAMP>%i</SAMP>', or `<SAMP>%u</SAMP>'
+conversions. Using this flag produces output which can be parsed by the
+<CODE>scanf</CODE> functions with the `<SAMP>%i</SAMP>' conversion (see section <A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A>).
+</P>
+<P>
+
+</P>
+<DT>`<SAMP>0</SAMP>'
+<DD>Pad the field with zeros instead of spaces. The zeros are placed after
+any indication of sign or base. This flag is ignored if the `<SAMP>-</SAMP>'
+flag is also specified, or if a precision is specified for an exact
+converson.
+</DL>
+<P>
+
+</P>
+<LI>
+An optional decimal integer specifying the <EM>minimum field width</EM>.
+If the normal conversion produces fewer characters than this, the field
+is padded (with spaces or zeros per the `<SAMP>0</SAMP>' flag) to the specified
+width. This is a <EM>minimum</EM> width; if the normal conversion
+produces more characters than this, the field is <EM>not</EM> truncated.
+<A NAME="IDX221"></A>
+<P>
+
+Alternatively, if the field width is `<SAMP>*</SAMP>', the next argument in the
+argument list (before the actual value to be printed) is used as the
+field width. The width value must be an integer. If the value is
+negative it is as though the `<SAMP>-</SAMP>' flag is set (see above) and the
+absolute value is used as the field width.
+</P>
+<P>
+
+</P>
+<LI>
+An optional <EM>precision</EM> to specify the number of digits to be
+written for numeric conversions and the maximum field width for string
+conversions. The precision is specified by a period (`<SAMP>.</SAMP>') followed
+optionally by a decimal integer (which defaults to zero if omitted).
+<A NAME="IDX222"></A>
+<P>
+
+Alternatively, if the precision is `<SAMP>.*</SAMP>', the next argument in the
+argument list (before the actual value to be printed) is used as the
+precision. The value must be an integer, and is ignored if negative.
+If you specify `<SAMP>*</SAMP>' for both the field width and precision, the
+field width argument precedes the precision argument. The `<SAMP>.*</SAMP>'
+precision is an enhancement. C library versions may not accept this
+syntax.
+</P>
+<P>
+
+For the `<SAMP>%f</SAMP>', `<SAMP>%e</SAMP>', and `<SAMP>%E</SAMP>' conversions, the precision
+specifies how many digits follow the decimal-point character. The
+default precision is <CODE>6</CODE>. If the precision is explicitly <CODE>0</CODE>,
+the decimal point character is suppressed.
+</P>
+<P>
+
+For the `<SAMP>%g</SAMP>' and `<SAMP>%G</SAMP>' conversions, the precision specifies how
+many significant digits to print. Significant digits are the first
+digit before the decimal point, and all the digits after it. If the
+precision is <CODE>0</CODE> or not specified for `<SAMP>%g</SAMP>' or `<SAMP>%G</SAMP>', it is
+treated like a value of <CODE>1</CODE>. If the value being printed cannot be
+expressed accurately in the specified number of digits, the value is
+rounded to the nearest number that fits.
+</P>
+<P>
+
+For exact conversions, if a precision is supplied it specifies the
+minimum number of digits to appear; leading zeros are produced if
+necessary. If a precision is not supplied, the number is printed with
+as many digits as necessary. Converting an exact `<SAMP>0</SAMP>' with an
+explicit precision of zero produces no characters.
+</P>
+<P>
+
+</P>
+<LI>
+An optional one of `<SAMP>l</SAMP>', `<SAMP>h</SAMP>' or `<SAMP>L</SAMP>', which is ignored for
+numeric conversions. It is an error to specify these modifiers for
+non-numeric conversions.
+<P>
+
+</P>
+<LI>
+A character that specifies the conversion to be applied.
+</UL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC57"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC56"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC58"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.3.2.1 Exact Conversions </H4>
+<!--docid::SEC57::-->
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>b</SAMP>', `<SAMP>B</SAMP>'
+<DD>Print an integer as an unsigned binary number.
+<P>
+
+<EM>Note:</EM> `<SAMP>%b</SAMP>' and `<SAMP>%B</SAMP>' are SLIB extensions.
+</P>
+<P>
+
+</P>
+<DT>`<SAMP>d</SAMP>', `<SAMP>i</SAMP>'
+<DD>Print an integer as a signed decimal number. `<SAMP>%d</SAMP>' and `<SAMP>%i</SAMP>'
+are synonymous for output, but are different when used with <CODE>scanf</CODE>
+for input (see section <A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A>).
+<P>
+
+</P>
+<DT>`<SAMP>o</SAMP>'
+<DD>Print an integer as an unsigned octal number.
+<P>
+
+</P>
+<DT>`<SAMP>u</SAMP>'
+<DD>Print an integer as an unsigned decimal number.
+<P>
+
+</P>
+<DT>`<SAMP>x</SAMP>', `<SAMP>X</SAMP>'
+<DD>Print an integer as an unsigned hexadecimal number. `<SAMP>%x</SAMP>' prints
+using the digits `<SAMP>0123456789abcdef</SAMP>'. `<SAMP>%X</SAMP>' prints using the
+digits `<SAMP>0123456789ABCDEF</SAMP>'.
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC58"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC57"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC59"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.3.2.2 Inexact Conversions </H4>
+<!--docid::SEC58::-->
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>f</SAMP>'
+<DD>Print a floating-point number in fixed-point notation.
+<P>
+
+</P>
+<DT>`<SAMP>e</SAMP>', `<SAMP>E</SAMP>'
+<DD>Print a floating-point number in exponential notation. `<SAMP>%e</SAMP>' prints
+`<SAMP>e</SAMP>' between mantissa and exponont. `<SAMP>%E</SAMP>' prints `<SAMP>E</SAMP>'
+between mantissa and exponont.
+<P>
+
+</P>
+<DT>`<SAMP>g</SAMP>', `<SAMP>G</SAMP>'
+<DD>Print a floating-point number in either fixed or exponential notation,
+whichever is more appropriate for its magnitude. Unless an `<SAMP>#</SAMP>'
+flag has been supplied, trailing zeros after a decimal point will be
+stripped off. `<SAMP>%g</SAMP>' prints `<SAMP>e</SAMP>' between mantissa and exponont.
+`<SAMP>%G</SAMP>' prints `<SAMP>E</SAMP>' between mantissa and exponent.
+<P>
+
+</P>
+<DT>`<SAMP>k</SAMP>', `<SAMP>K</SAMP>'
+<DD>Print a number like `<SAMP>%g</SAMP>', except that an SI prefix is output after
+the number, which is scaled accordingly. `<SAMP>%K</SAMP>' outputs a space
+between number and prefix, `<SAMP>%k</SAMP>' does not.
+<P>
+
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC59"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC58"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC60"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.3.2.3 Other Conversions </H4>
+<!--docid::SEC59::-->
+<DL COMPACT>
+<DT>`<SAMP>c</SAMP>'
+<DD>Print a single character. The `<SAMP>-</SAMP>' flag is the only one which can
+be specified. It is an error to specify a precision.
+<P>
+
+</P>
+<DT>`<SAMP>s</SAMP>'
+<DD>Print a string. The `<SAMP>-</SAMP>' flag is the only one which can be
+specified. A precision specifies the maximum number of characters to
+output; otherwise all characters in the string are output.
+<P>
+
+</P>
+<DT>`<SAMP>a</SAMP>', `<SAMP>A</SAMP>'
+<DD>Print a scheme expression. The `<SAMP>-</SAMP>' flag left-justifies the output.
+The `<SAMP>#</SAMP>' flag specifies that strings and characters should be quoted
+as by <CODE>write</CODE> (which can be read using <CODE>read</CODE>); otherwise,
+output is as <CODE>display</CODE> prints. A precision specifies the maximum
+number of characters to output; otherwise as many characters as needed
+are output.
+<P>
+
+<EM>Note:</EM> `<SAMP>%a</SAMP>' and `<SAMP>%A</SAMP>' are SLIB extensions.
+</P>
+<P>
+
+</P>
+<DT>`<SAMP>%</SAMP>'
+<DD>Print a literal `<SAMP>%</SAMP>' character. No argument is consumed. It is an
+error to specify flags, field width, precision, or type modifiers with
+`<SAMP>%%</SAMP>'.
+</DL>
+</DL>
+<P>
+
+<A NAME="Standard Formatted Input"></A>
+<HR SIZE="6">
+<A NAME="SEC60"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC59"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.3.3 Standard Formatted Input </H3>
+<!--docid::SEC60::-->
+<P>
+
+<CODE>(require 'scanf)</CODE>
+<A NAME="IDX223"></A>
+</P>
+<P>
+
+<A NAME="IDX224"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scanf-read-list</B> <I>format</I>
+<DD><A NAME="IDX225"></A>
+<DT><U>Function:</U> <B>scanf-read-list</B> <I>format port</I>
+<DD><A NAME="IDX226"></A>
+<DT><U>Function:</U> <B>scanf-read-list</B> <I>format string</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX227"></A>
+</P>
+<DL>
+<DT><U>Macro:</U> <B>scanf</B> <I>format arg1 <small>...</small></I>
+<DD><A NAME="IDX228"></A>
+<DT><U>Macro:</U> <B>fscanf</B> <I>port format arg1 <small>...</small></I>
+<DD><A NAME="IDX229"></A>
+<DT><U>Macro:</U> <B>sscanf</B> <I>str format arg1 <small>...</small></I>
+<DD><P>
+
+Each function reads characters, interpreting them according to the
+control string <VAR>format</VAR> argument.
+</P>
+<P>
+
+<CODE>scanf-read-list</CODE> returns a list of the items specified as far as
+the input matches <VAR>format</VAR>. <CODE>scanf</CODE>, <CODE>fscanf</CODE>, and
+<CODE>sscanf</CODE> return the number of items successfully matched and
+stored. <CODE>scanf</CODE>, <CODE>fscanf</CODE>, and <CODE>sscanf</CODE> also set the
+location corresponding to <VAR>arg1</VAR> <small>...</small> using the methods:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT>symbol
+<DD><CODE>set!</CODE>
+<DT>car expression
+<DD><CODE>set-car!</CODE>
+<DT>cdr expression
+<DD><CODE>set-cdr!</CODE>
+<DT>vector-ref expression
+<DD><CODE>vector-set!</CODE>
+<DT>substring expression
+<DD><CODE>substring-move-left!</CODE>
+</DL>
+<P>
+
+The argument to a <CODE>substring</CODE> expression in <VAR>arg1</VAR> <small>...</small> must
+be a non-constant string. Characters will be stored starting at the
+position specified by the second argument to <CODE>substring</CODE>. The
+number of characters stored will be limited by either the position
+specified by the third argument to <CODE>substring</CODE> or the length of the
+matched string, whichever is less.
+</P>
+<P>
+
+The control string, <VAR>format</VAR>, contains conversion specifications and
+other characters used to direct interpretation of input sequences. The
+control string contains:
+</P>
+<P>
+
+<UL>
+<LI>White-space characters (blanks, tabs, newlines, or formfeeds)
+that cause input to be read (and discarded) up to the next
+non-white-space character.
+<P>
+
+</P>
+<LI>An ordinary character (not `<SAMP>%</SAMP>') that must match the next
+character of the input stream.
+<P>
+
+</P>
+<LI>Conversion specifications, consisting of the character `<SAMP>%</SAMP>', an
+optional assignment suppressing character `<SAMP>*</SAMP>', an optional
+numerical maximum-field width, an optional `<SAMP>l</SAMP>', `<SAMP>h</SAMP>' or
+`<SAMP>L</SAMP>' which is ignored, and a conversion code.
+<P>
+
+</UL>
+<P>
+
+Unless the specification contains the `<SAMP>n</SAMP>' conversion character
+(described below), a conversion specification directs the conversion of
+the next input field. The result of a conversion specification is
+returned in the position of the corresponding argument points, unless
+`<SAMP>*</SAMP>' indicates assignment suppression. Assignment suppression
+provides a way to describe an input field to be skipped. An input field
+is defined as a string of characters; it extends to the next
+inappropriate character or until the field width, if specified, is
+exhausted.
+</P>
+<P>
+
+<BLOCKQUOTE>
+<EM>Note:</EM> This specification of format strings differs from the
+<CITE>ANSI C</CITE> and <CITE>POSIX</CITE> specifications. In SLIB, white space
+before an input field is not skipped unless white space appears before
+the conversion specification in the format string. In order to write
+format strings which work identically with <CITE>ANSI C</CITE> and SLIB,
+prepend whitespace to all conversion specifications except `<SAMP>[</SAMP>' and
+`<SAMP>c</SAMP>'.
+</BLOCKQUOTE>
+<P>
+
+The conversion code indicates the interpretation of the input field; For
+a suppressed field, no value is returned. The following conversion
+codes are legal:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+
+<DT>`<SAMP>%</SAMP>'
+<DD>A single % is expected in the input at this point; no value is returned.
+<P>
+
+</P>
+<DT>`<SAMP>d</SAMP>', `<SAMP>D</SAMP>'
+<DD>A decimal integer is expected.
+<P>
+
+</P>
+<DT>`<SAMP>u</SAMP>', `<SAMP>U</SAMP>'
+<DD>An unsigned decimal integer is expected.
+<P>
+
+</P>
+<DT>`<SAMP>o</SAMP>', `<SAMP>O</SAMP>'
+<DD>An octal integer is expected.
+<P>
+
+</P>
+<DT>`<SAMP>x</SAMP>', `<SAMP>X</SAMP>'
+<DD>A hexadecimal integer is expected.
+<P>
+
+</P>
+<DT>`<SAMP>i</SAMP>'
+<DD>An integer is expected. Returns the value of the next input item,
+interpreted according to C conventions; a leading `<SAMP>0</SAMP>' implies
+octal, a leading `<SAMP>0x</SAMP>' implies hexadecimal; otherwise, decimal is
+assumed.
+<P>
+
+</P>
+<DT>`<SAMP>n</SAMP>'
+<DD>Returns the total number of bytes (including white space) read by
+<CODE>scanf</CODE>. No input is consumed by <CODE>%n</CODE>.
+<P>
+
+</P>
+<DT>`<SAMP>f</SAMP>', `<SAMP>F</SAMP>', `<SAMP>e</SAMP>', `<SAMP>E</SAMP>', `<SAMP>g</SAMP>', `<SAMP>G</SAMP>'
+<DD>A floating-point number is expected. The input format for
+floating-point numbers is an optionally signed string of digits,
+possibly containing a radix character `<SAMP>.</SAMP>', followed by an optional
+exponent field consisting of an `<SAMP>E</SAMP>' or an `<SAMP>e</SAMP>', followed by an
+optional `<SAMP>+</SAMP>', `<SAMP>-</SAMP>', or space, followed by an integer.
+<P>
+
+</P>
+<DT>`<SAMP>c</SAMP>', `<SAMP>C</SAMP>'
+<DD><VAR>Width</VAR> characters are expected. The normal skip-over-white-space
+is suppressed in this case; to read the next non-space character, use
+`<SAMP>%1s</SAMP>'. If a field width is given, a string is returned; up to the
+indicated number of characters is read.
+<P>
+
+</P>
+<DT>`<SAMP>s</SAMP>', `<SAMP>S</SAMP>'
+<DD>A character string is expected The input field is terminated by a
+white-space character. <CODE>scanf</CODE> cannot read a null string.
+<P>
+
+</P>
+<DT>`<SAMP>[</SAMP>'
+<DD>Indicates string data and the normal skip-over-leading-white-space is
+suppressed. The left bracket is followed by a set of characters, called
+the scanset, and a right bracket; the input field is the maximal
+sequence of input characters consisting entirely of characters in the
+scanset. `<SAMP>^</SAMP>', when it appears as the first character in the
+scanset, serves as a complement operator and redefines the scanset as
+the set of all characters not contained in the remainder of the scanset
+string. Construction of the scanset follows certain conventions. A
+range of characters may be represented by the construct first-last,
+enabling `<SAMP>[0123456789]</SAMP>' to be expressed `<SAMP>[0-9]</SAMP>'. Using this
+convention, first must be lexically less than or equal to last;
+otherwise, the dash stands for itself. The dash also stands for itself
+when it is the first or the last character in the scanset. To include
+the right square bracket as an element of the scanset, it must appear as
+the first character (possibly preceded by a `<SAMP>^</SAMP>') of the scanset, in
+which case it will not be interpreted syntactically as the closing
+bracket. At least one character must match for this conversion to
+succeed.
+</DL>
+<P>
+
+The <CODE>scanf</CODE> functions terminate their conversions at end-of-file,
+at the end of the control string, or when an input character conflicts
+with the control string. In the latter case, the offending character is
+left unread in the input stream.
+</P>
+</DL>
+<P>
+
+<A NAME="Programs and Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC61"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC60"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC62"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.4 Program and Arguments </H2>
+<!--docid::SEC61::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Command Line option parsing</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A command line reader for Scheme shells</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'parameters</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'getopt-parameters</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'glob or 'filename</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'batch</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Getopt"></A>
+<HR SIZE="6">
+<A NAME="SEC62"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC63"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.4.1 Getopt </H3>
+<!--docid::SEC62::-->
+<P>
+
+<CODE>(require 'getopt)</CODE>
+<A NAME="IDX230"></A>
+</P>
+<P>
+
+This routine implements Posix command line argument parsing. Notice
+that returning values through global variables means that <CODE>getopt</CODE>
+is <EM>not</EM> reentrant.
+</P>
+<P>
+
+Obedience to Posix format for the <CODE>getopt</CODE> calls sows confusion.
+Passing <VAR>argc</VAR> and <VAR>argv</VAR> as arguments while referencing
+<VAR>optind</VAR> as a global variable leads to strange behavior,
+especially when the calls to <CODE>getopt</CODE> are buried in other
+procedures.
+</P>
+<P>
+
+Even in C, <VAR>argc</VAR> can be derived from <VAR>argv</VAR>; what purpose
+does it serve beyond providing an opportunity for
+<VAR>argv</VAR>/<VAR>argc</VAR> mismatch? Just such a mismatch existed for
+years in a SLIB <CODE>getopt--</CODE> example.
+</P>
+<P>
+
+I have removed the <VAR>argc</VAR> and <VAR>argv</VAR> arguments to getopt
+procedures; and replaced them with a global variable:
+</P>
+<P>
+
+<A NAME="IDX231"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*argv*</B>
+<DD>Define <VAR>*argv*</VAR> with a list of arguments before calling getopt
+procedures. If you don't want the first (0th) element to be ignored,
+set <VAR>*optind*</VAR> to 0 (after requiring getopt).
+</DL>
+<P>
+
+<A NAME="IDX232"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*optind*</B>
+<DD>Is the index of the current element of the command line. It is
+initially one. In order to parse a new command line or reparse an old
+one, <VAR>*optind*</VAR> must be reset.
+</DL>
+<P>
+
+<A NAME="IDX233"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*optarg*</B>
+<DD>Is set by getopt to the (string) option-argument of the current option.
+</DL>
+<P>
+
+<A NAME="IDX234"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>getopt</B> <I>optstring</I>
+<DD>Returns the next option letter in <VAR>*argv*</VAR> (starting from
+<CODE>(vector-ref argv *optind*)</CODE>) that matches a letter in
+<VAR>optstring</VAR>. <VAR>*argv*</VAR> is a vector or list of strings, the 0th
+of which getopt usually ignores. <VAR>optstring</VAR> is a string of
+recognized option characters; if a character is followed by a colon,
+the option takes an argument which may be immediately following it in
+the string or in the next element of <VAR>*argv*</VAR>.
+<P>
+
+<VAR>*optind*</VAR> is the index of the next element of the <VAR>*argv*</VAR> vector
+to be processed. It is initialized to 1 by `<TT>getopt.scm</TT>', and
+<CODE>getopt</CODE> updates it when it finishes with each element of
+<VAR>*argv*</VAR>.
+</P>
+<P>
+
+<CODE>getopt</CODE> returns the next option character from <VAR>*argv*</VAR> that
+matches a character in <VAR>optstring</VAR>, if there is one that matches.
+If the option takes an argument, <CODE>getopt</CODE> sets the variable
+<VAR>*optarg*</VAR> to the option-argument as follows:
+</P>
+<P>
+
+<UL>
+<LI>
+If the option was the last character in the string pointed to by an
+element of <VAR>*argv*</VAR>, then <VAR>*optarg*</VAR> contains the next element
+of <VAR>*argv*</VAR>, and <VAR>*optind*</VAR> is incremented by 2. If the
+resulting value of <VAR>*optind*</VAR> is greater than or equal to
+<CODE>(length <VAR>*argv*</VAR>)</CODE>, this indicates a missing option
+argument, and <CODE>getopt</CODE> returns an error indication.
+<P>
+
+</P>
+<LI>
+Otherwise, <VAR>*optarg*</VAR> is set to the string following the option
+character in that element of <VAR>*argv*</VAR>, and <VAR>*optind*</VAR> is
+incremented by 1.
+</UL>
+<P>
+
+If, when <CODE>getopt</CODE> is called, the string <CODE>(vector-ref argv
+*optind*)</CODE> either does not begin with the character <CODE>#\-</CODE> or is
+just <CODE>&quot;-&quot;</CODE>, <CODE>getopt</CODE> returns <CODE>#f</CODE> without changing
+<VAR>*optind*</VAR>. If <CODE>(vector-ref argv *optind*)</CODE> is the string
+<CODE>&quot;--&quot;</CODE>, <CODE>getopt</CODE> returns <CODE>#f</CODE> after incrementing
+<VAR>*optind*</VAR>.
+</P>
+<P>
+
+If <CODE>getopt</CODE> encounters an option character that is not contained in
+<VAR>optstring</VAR>, it returns the question-mark <CODE>#\?</CODE> character. If
+it detects a missing option argument, it returns the colon character
+<CODE>#\:</CODE> if the first character of <VAR>optstring</VAR> was a colon, or a
+question-mark character otherwise. In either case, <CODE>getopt</CODE> sets
+the variable <VAR>getopt:opt</VAR> to the option character that caused the
+error.
+</P>
+<P>
+
+The special option <CODE>&quot;--&quot;</CODE> can be used to delimit the end of the
+options; <CODE>#f</CODE> is returned, and <CODE>&quot;--&quot;</CODE> is skipped.
+</P>
+<P>
+
+RETURN VALUE
+</P>
+<P>
+
+<CODE>getopt</CODE> returns the next option character specified on the command
+line. A colon <CODE>#\:</CODE> is returned if <CODE>getopt</CODE> detects a missing
+argument and the first character of <VAR>optstring</VAR> was a colon
+<CODE>#\:</CODE>.
+</P>
+<P>
+
+A question-mark <CODE>#\?</CODE> is returned if <CODE>getopt</CODE> encounters an
+option character not in <VAR>optstring</VAR> or detects a missing argument
+and the first character of <VAR>optstring</VAR> was not a colon <CODE>#\:</CODE>.
+</P>
+<P>
+
+Otherwise, <CODE>getopt</CODE> returns <CODE>#f</CODE> when all command line options
+have been parsed.
+</P>
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>#! /usr/local/bin/scm
+;;;This code is SCM specific.
+(define argv (program-arguments))
+(require 'getopt)
+<A NAME="IDX235"></A>
+(define opts &quot;:a:b:cd&quot;)
+(let loop ((opt (getopt (length argv) argv opts)))
+ (case opt
+ ((#\a) (print &quot;option a: &quot; *optarg*))
+ ((#\b) (print &quot;option b: &quot; *optarg*))
+ ((#\c) (print &quot;option c&quot;))
+ ((#\d) (print &quot;option d&quot;))
+ ((#\?) (print &quot;error&quot; getopt:opt))
+ ((#\:) (print &quot;missing arg&quot; getopt:opt))
+ ((#f) (if (&lt; *optind* (length argv))
+ (print &quot;argv[&quot; *optind* &quot;]=&quot;
+ (list-ref argv *optind*)))
+ (set! *optind* (+ *optind* 1))))
+ (if (&lt; *optind* (length argv))
+ (loop (getopt (length argv) argv opts))))
+
+(slib:exit)
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC63"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC62"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC64"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.4.2 Getopt--- </H3>
+<!--docid::SEC63::-->
+<P>
+
+<A NAME="IDX236"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B><CODE>getopt--</CODE></B> <I>optstring</I>
+<DD>The procedure <CODE>getopt--</CODE> is an extended version of <CODE>getopt</CODE>
+which parses <EM>long option names</EM> of the form
+`<SAMP>--hold-the-onions</SAMP>' and `<SAMP>--verbosity-level=extreme</SAMP>'.
+<CODE>Getopt--</CODE> behaves as <CODE>getopt</CODE> except for non-empty
+options beginning with `<SAMP>--</SAMP>'.
+<P>
+
+Options beginning with `<SAMP>--</SAMP>' are returned as strings rather than
+characters. If a value is assigned (using `<SAMP>=</SAMP>') to a long option,
+<CODE>*optarg*</CODE> is set to the value. The `<SAMP>=</SAMP>' and value are
+not returned as part of the option string.
+</P>
+<P>
+
+No information is passed to <CODE>getopt--</CODE> concerning which long
+options should be accepted or whether such options can take arguments.
+If a long option did not have an argument, <CODE>*optarg*</CODE> will be set
+to <CODE>#f</CODE>. The caller is responsible for detecting and reporting
+errors.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define opts &quot;:-:b:&quot;)
+(define *argv* '(&quot;foo&quot; &quot;-b9&quot; &quot;--f1&quot; &quot;--2=&quot; &quot;--g3=35234.342&quot; &quot;--&quot;))
+(define *optind* 1)
+(define *optarg* #f)
+(require 'qp)
+<A NAME="IDX237"></A>(do ((i 5 (+ -1 i)))
+ ((zero? i))
+ (let ((opt (getopt-- opts)))
+ (print *optind* opt *optarg*)))
+-|
+2 #\b &quot;9&quot;
+3 &quot;f1&quot; #f
+4 &quot;2&quot; &quot;&quot;
+5 &quot;g3&quot; &quot;35234.342&quot;
+5 #f &quot;35234.342&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Command Line"></A>
+<HR SIZE="6">
+<A NAME="SEC64"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC63"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC65"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.4.3 Command Line </H3>
+<!--docid::SEC64::-->
+<P>
+
+<CODE>(require 'read-command)</CODE>
+<A NAME="IDX238"></A>
+</P>
+<P>
+
+<A NAME="IDX239"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>read-command</B> <I>port</I>
+<DD><P>
+
+<A NAME="IDX240"></A>
+<DT><U>Function:</U> <B>read-command</B>
+<DD><CODE>read-command</CODE> converts a <EM>command line</EM> into a list of strings
+<A NAME="IDX241"></A>
+<A NAME="IDX242"></A>
+suitable for parsing by <CODE>getopt</CODE>. The syntax of command lines
+supported resembles that of popular <EM>shell</EM>s. <CODE>read-command</CODE>
+<A NAME="IDX243"></A>
+updates <VAR>port</VAR> to point to the first character past the command
+delimiter.
+</P>
+<P>
+
+If an end of file is encountered in the input before any characters are
+found that can begin an object or comment, then an end of file object is
+returned.
+</P>
+<P>
+
+The <VAR>port</VAR> argument may be omitted, in which case it defaults to the
+value returned by <CODE>current-input-port</CODE>.
+</P>
+<P>
+
+The fields into which the command line is split are delimited by
+whitespace as defined by <CODE>char-whitespace?</CODE>. The end of a command
+is delimited by end-of-file or unescaped semicolon (<KBD>;</KBD>) or
+<KBD>newline</KBD>. Any character can be literally included in a field by
+escaping it with a backslach (<KBD>\</KBD>).
+</P>
+<P>
+
+The initial character and types of fields recognized are:
+</P>
+<DL COMPACT>
+<DT>`<SAMP>\</SAMP>'
+<DD>The next character has is taken literally and not interpreted as a field
+delimiter. If <KBD>\</KBD> is the last character before a <KBD>newline</KBD>,
+that <KBD>newline</KBD> is just ignored. Processing continues from the
+characters after the <KBD>newline</KBD> as though the backslash and
+<KBD>newline</KBD> were not there.
+<DT>`<SAMP>&quot;</SAMP>'
+<DD>The characters up to the next unescaped <KBD>&quot;</KBD> are taken literally,
+according to [R4RS] rules for literal strings (see section `Strings' in <CITE>Revised(4) Scheme</CITE>).
+<DT>`<SAMP>(</SAMP>', `<SAMP>%'</SAMP>'
+<DD>One scheme expression is <CODE>read</CODE> starting with this character. The
+<CODE>read</CODE> expression is evaluated, converted to a string
+(using <CODE>display</CODE>), and replaces the expression in the returned
+field.
+<DT>`<SAMP>;</SAMP>'
+<DD>Semicolon delimits a command. Using semicolons more than one command
+can appear on a line. Escaped semicolons and semicolons inside strings
+do not delimit commands.
+</DL>
+<P>
+
+The comment field differs from the previous fields in that it must be
+the first character of a command or appear after whitespace in order to
+be recognized. <KBD>#</KBD> can be part of fields if these conditions are
+not met. For instance, <CODE>ab#c</CODE> is just the field ab#c.
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>#</SAMP>'
+<DD>Introduces a comment. The comment continues to the end of the line on
+which the semicolon appears. Comments are treated as whitespace by
+<CODE>read-dommand-line</CODE> and backslashes before <KBD>newline</KBD>s in
+comments are also ignored.
+</DL>
+</DL>
+<P>
+
+<A NAME="IDX244"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>read-options-file</B> <I>filename</I>
+<DD><P>
+
+<CODE>read-options-file</CODE> converts an <EM>options file</EM> into a list of
+<A NAME="IDX245"></A>
+<A NAME="IDX246"></A>
+strings suitable for parsing by <CODE>getopt</CODE>. The syntax of options
+files is the same as the syntax for command
+lines, except that <KBD>newline</KBD>s do not terminate reading (only <KBD>;</KBD>
+or end of file).
+</P>
+<P>
+
+If an end of file is encountered before any characters are found that
+can begin an object or comment, then an end of file object is returned.
+</P>
+</DL>
+<P>
+
+<A NAME="Parameter lists"></A>
+<HR SIZE="6">
+<A NAME="SEC65"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC64"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC66"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.4.4 Parameter lists </H3>
+<!--docid::SEC65::-->
+<P>
+
+<CODE>(require 'parameters)</CODE>
+<A NAME="IDX247"></A>
+</P>
+<P>
+
+Arguments to procedures in scheme are distinguished from each other by
+their position in the procedure call. This can be confusing when a
+procedure takes many arguments, many of which are not often used.
+</P>
+<P>
+
+A <EM>parameter-list</EM> is a way of passing named information to a
+procedure. Procedures are also defined to set unused parameters to
+default values, check parameters, and combine parameter lists.
+</P>
+<P>
+
+A <VAR>parameter</VAR> has the form <CODE>(parameter-name value1
+<small>...</small>)</CODE>. This format allows for more than one value per
+parameter-name.
+</P>
+<P>
+
+A <VAR>parameter-list</VAR> is a list of <VAR>parameter</VAR>s, each with a
+different <VAR>parameter-name</VAR>.
+</P>
+<P>
+
+<A NAME="IDX248"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-parameter-list</B> <I>parameter-names</I>
+<DD>Returns an empty parameter-list with slots for <VAR>parameter-names</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX249"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>parameter-list-ref</B> <I>parameter-list parameter-name</I>
+<DD><VAR>parameter-name</VAR> must name a valid slot of <VAR>parameter-list</VAR>.
+<CODE>parameter-list-ref</CODE> returns the value of parameter
+<VAR>parameter-name</VAR> of <VAR>parameter-list</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX250"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>remove-parameter</B> <I>parameter-name parameter-list</I>
+<DD>Removes the parameter <VAR>parameter-name</VAR> from <VAR>parameter-list</VAR>.
+<CODE>remove-parameter</CODE> does not alter the argument
+<VAR>parameter-list</VAR>.
+<P>
+
+If there are more than one <VAR>parameter-name</VAR> parameters, an error is
+signaled.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX251"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>adjoin-parameters!</B> <I>parameter-list parameter1 <small>...</small></I>
+<DD>Returns <VAR>parameter-list</VAR> with <VAR>parameter1</VAR> <small>...</small> merged in.
+</DL>
+<P>
+
+<A NAME="IDX252"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>parameter-list-expand</B> <I>expanders parameter-list</I>
+<DD><VAR>expanders</VAR> is a list of procedures whose order matches the order of
+the <VAR>parameter-name</VAR>s in the call to <CODE>make-parameter-list</CODE>
+which created <VAR>parameter-list</VAR>. For each non-false element of
+<VAR>expanders</VAR> that procedure is mapped over the corresponding
+parameter value and the returned parameter lists are merged into
+<VAR>parameter-list</VAR>.
+<P>
+
+This process is repeated until <VAR>parameter-list</VAR> stops growing. The
+value returned from <CODE>parameter-list-expand</CODE> is unspecified.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX253"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>fill-empty-parameters</B> <I>defaulters parameter-list</I>
+<DD><VAR>defaulters</VAR> is a list of procedures whose order matches the order
+of the <VAR>parameter-name</VAR>s in the call to <CODE>make-parameter-list</CODE>
+which created <VAR>parameter-list</VAR>. <CODE>fill-empty-parameters</CODE>
+returns a new parameter-list with each empty parameter replaced with the
+list returned by calling the corresponding <VAR>defaulter</VAR> with
+<VAR>parameter-list</VAR> as its argument.
+</DL>
+<P>
+
+<A NAME="IDX254"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>check-parameters</B> <I>checks parameter-list</I>
+<DD><VAR>checks</VAR> is a list of procedures whose order matches the order of
+the <VAR>parameter-name</VAR>s in the call to <CODE>make-parameter-list</CODE>
+which created <VAR>parameter-list</VAR>.
+<P>
+
+<CODE>check-parameters</CODE> returns <VAR>parameter-list</VAR> if each <VAR>check</VAR>
+of the corresponding <VAR>parameter-list</VAR> returns non-false. If some
+<VAR>check</VAR> returns <CODE>#f</CODE> a warning is signaled.
+</P>
+</DL>
+<P>
+
+In the following procedures <VAR>arities</VAR> is a list of symbols. The
+elements of <CODE>arities</CODE> can be:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>single</CODE>
+<DD>Requires a single parameter.
+<DT><CODE>optional</CODE>
+<DD>A single parameter or no parameter is acceptable.
+<DT><CODE>boolean</CODE>
+<DD>A single boolean parameter or zero parameters is acceptable.
+<DT><CODE>nary</CODE>
+<DD>Any number of parameters are acceptable.
+<DT><CODE>nary1</CODE>
+<DD>One or more of parameters are acceptable.
+</DL>
+<P>
+
+<A NAME="IDX255"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>parameter-list-&gt;arglist</B> <I>positions arities parameter-list</I>
+<DD>Returns <VAR>parameter-list</VAR> converted to an argument list. Parameters
+of <VAR>arity</VAR> type <CODE>single</CODE> and <CODE>boolean</CODE> are converted to
+the single value associated with them. The other <VAR>arity</VAR> types are
+converted to lists of the value(s).
+<P>
+
+<VAR>positions</VAR> is a list of positive integers whose order matches the
+order of the <VAR>parameter-name</VAR>s in the call to
+<CODE>make-parameter-list</CODE> which created <VAR>parameter-list</VAR>. The
+integers specify in which argument position the corresponding parameter
+should appear.
+</P>
+</DL>
+<P>
+
+<A NAME="Getopt Parameter lists"></A>
+<HR SIZE="6">
+<A NAME="SEC66"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC65"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC67"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.4.5 Getopt Parameter lists </H3>
+<!--docid::SEC66::-->
+<P>
+
+<CODE>(require 'getopt-parameters)</CODE>
+<A NAME="IDX256"></A>
+</P>
+<P>
+
+<A NAME="IDX257"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>getopt-&gt;parameter-list</B> <I>optnames arities types aliases desc <small>...</small></I>
+<DD><P>
+
+Returns <VAR>*argv*</VAR> converted to a parameter-list. <VAR>optnames</VAR> are
+the parameter-names. <VAR>arities</VAR> and <VAR>types</VAR> are lists of symbols
+corresponding to <VAR>optnames</VAR>.
+</P>
+<P>
+
+<VAR>aliases</VAR> is a list of lists of strings or integers paired with
+elements of <VAR>optnames</VAR>. Each one-character string will be treated
+as a single `<SAMP>-</SAMP>' option by <CODE>getopt</CODE>. Longer strings will be
+treated as long-named options (see section <A HREF="slib_4.html#SEC62">getopt--</A>).
+</P>
+<P>
+
+If the <VAR>aliases</VAR> association list has only strings as its
+<CODE>car</CODE>s, then all the option-arguments after an option (and before
+the next option) are adjoined to that option.
+</P>
+<P>
+
+If the <VAR>aliases</VAR> association list has integers, then each (string)
+option will take at most one option-argument. Unoptioned arguments are
+collected in a list. A `<SAMP>-1</SAMP>' alias will take the last argument in
+this list; `<SAMP>+1</SAMP>' will take the first argument in the list. The
+aliases -2 then +2; -3 then +3; <small>...</small> are tried so long as a positive
+or negative consecutive alias is found and arguments remain in the list.
+Finally a `<SAMP>0</SAMP>' alias, if found, absorbs any remaining arguments.
+</P>
+<P>
+
+In all cases, if unclaimed arguments remain after processing, a warning
+is signaled and #f is returned.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX258"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>getopt-&gt;arglist</B> <I>optnames positions arities types defaulters checks aliases desc <small>...</small></I>
+<DD><P>
+
+Like <CODE>getopt-&gt;parameter-list</CODE>, but converts <VAR>*argv*</VAR> to an
+argument-list as specified by <VAR>optnames</VAR>, <VAR>positions</VAR>,
+<VAR>arities</VAR>, <VAR>types</VAR>, <VAR>defaulters</VAR>, <VAR>checks</VAR>, and
+<VAR>aliases</VAR>. If the options supplied violate the <VAR>arities</VAR> or
+<VAR>checks</VAR> constraints, then a warning is signaled and #f is returned.
+</P>
+</DL>
+These <CODE>getopt</CODE> functions can be used with SLIB relational
+databases. For an example, See section <A HREF="slib_6.html#SEC142">make-command-server</A>.
+<P>
+
+If errors are encountered while processing options, directions for using
+the options (and argument strings <VAR>desc</VAR> <small>...</small>) are printed to
+<CODE>current-error-port</CODE>.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(begin
+ (set! *optind* 1)
+ (set! *argv* '(&quot;cmd&quot; &quot;-?&quot;)
+ (getopt-&gt;parameter-list
+ '(flag number symbols symbols string flag2 flag3 num2 num3)
+ '(boolean optional nary1 nary single boolean boolean nary nary)
+ '(boolean integer symbol symbol string boolean boolean integer integer)
+ '((&quot;flag&quot; flag)
+ (&quot;f&quot; flag)
+ (&quot;Flag&quot; flag2)
+ (&quot;B&quot; flag3)
+ (&quot;optional&quot; number)
+ (&quot;o&quot; number)
+ (&quot;nary1&quot; symbols)
+ (&quot;N&quot; symbols)
+ (&quot;nary&quot; symbols)
+ (&quot;n&quot; symbols)
+ (&quot;single&quot; string)
+ (&quot;s&quot; string)
+ (&quot;a&quot; num2)
+ (&quot;Abs&quot; num3))))
+-|
+Usage: cmd [OPTION ARGUMENT ...] ...
+
+ -f, --flag
+ -o, --optional=&lt;number&gt;
+ -n, --nary=&lt;symbols&gt; ...
+ -N, --nary1=&lt;symbols&gt; ...
+ -s, --single=&lt;string&gt;
+ --Flag
+ -B
+ -a &lt;num2&gt; ...
+ --Abs=&lt;num3&gt; ...
+
+ERROR: getopt-&gt;parameter-list &quot;unrecognized option&quot; &quot;-?&quot;
+</pre></td></tr></table><P>
+
+<A NAME="Filenames"></A>
+<HR SIZE="6">
+<A NAME="SEC67"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC66"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC68"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.4.6 Filenames </H3>
+<!--docid::SEC67::-->
+<P>
+
+<CODE>(require 'filename)</CODE> or <CODE>(require 'glob)</CODE>
+<A NAME="IDX259"></A>
+<A NAME="IDX260"></A>
+</P>
+<P>
+
+<A NAME="IDX261"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>filename:match??</B> <I>pattern</I>
+<DD><A NAME="IDX262"></A>
+<DT><U>Function:</U> <B>filename:match-ci??</B> <I>pattern</I>
+<DD><P>
+
+Returns a predicate which returns a non-false value if its string argument
+matches (the string) <VAR>pattern</VAR>, false otherwise. Filename matching
+is like
+<A NAME="IDX263"></A>
+<EM>glob</EM> expansion described the bash manpage, except that names
+<A NAME="IDX264"></A>
+beginning with `<SAMP>.</SAMP>' are matched and `<SAMP>/</SAMP>' characters are not
+treated specially.
+</P>
+<P>
+
+These functions interpret the following characters specially in
+<VAR>pattern</VAR> strings:
+</P>
+<DL COMPACT>
+<DT>`<SAMP>*</SAMP>'
+<DD>Matches any string, including the null string.
+<DT>`<SAMP>?</SAMP>'
+<DD>Matches any single character.
+<DT>`<SAMP>[<small>...</small>]</SAMP>'
+<DD>Matches any one of the enclosed characters. A pair of characters
+separated by a minus sign (-) denotes a range; any character lexically
+between those two characters, inclusive, is matched. If the first
+character following the `<SAMP>[</SAMP>' is a `<SAMP>!</SAMP>' or a `<SAMP>^</SAMP>' then any
+character not enclosed is matched. A `<SAMP>-</SAMP>' or `<SAMP>]</SAMP>' may be
+matched by including it as the first or last character in the set.
+</DL>
+</DL>
+<P>
+
+<A NAME="IDX265"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>filename:substitute??</B> <I>pattern template</I>
+<DD><A NAME="IDX266"></A>
+<DT><U>Function:</U> <B>filename:substitute-ci??</B> <I>pattern template</I>
+<DD><P>
+
+Returns a function transforming a single string argument according to
+glob patterns <VAR>pattern</VAR> and <VAR>template</VAR>. <VAR>pattern</VAR> and
+<VAR>template</VAR> must have the same number of wildcard specifications,
+which need not be identical. <VAR>pattern</VAR> and <VAR>template</VAR> may have
+a different number of literal sections. If an argument to the function
+matches <VAR>pattern</VAR> in the sense of <CODE>filename:match??</CODE> then it
+returns a copy of <VAR>template</VAR> in which each wildcard specification is
+replaced by the part of the argument matched by the corresponding
+wildcard specification in <VAR>pattern</VAR>. A <CODE>*</CODE> wildcard matches
+the longest leftmost string possible. If the argument does not match
+<VAR>pattern</VAR> then false is returned.
+</P>
+<P>
+
+<VAR>template</VAR> may be a function accepting the same number of string
+arguments as there are wildcard specifications in <VAR>pattern</VAR>. In
+the case of a match the result of applying <VAR>template</VAR> to a list
+of the substrings matched by wildcard specifications will be returned,
+otherwise <VAR>template</VAR> will not be called and <CODE>#f</CODE> will be returned.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((filename:substitute?? &quot;scm_[0-9]*.html&quot; &quot;scm5c4_??.htm&quot;)
+ &quot;scm_10.html&quot;)
+=> &quot;scm5c4_10.htm&quot;
+((filename:substitute?? &quot;??&quot; &quot;beg?mid?end&quot;) &quot;AZ&quot;)
+=> &quot;begAmidZend&quot;
+((filename:substitute?? &quot;*na*&quot; &quot;?NA?&quot;) &quot;banana&quot;)
+=> &quot;banaNA&quot;
+((filename:substitute?? &quot;?*?&quot; (lambda (s1 s2 s3) (string-append s3 s1)))
+ &quot;ABZ&quot;)
+=> &quot;ZA&quot;
+</pre></td></tr></table><P>
+
+<A NAME="IDX267"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>replace-suffix</B> <I>str old new</I>
+<DD><P>
+
+<VAR>str</VAR> can be a string or a list of strings. Returns a new string
+(or strings) similar to <CODE>str</CODE> but with the suffix string <VAR>old</VAR>
+removed and the suffix string <VAR>new</VAR> appended. If the end of
+<VAR>str</VAR> does not match <VAR>old</VAR>, an error is signaled.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(replace-suffix &quot;/usr/local/lib/slib/batch.scm&quot; &quot;.scm&quot; &quot;.c&quot;)
+=> &quot;/usr/local/lib/slib/batch.c&quot;
+</pre></td></tr></table><P>
+
+<A NAME="IDX268"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>call-with-tmpnam</B> <I>proc k</I>
+<DD><P>
+
+<A NAME="IDX269"></A>
+<DT><U>Function:</U> <B>call-with-tmpnam</B> <I>proc</I>
+<DD>Calls <VAR>proc</VAR> with <VAR>k</VAR> arguments, strings returned by successive calls to
+<CODE>tmpnam</CODE>.
+If <VAR>proc</VAR> returns, then any files named by the arguments to <VAR>proc</VAR> are
+deleted automatically and the value(s) yielded by the <VAR>proc</VAR> is(are)
+returned. <VAR>k</VAR> may be ommited, in which case it defaults to <CODE>1</CODE>.
+</P>
+<P>
+
+<A NAME="IDX270"></A>
+<DT><U>Function:</U> <B>call-with-tmpnam</B> <I>proc suffix1 <small>...</small></I>
+<DD>Calls <VAR>proc</VAR> with strings returned by successive calls to <CODE>tmpnam</CODE>,
+each with the corresponding <VAR>suffix</VAR> string appended.
+If <VAR>proc</VAR> returns, then any files named by the arguments to <VAR>proc</VAR> are
+deleted automatically and the value(s) yielded by the <VAR>proc</VAR> is(are)
+returned.
+</P>
+</DL>
+<P>
+
+<A NAME="Batch"></A>
+<HR SIZE="6">
+<A NAME="SEC68"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC67"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC69"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.4.7 Batch </H3>
+<!--docid::SEC68::-->
+<P>
+
+<CODE>(require 'batch)</CODE>
+<A NAME="IDX271"></A>
+</P>
+<P>
+
+The batch procedures provide a way to write and execute portable scripts
+for a variety of operating systems. Each <CODE>batch:</CODE> procedure takes
+as its first argument a parameter-list (see section <A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A>). This
+parameter-list argument <VAR>parms</VAR> contains named associations. Batch
+currently uses 2 of these:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>batch-port</CODE>
+<DD>The port on which to write lines of the batch file.
+<DT><CODE>batch-dialect</CODE>
+<DD>The syntax of batch file to generate. Currently supported are:
+<UL>
+<LI>
+unix
+<LI>
+dos
+<LI>
+vms
+<LI>
+amigaos
+<LI>
+system
+<LI>
+*unknown*
+</UL>
+</DL>
+<P>
+
+`<TT>batch.scm</TT>' uses 2 enhanced relational tables
+(see section <A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A>) to store information linking the names of
+<CODE>operating-system</CODE>s to <CODE>batch-dialect</CODE>es.
+</P>
+<P>
+
+<A NAME="IDX272"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:initialize!</B> <I>database</I>
+<DD>Defines <CODE>operating-system</CODE> and <CODE>batch-dialect</CODE> tables and adds
+the domain <CODE>operating-system</CODE> to the enhanced relational database
+<VAR>database</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX273"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*operating-system*</B>
+<DD>Is batch's best guess as to which operating-system it is running under.
+<CODE>*operating-system*</CODE> is set to <CODE>(software-type)</CODE>
+(see section <A HREF="slib_2.html#SEC15">2.2 Configuration</A>) unless <CODE>(software-type)</CODE> is <CODE>unix</CODE>,
+in which case finer distinctions are made.
+</DL>
+<P>
+
+<A NAME="IDX274"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:call-with-output-script</B> <I>parms file proc</I>
+<DD><VAR>proc</VAR> should be a procedure of one argument. If <VAR>file</VAR> is an
+output-port, <CODE>batch:call-with-output-script</CODE> writes an appropriate
+header to <VAR>file</VAR> and then calls <VAR>proc</VAR> with <VAR>file</VAR> as the
+only argument. If <VAR>file</VAR> is a string,
+<CODE>batch:call-with-output-script</CODE> opens a output-file of name
+<VAR>file</VAR>, writes an appropriate header to <VAR>file</VAR>, and then calls
+<VAR>proc</VAR> with the newly opened port as the only argument. Otherwise,
+<CODE>batch:call-with-output-script</CODE> acts as if it was called with the
+result of <CODE>(current-output-port)</CODE> as its third argument.
+</DL>
+<P>
+
+The rest of the <CODE>batch:</CODE> procedures write (or execute if
+<CODE>batch-dialect</CODE> is <CODE>system</CODE>) commands to the batch port which
+has been added to <VAR>parms</VAR> or <CODE>(copy-tree <VAR>parms</VAR>)</CODE> by the
+code:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(adjoin-parameters! <VAR>parms</VAR> (list 'batch-port <VAR>port</VAR>))
+</pre></td></tr></table><P>
+
+<A NAME="IDX275"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:command</B> <I>parms string1 string2 <small>...</small></I>
+<DD>Calls <CODE>batch:try-command</CODE> (below) with arguments, but signals an
+error if <CODE>batch:try-command</CODE> returns <CODE>#f</CODE>.
+</DL>
+<P>
+
+These functions return a non-false value if the command was successfully
+translated into the batch dialect and <CODE>#f</CODE> if not. In the case of
+the <CODE>system</CODE> dialect, the value is non-false if the operation
+suceeded.
+</P>
+<P>
+
+<A NAME="IDX276"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:try-command</B> <I>parms string1 string2 <small>...</small></I>
+<DD>Writes a command to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which executes
+the program named <VAR>string1</VAR> with arguments <VAR>string2</VAR> <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX277"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:try-chopped-command</B> <I>parms arg1 arg2 <small>...</small> list</I>
+<DD>breaks the last argument <VAR>list</VAR> into chunks small enough so that the
+command:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><VAR>arg1</VAR> <VAR>arg2</VAR> <small>...</small> <VAR>chunk</VAR>
+</pre></td></tr></table><P>
+
+fits withing the platform's maximum command-line length.
+</P>
+<P>
+
+<CODE>batch:try-chopped-command</CODE> calls <CODE>batch:try-command</CODE> with the
+command and returns non-false only if the commands all fit and
+<CODE>batch:try-command</CODE> of each command line returned non-false.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX278"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:run-script</B> <I>parms string1 string2 <small>...</small></I>
+<DD>Writes a command to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which executes
+the batch script named <VAR>string1</VAR> with arguments <VAR>string2</VAR>
+<small>...</small>.
+<P>
+
+<EM>Note:</EM> <CODE>batch:run-script</CODE> and <CODE>batch:try-command</CODE> are not the
+same for some operating systems (VMS).
+</P>
+</DL>
+<P>
+
+<A NAME="IDX279"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:comment</B> <I>parms line1 <small>...</small></I>
+<DD>Writes comment lines <VAR>line1</VAR> <small>...</small> to the <CODE>batch-port</CODE> in
+<VAR>parms</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX280"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:lines-&gt;file</B> <I>parms file line1 <small>...</small></I>
+<DD>Writes commands to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which create a
+file named <VAR>file</VAR> with contents <VAR>line1</VAR> <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX281"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:delete-file</B> <I>parms file</I>
+<DD>Writes a command to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which deletes
+the file named <VAR>file</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX282"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:rename-file</B> <I>parms old-name new-name</I>
+<DD>Writes a command to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which renames
+the file <VAR>old-name</VAR> to <VAR>new-name</VAR>.
+</DL>
+<P>
+
+In addition, batch provides some small utilities very useful for writing
+scripts:
+</P>
+<P>
+
+<A NAME="IDX283"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>truncate-up-to</B> <I>path char</I>
+<DD><A NAME="IDX284"></A>
+<DT><U>Function:</U> <B>truncate-up-to</B> <I>path string</I>
+<DD><A NAME="IDX285"></A>
+<DT><U>Function:</U> <B>truncate-up-to</B> <I>path charlist</I>
+<DD><VAR>path</VAR> can be a string or a list of strings. Returns <VAR>path</VAR>
+sans any prefixes ending with a character of the second argument. This
+can be used to derive a filename moved locally from elsewhere.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(truncate-up-to &quot;/usr/local/lib/slib/batch.scm&quot; &quot;/&quot;)
+=> &quot;batch.scm&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX286"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>string-join</B> <I>joiner string1 <small>...</small></I>
+<DD>Returns a new string consisting of all the strings <VAR>string1</VAR> <small>...</small>
+in order appended together with the string <VAR>joiner</VAR> between each
+adjacent pair.
+</DL>
+<P>
+
+<A NAME="IDX287"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>must-be-first</B> <I>list1 list2</I>
+<DD>Returns a new list consisting of the elements of <VAR>list2</VAR> ordered so
+that if some elements of <VAR>list1</VAR> are <CODE>equal?</CODE> to elements of
+<VAR>list2</VAR>, then those elements will appear first and in the order of
+<VAR>list1</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX288"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>must-be-last</B> <I>list1 list2</I>
+<DD>Returns a new list consisting of the elements of <VAR>list1</VAR> ordered so
+that if some elements of <VAR>list2</VAR> are <CODE>equal?</CODE> to elements of
+<VAR>list1</VAR>, then those elements will appear last and in the order of
+<VAR>list2</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX289"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>os-&gt;batch-dialect</B> <I>osname</I>
+<DD>Returns its best guess for the <CODE>batch-dialect</CODE> to be used for the
+operating-system named <VAR>osname</VAR>. <CODE>os-&gt;batch-dialect</CODE> uses the
+tables added to <VAR>database</VAR> by <CODE>batch:initialize!</CODE>.
+</DL>
+<P>
+
+Here is an example of the use of most of batch's procedures:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'databases)
+<A NAME="IDX290"></A>(require 'parameters)
+<A NAME="IDX291"></A>(require 'batch)
+<A NAME="IDX292"></A>(require 'glob)
+<A NAME="IDX293"></A>
+(define batch (create-database #f 'alist-table))
+(batch:initialize! batch)
+
+(define my-parameters
+ (list (list 'batch-dialect (os-&gt;batch-dialect *operating-system*))
+ (list 'operating-system *operating-system*)
+ (list 'batch-port (current-output-port)))) ;gets filled in later
+
+(batch:call-with-output-script
+ my-parameters
+ &quot;my-batch&quot;
+ (lambda (batch-port)
+ (adjoin-parameters! my-parameters (list 'batch-port batch-port))
+ (and
+ (batch:comment my-parameters
+ &quot;================ Write file with C program.&quot;)
+ (batch:rename-file my-parameters &quot;hello.c&quot; &quot;hello.c~&quot;)
+ (batch:lines-&gt;file my-parameters &quot;hello.c&quot;
+ &quot;#include &lt;stdio.h&gt;&quot;
+ &quot;int main(int argc, char **argv)&quot;
+ &quot;{&quot;
+ &quot; printf(\&quot;hello world\\n\&quot;);&quot;
+ &quot; return 0;&quot;
+ &quot;}&quot; )
+ (batch:command my-parameters &quot;cc&quot; &quot;-c&quot; &quot;hello.c&quot;)
+ (batch:command my-parameters &quot;cc&quot; &quot;-o&quot; &quot;hello&quot;
+ (replace-suffix &quot;hello.c&quot; &quot;.c&quot; &quot;.o&quot;))
+ (batch:command my-parameters &quot;hello&quot;)
+ (batch:delete-file my-parameters &quot;hello&quot;)
+ (batch:delete-file my-parameters &quot;hello.c&quot;)
+ (batch:delete-file my-parameters &quot;hello.o&quot;)
+ (batch:delete-file my-parameters &quot;my-batch&quot;)
+ )))
+</pre></td></tr></table><P>
+
+Produces the file `<TT>my-batch</TT>':
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>#! /bin/sh
+# &quot;my-batch&quot; script created by SLIB/batch Sun Oct 31 18:24:10 1999
+# ================ Write file with C program.
+mv -f hello.c hello.c~
+rm -f hello.c
+echo '#include &lt;stdio.h&gt;'&gt;&gt;hello.c
+echo 'int main(int argc, char **argv)'&gt;&gt;hello.c
+echo '{'&gt;&gt;hello.c
+echo ' printf(&quot;hello world\n&quot;);'&gt;&gt;hello.c
+echo ' return 0;'&gt;&gt;hello.c
+echo '}'&gt;&gt;hello.c
+cc -c hello.c
+cc -o hello hello.o
+hello
+rm -f hello
+rm -f hello.c
+rm -f hello.o
+rm -f my-batch
+</pre></td></tr></table><P>
+
+When run, `<TT>my-batch</TT>' prints:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>bash$ my-batch
+mv: hello.c: No such file or directory
+hello world
+</pre></td></tr></table><P>
+
+<A NAME="HTML"></A>
+<HR SIZE="6">
+<A NAME="SEC69"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC68"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC70"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.5 HTML </H2>
+<!--docid::SEC69::-->
+<P>
+
+<CODE>(require 'html-form)</CODE>
+<A NAME="IDX294"></A>
+</P>
+<P>
+
+<A NAME="IDX295"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:atval</B> <I>txt</I>
+<DD>Returns a string with character substitutions appropriate to
+send <VAR>txt</VAR> as an <EM>attribute-value</EM>.
+<A NAME="IDX296"></A>
+</DL>
+<P>
+
+<A NAME="IDX297"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:plain</B> <I>txt</I>
+<DD>Returns a string with character substitutions appropriate to
+send <VAR>txt</VAR> as an <EM>plain-text</EM>.
+<A NAME="IDX298"></A>
+</DL>
+<P>
+
+<A NAME="IDX299"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:meta</B> <I>name content</I>
+<DD>Returns a tag of meta-information suitable for passing as the
+third argument to <CODE>html:head</CODE>. The tag produced is `<SAMP>&lt;META
+NAME=&quot;<VAR>name</VAR>&quot; CONTENT=&quot;<VAR>content</VAR>&quot;&gt;</SAMP>'. The string or symbol <VAR>name</VAR> can be
+`<SAMP>author</SAMP>', `<SAMP>copyright</SAMP>', `<SAMP>keywords</SAMP>', `<SAMP>description</SAMP>',
+`<SAMP>date</SAMP>', `<SAMP>robots</SAMP>', <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX300"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:http-equiv</B> <I>name content</I>
+<DD>Returns a tag of HTTP information suitable for passing as the
+third argument to <CODE>html:head</CODE>. The tag produced is `<SAMP>&lt;META
+HTTP-EQUIV=&quot;<VAR>name</VAR>&quot; CONTENT=&quot;<VAR>content</VAR>&quot;&gt;</SAMP>'. The string or symbol <VAR>name</VAR> can be
+`<SAMP>Expires</SAMP>', `<SAMP>PICS-Label</SAMP>', `<SAMP>Content-Type</SAMP>',
+`<SAMP>Refresh</SAMP>', <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX301"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:meta-refresh</B> <I>delay uri</I>
+<DD><P>
+
+<A NAME="IDX302"></A>
+<DT><U>Function:</U> <B>html:meta-refresh</B> <I>delay</I>
+<DD></P>
+<P>
+
+Returns a tag suitable for passing as the third argument to
+<CODE>html:head</CODE>. If <VAR>uri</VAR> argument is supplied, then <VAR>delay</VAR> seconds after
+displaying the page with this tag, Netscape or IE browsers will fetch
+and display <VAR>uri</VAR>. Otherwise, <VAR>delay</VAR> seconds after displaying the page with
+this tag, Netscape or IE browsers will fetch and redisplay this page.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX303"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:head</B> <I>title backlink tags <small>...</small></I>
+<DD><P>
+
+<A NAME="IDX304"></A>
+<DT><U>Function:</U> <B>html:head</B> <I>title backlink</I>
+<DD></P>
+<P>
+
+<A NAME="IDX305"></A>
+<DT><U>Function:</U> <B>html:head</B> <I>title</I>
+<DD></P>
+<P>
+
+Returns header string for an HTML page named <VAR>title</VAR>. If <VAR>backlink</VAR> is a string,
+it is used verbatim between the `<SAMP>H1</SAMP>' tags; otherwise <VAR>title</VAR> is
+used. If string arguments <VAR>tags</VAR> ... are supplied, then they are
+included verbatim within the <TT>&lt;HEAD&gt;</TT> section.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX306"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:body</B> <I>body <small>...</small></I>
+<DD>Returns HTML string to end a page.
+</DL>
+<P>
+
+<A NAME="IDX307"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:pre</B> <I>line1 line <small>...</small></I>
+<DD>Returns the strings <VAR>line1</VAR>, <VAR>lines</VAR> as <EM>PRE</EM>formmated plain text
+<A NAME="IDX308"></A>
+(rendered in fixed-width font). Newlines are inserted between <VAR>line1</VAR>,
+<VAR>lines</VAR>. HTML tags (`<SAMP>&lt;tag&gt;</SAMP>') within <VAR>lines</VAR> will be visible verbatim.
+</DL>
+<P>
+
+<A NAME="IDX309"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:comment</B> <I>line1 line <small>...</small></I>
+<DD>Returns the strings <VAR>line1</VAR> as HTML comments.
+</DL>
+<HR SIZE="6">
+<A NAME="SEC70"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC69"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC71"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.6 HTML Forms </H2>
+<!--docid::SEC70::-->
+<P>
+
+<A NAME="IDX310"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:form</B> <I>method action body <small>...</small></I>
+<DD>The symbol <VAR>method</VAR> is either <CODE>get</CODE>, <CODE>head</CODE>, <CODE>post</CODE>,
+<CODE>put</CODE>, or <CODE>delete</CODE>. The strings <VAR>body</VAR> form the body of the
+form. <CODE>html:form</CODE> returns the HTML <EM>form</EM>.
+<A NAME="IDX311"></A>
+</DL>
+<P>
+
+<A NAME="IDX312"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:hidden</B> <I>name value</I>
+<DD>Returns HTML string which will cause <VAR>name</VAR>=<VAR>value</VAR> in form.
+</DL>
+<P>
+
+<A NAME="IDX313"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:checkbox</B> <I>pname default</I>
+<DD>Returns HTML string for check box.
+</DL>
+<P>
+
+<A NAME="IDX314"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:text</B> <I>pname default size <small>...</small></I>
+<DD>Returns HTML string for one-line text box.
+</DL>
+<P>
+
+<A NAME="IDX315"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:text-area</B> <I>pname default-list</I>
+<DD>Returns HTML string for multi-line text box.
+</DL>
+<P>
+
+<A NAME="IDX316"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:select</B> <I>pname arity default-list foreign-values</I>
+<DD>Returns HTML string for pull-down menu selector.
+</DL>
+<P>
+
+<A NAME="IDX317"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:buttons</B> <I>pname arity default-list foreign-values</I>
+<DD>Returns HTML string for any-of selector.
+</DL>
+<P>
+
+<A NAME="IDX318"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:submit</B> <I>submit-label command</I>
+<DD><P>
+
+<A NAME="IDX319"></A>
+<DT><U>Function:</U> <B>form:submit</B> <I>submit-label</I>
+<DD></P>
+<P>
+
+The string or symbol <VAR>submit-label</VAR> appears on the button which submits the form.
+If the optional second argument <VAR>command</VAR> is given, then <CODE>*command*=<VAR>command</VAR></CODE>
+and <CODE>*button*=<VAR>submit-label</VAR></CODE> are set in the query. Otherwise,
+<CODE>*command*=<VAR>submit-label</VAR></CODE> is set in the query.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX320"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:image</B> <I>submit-label image-src</I>
+<DD>The <VAR>image-src</VAR> appears on the button which submits the form.
+</DL>
+<P>
+
+<A NAME="IDX321"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:reset</B>
+<DD>Returns a string which generates a <EM>reset</EM> button.
+<A NAME="IDX322"></A>
+</DL>
+<P>
+
+<A NAME="IDX323"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:element</B> <I>pname arity default-list foreign-values</I>
+<DD>Returns a string which generates an INPUT element for the field
+named <VAR>pname</VAR>. The element appears in the created form with its
+representation determined by its <VAR>arity</VAR> and domain. For domains which
+are foreign-keys:
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>single</CODE>
+<DD>select menu
+<DT><CODE>optional</CODE>
+<DD>select menu
+<DT><CODE>nary</CODE>
+<DD>check boxes
+<DT><CODE>nary1</CODE>
+<DD>check boxes
+</DL>
+<P>
+
+If the foreign-key table has a field named `<SAMP>visible-name</SAMP>', then
+the contents of that field are the names visible to the user for
+those choices. Otherwise, the foreign-key itself is visible.
+</P>
+<P>
+
+For other types of domains:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>single</CODE>
+<DD>text area
+<DT><CODE>optional</CODE>
+<DD>text area
+<DT><CODE>boolean</CODE>
+<DD>check box
+<DT><CODE>nary</CODE>
+<DD>text area
+<DT><CODE>nary1</CODE>
+<DD>text area
+</DL>
+</DL>
+<P>
+
+<A NAME="IDX324"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:delimited</B> <I>pname doc aliat arity default-list foreign-values</I>
+<DD><P>
+
+Returns a HTML string for a form element embedded in a line of a
+delimited list. Apply map <CODE>form:delimited</CODE> to the list returned by
+<CODE>command-&gt;p-specs</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX325"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:delimited-list</B> <I>row <small>...</small></I>
+<DD>Wraps its arguments with delimited-list (`<SAMP>DL</SAMP>' command.
+</DL>
+<P>
+
+<A NAME="IDX326"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>get-foreign-choices</B> <I>tab</I>
+<DD>Returns a list of the `<SAMP>visible-name</SAMP>' or first fields of
+table <VAR>tab</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX327"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>command-&gt;p-specs</B> <I>rdb command-table command</I>
+<DD><P>
+
+The symbol <VAR>command-table</VAR> names a command table in the <VAR>rdb</VAR> relational database.
+The symbol <VAR>command</VAR> names a key in <VAR>command-table</VAR>.
+</P>
+<P>
+
+<CODE>command-&gt;p-specs</CODE> returns a list of lists of <VAR>pname</VAR>, <VAR>doc</VAR>, <VAR>aliat</VAR>,
+<VAR>arity</VAR>, <VAR>default-list</VAR>, and <VAR>foreign-values</VAR>. The
+returned list has one element for each parameter of command <VAR>command</VAR>.
+</P>
+<P>
+
+This example demonstrates how to create a HTML-form for the `<SAMP>build</SAMP>'
+command.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require (in-vicinity (implementation-vicinity) &quot;build.scm&quot;))
+(call-with-output-file &quot;buildscm.html&quot;
+ (lambda (port)
+ (display
+ (string-append
+ (html:head 'commands)
+ (html:body
+ (sprintf #f &quot;&lt;H2&gt;%s:&lt;/H2&gt;&lt;BLOCKQUOTE&gt;%s&lt;/BLOCKQUOTE&gt;\\n&quot;
+ (html:plain 'build)
+ (html:plain ((comtab 'get 'documentation) 'build)))
+ (html:form
+ 'post
+ (or &quot;http://localhost:8081/buildscm&quot; &quot;/cgi-bin/build.cgi&quot;)
+ (apply html:delimited-list
+ (apply map form:delimited
+ (command-&gt;p-specs build '*commands* 'build)))
+ (form:submit 'build)
+ (form:reset))))
+ port)))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="HTML Tables"></A>
+<HR SIZE="6">
+<A NAME="SEC71"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC70"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC72"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.7 HTML Tables </H2>
+<!--docid::SEC71::-->
+<P>
+
+<CODE>(require 'db-&gt;html)</CODE>
+<A NAME="IDX328"></A>
+</P>
+<P>
+
+<A NAME="IDX329"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:table</B> <I>options row <small>...</small></I>
+<DD><P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX330"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:caption</B> <I>caption align</I>
+<DD><P>
+
+<A NAME="IDX331"></A>
+<DT><U>Function:</U> <B>html:caption</B> <I>caption</I>
+<DD><VAR>align</VAR> can be `<SAMP>top</SAMP>' or `<SAMP>bottom</SAMP>'.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX332"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:heading</B> <I>columns</I>
+<DD>Outputs a heading row for the currently-started table.
+</DL>
+<P>
+
+<A NAME="IDX333"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:href-heading</B> <I>columns uris</I>
+<DD>Outputs a heading row with column-names <VAR>columns</VAR> linked to URIs <VAR>uris</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX334"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:linked-row-converter</B> <I>k foreigns</I>
+<DD><P>
+
+The positive integer <VAR>k</VAR> is the primary-key-limit (number of
+primary-keys) of the table. <VAR>foreigns</VAR> is a list of the filenames of
+foreign-key field pages and #f for non foreign-key fields.
+</P>
+<P>
+
+<CODE>html:linked-row-converter</CODE> returns a procedure taking a row for its single argument. This
+returned procedure returns the html string for that table row.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX335"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>table-name-&gt;filename</B> <I>table-name</I>
+<DD><P>
+
+Returns the symbol <VAR>table-name</VAR> converted to a filename.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX336"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>table-&gt;linked-html</B> <I>caption db table-name match-key1 <small>...</small></I>
+<DD><P>
+
+Returns HTML string for <VAR>db</VAR> table <VAR>table-name</VAR>. Every foreign-key value is
+linked to the page (of the table) defining that key.
+</P>
+<P>
+
+The optional <VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a subset of
+the table. See section <A HREF="slib_6.html#SEC147">match-key</A>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX337"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>table-&gt;linked-page</B> <I>db table-name index-filename arg <small>...</small></I>
+<DD><P>
+
+Returns a complete HTML page. The string <VAR>index-filename</VAR> names the page which
+refers to this one.
+</P>
+<P>
+
+The optional <VAR>args</VAR> <small>...</small> arguments restrict actions to a subset of
+the table. See section <A HREF="slib_6.html#SEC147">match-key</A>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX338"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>catalog-&gt;html</B> <I>db caption arg <small>...</small></I>
+<DD><P>
+
+Returns HTML string for the catalog table of <VAR>db</VAR>.
+</P>
+</DL>
+<HR SIZE="6">
+<A NAME="SEC72"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC71"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC73"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.7.1 HTML editing tables </H3>
+<!--docid::SEC72::-->
+<P>
+
+A client can modify one row of an editable table at a time.
+For any change submitted, these routines check if that row has been
+modified during the time the user has been editing the form. If so,
+an error page results.
+</P>
+<P>
+
+The behavior of edited rows is:
+</P>
+<P>
+
+<UL>
+<LI>
+If no fields are changed, then no change is made to the table.
+<LI>
+If the primary keys equal null-keys (parameter defaults), and no other
+user has modified that row, then that row is deleted.
+<LI>
+If only primary keys are changed, there are non-key fields, and no
+row with the new keys is in the table, then the old row is
+deleted and one with the new keys is inserted.
+<LI>
+If only non-key fields are changed, and that row has not been
+modified by another user, then the row is changed to reflect the
+fields.
+<LI>
+If both keys and non-key fields are changed, and no row with the
+new keys is in the table, then a row is created with the new
+keys and fields.
+<LI>
+If fields are changed, all fields are primary keys, and no row with
+the new keys is in the table, then a row is created with the new
+keys.
+</UL>
+<P>
+
+After any change to the table, a <CODE>sync-database</CODE> of the
+database is performed.
+</P>
+<P>
+
+<A NAME="IDX339"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>command:modify-table</B> <I>table-name null-keys update delete retrieve</I>
+<DD><P>
+
+<A NAME="IDX340"></A>
+<DT><U>Function:</U> <B>command:modify-table</B> <I>table-name null-keys update delete</I>
+<DD></P>
+<P>
+
+<A NAME="IDX341"></A>
+<DT><U>Function:</U> <B>command:modify-table</B> <I>table-name null-keys update</I>
+<DD></P>
+<P>
+
+<A NAME="IDX342"></A>
+<DT><U>Function:</U> <B>command:modify-table</B> <I>table-name null-keys</I>
+<DD></P>
+<P>
+
+Returns procedure (of <VAR>db</VAR>) which returns procedure to modify
+row of <VAR>table-name</VAR>. <VAR>null-keys</VAR> is the list of <EM>null</EM> keys indicating the row is
+<A NAME="IDX343"></A>
+to be deleted when any matches its corresponding primary key.
+Optional arguments <VAR>update</VAR>, <VAR>delete</VAR>, and <VAR>retrieve</VAR> default to the <CODE>row:update</CODE>,
+<CODE>row:delete</CODE>, and <CODE>row:retrieve</CODE> of <VAR>table-name</VAR> in <VAR>db</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX344"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>command:make-editable-table</B> <I>rdb table-name arg <small>...</small></I>
+<DD>Given <VAR>table-name</VAR> in <VAR>rdb</VAR>, creates parameter and <CODE>*command*</CODE> tables
+for editing one row of <VAR>table-name</VAR> at a time. <CODE>command:make-editable-table</CODE> returns a procedure taking a
+row argument which returns the HTML string for editing that row.
+<P>
+
+Optional <VAR>args</VAR> are expressions (lists) added to the call to
+<CODE>command:modify-table</CODE>.
+</P>
+<P>
+
+The domain name of a column determines the expected arity of the data
+stored in that column. Domain names ending in:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>*</SAMP>'
+<DD>have arity `<SAMP>nary</SAMP>';
+<DT>`<SAMP>+</SAMP>'
+<DD>have arity `<SAMP>nary1</SAMP>'.
+</DL>
+</DL>
+<P>
+
+<A NAME="IDX345"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:editable-row-converter</B> <I>k names edit-point edit-converter</I>
+<DD><P>
+
+The positive integer <VAR>k</VAR> is the primary-key-limit (number of
+primary-keys) of the table. <VAR>names</VAR> is a list of the field-names. <VAR>edit-point</VAR> is
+the list of primary-keys denoting the row to edit (or #f). <VAR>edit-converter</VAR> is the
+procedure called with <VAR>k</VAR>, <VAR>names</VAR>, and the row to edit.
+</P>
+<P>
+
+<CODE>html:editable-row-converter</CODE> returns a procedure taking a row for its single argument. This
+returned procedure returns the html string for that table row.
+</P>
+<P>
+
+Each HTML table constructed using <CODE>html:editable-row-converter</CODE> has first <VAR>k</VAR> fields (typically
+the primary key fields) of each row linked to a text encoding of these
+fields (the result of calling <CODE>row-&gt;anchor</CODE>). The page so
+referenced typically allows the user to edit fields of that row.
+</P>
+</DL>
+<HR SIZE="6">
+<A NAME="SEC73"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC72"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC74"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.7.2 HTML databases </H3>
+<!--docid::SEC73::-->
+<P>
+
+<A NAME="IDX346"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>db-&gt;html-files</B> <I>db dir index-filename caption</I>
+<DD><VAR>db</VAR> must be a relational database. <VAR>dir</VAR> must be #f or a
+non-empty string naming an existing sub-directory of the current
+directory.
+<P>
+
+<CODE>db-&gt;html-files</CODE> creates an html page for each table in the database <VAR>db</VAR> in the
+sub-directory named <VAR>dir</VAR>, or the current directory if <VAR>dir</VAR> is #f. The
+top level page with the catalog of tables (captioned <VAR>caption</VAR>) is written
+to a file named <VAR>index-filename</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX347"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>db-&gt;html-directory</B> <I>db dir index-filename</I>
+<DD><P>
+
+<A NAME="IDX348"></A>
+<DT><U>Function:</U> <B>db-&gt;html-directory</B> <I>db dir</I>
+<DD><VAR>db</VAR> must be a relational database. <VAR>dir</VAR> must be a non-empty
+string naming an existing sub-directory of the current directory or
+one to be created. The optional string <VAR>index-filename</VAR> names the filename of the
+top page, which defaults to `<TT>index.html</TT>'.
+</P>
+<P>
+
+<CODE>db-&gt;html-directory</CODE> creates sub-directory <VAR>dir</VAR> if neccessary, and calls
+<CODE>(db-&gt;html-files <VAR>db</VAR> <VAR>dir</VAR> <VAR>index-filename</VAR> <VAR>dir</VAR>)</CODE>. The `<SAMP>file:</SAMP>' URI of <VAR>index-filename</VAR> is
+returned.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX349"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>db-&gt;netscape</B> <I>db dir index-filename</I>
+<DD><P>
+
+<A NAME="IDX350"></A>
+<DT><U>Function:</U> <B>db-&gt;netscape</B> <I>db dir</I>
+<DD><CODE>db-&gt;netscape</CODE> is just like <CODE>db-&gt;html-directory</CODE>, but calls
+<CODE>browse-url</CODE> with the uri for the top page after the
+pages are created.
+</P>
+</DL>
+<P>
+
+<A NAME="HTTP and CGI"></A>
+<HR SIZE="6">
+<A NAME="SEC74"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC73"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC75"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.8 HTTP and CGI </H2>
+<!--docid::SEC74::-->
+<P>
+
+<CODE>(require 'http)</CODE> or <CODE>(require 'cgi)</CODE>
+<A NAME="IDX351"></A>
+<A NAME="IDX352"></A>
+</P>
+<P>
+
+<A NAME="IDX353"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:header</B> <I>alist</I>
+<DD>Returns a string containing lines for each element of <VAR>alist</VAR>; the
+<CODE>car</CODE> of which is followed by `<SAMP>: </SAMP>', then the <CODE>cdr</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX354"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:content</B> <I>alist body <small>...</small></I>
+<DD>Returns the concatenation of strings <VAR>body</VAR> with the
+<CODE>(http:header <VAR>alist</VAR>)</CODE> and the `<SAMP>Content-Length</SAMP>' prepended.
+</DL>
+<P>
+
+<A NAME="IDX355"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*http:byline*</B>
+<DD>String appearing at the bottom of error pages.
+</DL>
+<P>
+
+<A NAME="IDX356"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:error-page</B> <I>status-code reason-phrase html-string <small>...</small></I>
+<DD><VAR>status-code</VAR> and <VAR>reason-phrase</VAR> should be an integer and string as specified in
+<CITE>RFC 2068</CITE>. The returned page (string) will show the <VAR>status-code</VAR> and <VAR>reason-phrase</VAR>
+and any additional <VAR>html-strings</VAR> <small>...</small>; with <VAR>*http:byline*</VAR> or SLIB's
+default at the bottom.
+</DL>
+<P>
+
+<A NAME="IDX357"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:forwarding-page</B> <I>title delay uri html-string <small>...</small></I>
+<DD>The string or symbol <VAR>title</VAR> is the page title. <VAR>delay</VAR> is a non-negative
+integer. The <VAR>html-strings</VAR> <small>...</small> are typically used to explain to the user why
+this page is being forwarded.
+<P>
+
+<CODE>http:forwarding-page</CODE> returns an HTML string for a page which automatically forwards to
+<VAR>uri</VAR> after <VAR>delay</VAR> seconds. The returned page (string) contains any <VAR>html-strings</VAR>
+<small>...</small> followed by a manual link to <VAR>uri</VAR>, in case the browser does not
+forward automatically.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX358"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:serve-query</B> <I>serve-proc input-port output-port</I>
+<DD>reads the <EM>URI</EM> and <EM>query-string</EM> from <VAR>input-port</VAR>. If the
+<A NAME="IDX359"></A>
+<A NAME="IDX360"></A>
+query is a valid `<SAMP>&quot;POST&quot;</SAMP>' or `<SAMP>&quot;GET&quot;</SAMP>' query, then <CODE>http:serve-query</CODE> calls
+<VAR>serve-proc</VAR> with three arguments, the <VAR>request-line</VAR>, <VAR>query-string</VAR>,
+and <VAR>header-alist</VAR>. Otherwise, <CODE>http:serve-query</CODE> calls <VAR>serve-proc</VAR> with the
+<VAR>request-line</VAR>, #f, and <VAR>header-alist</VAR>.
+<P>
+
+If <VAR>serve-proc</VAR> returns a string, it is sent to <VAR>output-port</VAR>. If <VAR>serve-proc</VAR> returns a list,
+then an error page with number 525 and strings from the list. If <VAR>serve-proc</VAR>
+returns #f, then a `<SAMP>Bad Request</SAMP>' (400) page is sent to <VAR>output-port</VAR>.
+</P>
+<P>
+
+Otherwise, <CODE>http:serve-query</CODE> replies (to <VAR>output-port</VAR>) with appropriate HTML describing the
+problem.
+</P>
+</DL>
+<P>
+
+This example services HTTP queries from <VAR>port-number</VAR>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>
+(define socket (make-stream-socket AF_INET 0))
+(and (socket:bind socket port-number) ; AF_INET INADDR_ANY
+ (socket:listen socket 10) ; Queue up to 10 requests.
+ (dynamic-wind
+ (lambda () #f)
+ (lambda ()
+ (do ((port (socket:accept socket) (socket:accept socket)))
+ (#f)
+ (let ((iport (duplicate-port port &quot;r&quot;))
+ (oport (duplicate-port port &quot;w&quot;)))
+ (http:serve-query build:serve iport oport)
+ (close-port iport)
+ (close-port oport))
+ (close-port port)))
+ (lambda () (close-port socket))))
+</pre></td></tr></table><P>
+
+<A NAME="IDX361"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>cgi:serve-query</B> <I>serve-proc</I>
+<DD>reads the <EM>URI</EM> and <EM>query-string</EM> from
+<A NAME="IDX362"></A>
+<A NAME="IDX363"></A>
+<CODE>(current-input-port)</CODE>. If the query is a valid `<SAMP>&quot;POST&quot;</SAMP>'
+or `<SAMP>&quot;GET&quot;</SAMP>' query, then <CODE>cgi:serve-query</CODE> calls <VAR>serve-proc</VAR> with three arguments, the
+<VAR>request-line</VAR>, <VAR>query-string</VAR>, and <VAR>header-alist</VAR>.
+Otherwise, <CODE>cgi:serve-query</CODE> calls <VAR>serve-proc</VAR> with the <VAR>request-line</VAR>, #f, and
+<VAR>header-alist</VAR>.
+<P>
+
+If <VAR>serve-proc</VAR> returns a string, it is sent to <CODE>(current-input-port)</CODE>.
+If <VAR>serve-proc</VAR> returns a list, then an error page with number 525 and strings
+from the list. If <VAR>serve-proc</VAR> returns #f, then a `<SAMP>Bad Request</SAMP>' (400)
+page is sent to <CODE>(current-input-port)</CODE>.
+</P>
+<P>
+
+Otherwise, <CODE>cgi:serve-query</CODE> replies (to <CODE>(current-input-port)</CODE>) with
+appropriate HTML describing the problem.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX364"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-query-alist-command-server</B> <I>rdb command-table</I>
+<DD><P>
+
+<A NAME="IDX365"></A>
+<DT><U>Function:</U> <B>make-query-alist-command-server</B> <I>rdb command-table #t</I>
+<DD></P>
+<P>
+
+Returns a procedure of one argument. When that procedure is called
+with a <VAR>query-alist</VAR> (as returned by <CODE>uri:decode-query</CODE>, the
+value of the `<SAMP>*command*</SAMP>' association will be the command invoked
+in <VAR>command-table</VAR>. If `<SAMP>*command*</SAMP>' is not in the <VAR>query-alist</VAR> then the
+value of `<SAMP>*suggest*</SAMP>' is tried. If neither name is in the
+<VAR>query-alist</VAR>, then the literal value `<SAMP>*default*</SAMP>' is tried in
+<VAR>command-table</VAR>.
+</P>
+<P>
+
+If optional third argument is non-false, then the command is called
+with just the parameter-list; otherwise, command is called with the
+arguments described in its table.
+</P>
+</DL>
+<P>
+
+<A NAME="Parsing HTML"></A>
+<HR SIZE="6">
+<A NAME="SEC75"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC74"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC76"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.9 Parsing HTML </H2>
+<!--docid::SEC75::-->
+<P>
+
+<CODE>(require 'html-for-each)</CODE>
+<A NAME="IDX366"></A>
+</P>
+<P>
+
+<A NAME="IDX367"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html-for-each</B> <I>file word-proc markup-proc white-proc newline-proc</I>
+<DD><P>
+
+<VAR>file</VAR> is an input port or a string naming an existing file containing
+HTML text.
+<VAR>word-proc</VAR> is a procedure of one argument or #f.
+<VAR>markup-proc</VAR> is a procedure of one argument or #f.
+<VAR>white-proc</VAR> is a procedure of one argument or #f.
+<VAR>newline-proc</VAR> is a procedure of no arguments or #f.
+</P>
+<P>
+
+<CODE>html-for-each</CODE> opens and reads characters from port <VAR>file</VAR> or the file named by
+string <VAR>file</VAR>. Sequential groups of characters are assembled into
+strings which are either
+</P>
+<P>
+
+<UL>
+<LI>
+enclosed by `<SAMP>&lt;</SAMP>' and `<SAMP>&gt;</SAMP>' (hypertext markups or comments);
+<LI>
+end-of-line;
+<LI>
+whitespace; or
+<LI>
+none of the above (words).
+</UL>
+<P>
+
+Procedures are called according to these distinctions in order of
+the string's occurrence in <VAR>file</VAR>.
+</P>
+<P>
+
+<VAR>newline-proc</VAR> is called with no arguments for end-of-line <EM>not within a
+markup or comment</EM>.
+</P>
+<P>
+
+<VAR>white-proc</VAR> is called with strings of non-newline whitespace.
+</P>
+<P>
+
+<VAR>markup-proc</VAR> is called with hypertext markup strings (including `<SAMP>&lt;</SAMP>' and
+`<SAMP>&gt;</SAMP>').
+</P>
+<P>
+
+<VAR>word-proc</VAR> is called with the remaining strings.
+</P>
+<P>
+
+<CODE>html-for-each</CODE> returns an unspecified value.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX368"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:read-title</B> <I>file limit</I>
+<DD><P>
+
+<A NAME="IDX369"></A>
+<DT><U>Function:</U> <B>html:read-title</B> <I>file</I>
+<DD><VAR>file</VAR> is an input port or a string naming an existing file containing
+HTML text. If supplied, <VAR>limit</VAR> must be an integer. <VAR>limit</VAR> defaults to
+1000.
+</P>
+<P>
+
+<CODE>html:read-title</CODE> opens and reads HTML from port <VAR>file</VAR> or the file named by string <VAR>file</VAR>,
+until reaching the (mandatory) `<SAMP>TITLE</SAMP>' field. <CODE>html:read-title</CODE> returns the
+title string with adjacent whitespaces collapsed to one space. <CODE>html:read-title</CODE>
+returns #f if the title field is empty, absent, if the first
+character read from <VAR>file</VAR> is not `<SAMP>#\&lt;</SAMP>', or if the end of title is
+not found within the first (approximately) <VAR>limit</VAR> words.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX370"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>htm-fields</B> <I>htm</I>
+<DD><P>
+
+<VAR>htm</VAR> is a hypertext markup string.
+</P>
+<P>
+
+If <VAR>htm</VAR> is a (hypertext) comment, then <CODE>htm-fields</CODE> returns #f.
+Otherwise <CODE>htm-fields</CODE> returns the hypertext element symbol (created by
+<CODE>string-ci-&gt;symbol</CODE>) consed onto an association list of the
+attribute name-symbols and values. Each value is a number or
+string; or #t if the name had no value assigned within the markup.
+</P>
+</DL>
+<P>
+
+<A NAME="URI"></A>
+<HR SIZE="6">
+<A NAME="SEC76"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC75"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.10 URI </H2>
+<!--docid::SEC76::-->
+<P>
+
+<CODE>(require 'uri)</CODE>
+<A NAME="IDX371"></A>
+</P>
+<P>
+
+Implements <EM>Uniform Resource Identifiers</EM> (URI) as
+<A NAME="IDX372"></A>
+described in RFC 2396.
+</P>
+<P>
+
+<A NAME="IDX373"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-uri</B>
+<DD><P>
+
+<A NAME="IDX374"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>fragment</I>
+<DD></P>
+<P>
+
+<A NAME="IDX375"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>query fragment</I>
+<DD></P>
+<P>
+
+<A NAME="IDX376"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>path query fragment</I>
+<DD></P>
+<P>
+
+<A NAME="IDX377"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>authority path query fragment</I>
+<DD></P>
+<P>
+
+<A NAME="IDX378"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>scheme authority path query fragment</I>
+<DD></P>
+<P>
+
+Returns a Uniform Resource Identifier string from component arguments.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX379"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri:make-path</B> <I>path</I>
+<DD><P>
+
+Returns a URI string combining the components of list <VAR>path</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX380"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:anchor</B> <I>name</I>
+<DD>Returns a string which defines this location in the (HTML) file
+as <VAR>name</VAR>. The hypertext `<SAMP>&lt;A HREF=&quot;#<VAR>name</VAR>&quot;&gt;</SAMP>' will link to this point.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(html:anchor &quot;(section 7)&quot;)
+=>
+&quot;&lt;A NAME=\&quot;(section%207)\&quot;&gt;&lt;/A&gt;&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX381"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:link</B> <I>uri highlighted</I>
+<DD>Returns a string which links the <VAR>highlighted</VAR> text to <VAR>uri</VAR>.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(html:link (make-uri &quot;(section 7)&quot;) &quot;section 7&quot;)
+=>
+&quot;&lt;A HREF=\&quot;#(section%207)\&quot;&gt;section 7&lt;/A&gt;&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX382"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:base</B> <I>uri</I>
+<DD>Returns a string specifying the <EM>base</EM> <VAR>uri</VAR> of a document, for
+<A NAME="IDX383"></A>
+inclusion in the HEAD of the document (see section <A HREF="slib_4.html#SEC69">head</A>).
+</DL>
+<P>
+
+<A NAME="IDX384"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:isindex</B> <I>prompt</I>
+<DD>Returns a string specifying the search <VAR>prompt</VAR> of a document, for
+inclusion in the HEAD of the document (see section <A HREF="slib_4.html#SEC69">head</A>).
+</DL>
+<P>
+
+<A NAME="IDX385"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri-&gt;tree</B> <I>uri-reference base-tree</I>
+<DD><P>
+
+<A NAME="IDX386"></A>
+<DT><U>Function:</U> <B>uri-&gt;tree</B> <I>uri-reference</I>
+<DD></P>
+<P>
+
+Returns a list of 5 elements corresponding to the parts
+(<VAR>scheme</VAR> <VAR>authority</VAR> <VAR>path</VAR> <VAR>query</VAR> <VAR>fragment</VAR>)
+of string <VAR>uri-reference</VAR>. Elements corresponding to absent parts are #f.
+</P>
+<P>
+
+The <VAR>path</VAR> is a list of strings. If the first string is empty,
+then the path is absolute; otherwise relative. The optional <VAR>base-tree</VAR> is a
+tree as returned by <CODE>uri-&gt;tree</CODE>; and is used as the base address for relative
+URIs.
+</P>
+<P>
+
+If the <VAR>authority</VAR> component is a
+<EM>Server-based Naming Authority</EM>, then it is a list of the
+<A NAME="IDX387"></A>
+<VAR>userinfo</VAR>, <VAR>host</VAR>, and <VAR>port</VAR> strings (or #f). For other
+types of <VAR>authority</VAR> components the <VAR>authority</VAR> will be a
+string.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(uri-&gt;tree &quot;http://www.ics.uci.edu/pub/ietf/uri/#Related&quot;)
+=>
+(http &quot;www.ics.uci.edu&quot; (&quot;&quot; &quot;pub&quot; &quot;ietf&quot; &quot;uri&quot; &quot;&quot;) #f &quot;Related&quot;)
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX388"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri:split-fields</B> <I>txt chr</I>
+<DD><P>
+
+Returns a list of <VAR>txt</VAR> split at each occurrence of <VAR>chr</VAR>. <VAR>chr</VAR> does not
+appear in the returned list of strings.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX389"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri:decode-query</B> <I>query-string</I>
+<DD>Converts a <EM>URI</EM> encoded <VAR>query-string</VAR> to a query-alist.
+<A NAME="IDX390"></A>
+</DL>
+<P>
+
+<CODE>uric:</CODE> prefixes indicate procedures dealing with
+URI-components.
+</P>
+<P>
+
+<A NAME="IDX391"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uric:encode</B> <I>uri-component allows</I>
+<DD>Returns a copy of the string <VAR>uri-component</VAR> in which all <EM>unsafe</EM> octets
+<A NAME="IDX392"></A>
+(as defined in RFC 2396) have been `<SAMP>%</SAMP>' <EM>escaped</EM>.
+<A NAME="IDX393"></A>
+<CODE>uric:decode</CODE> decodes strings encoded by <CODE>uric:encode</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX394"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uric:decode</B> <I>uri-component</I>
+<DD>Returns a copy of the string <VAR>uri-component</VAR> in which each `<SAMP>%</SAMP>' escaped
+characters in <VAR>uri-component</VAR> is replaced with the character it encodes. This
+routine is useful for showing URI contents on error pages.
+</DL>
+<P>
+
+<A NAME="IDX395"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri:path-&gt;keys</B> <I>path-list ptypes</I>
+<DD><VAR>path-list</VAR> is a path-list as returned by <CODE>uri:split-fields</CODE>. <CODE>uri:path-&gt;keys</CODE>
+returns a list of items returned by <CODE>uri:decode-path</CODE>, coerced
+to types <VAR>ptypes</VAR>.
+</DL>
+<A NAME="SEC77"></A>
+<H3> File-system Locators and Predicates </H3>
+<!--docid::SEC77::-->
+<P>
+
+<A NAME="IDX396"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>path-&gt;uri</B> <I>path</I>
+<DD>Returns a URI-string for <VAR>path</VAR> on the local host.
+</DL>
+<P>
+
+<A NAME="IDX397"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>absolute-uri?</B> <I>str</I>
+<DD>Returns #t if <VAR>str</VAR> is an absolute-URI as indicated by a
+syntactically valid (per RFC 2396) <EM>scheme</EM>; otherwise returns
+<A NAME="IDX398"></A>
+#f.
+</DL>
+<P>
+
+<A NAME="IDX399"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>absolute-path?</B> <I>file-name</I>
+<DD>Returns #t if <VAR>file-name</VAR> is a fully specified pathname (does not
+depend on the current working directory); otherwise returns #f.
+</DL>
+<P>
+
+<A NAME="IDX400"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>null-directory?</B> <I>str</I>
+<DD>Returns #t if changing directory to <VAR>str</VAR> would leave the current
+directory unchanged; otherwise returns #f.
+</DL>
+<P>
+
+<A NAME="IDX401"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>glob-pattern?</B> <I>str</I>
+<DD>Returns #t if the string <VAR>str</VAR> contains characters used for
+specifying glob patterns, namely `<SAMP>*</SAMP>', `<SAMP>?</SAMP>', or `<SAMP>[</SAMP>'.
+</DL>
+Before RFC 2396, the <EM>File Transfer Protocol</EM> (FTP) served a
+<A NAME="IDX402"></A>
+similar purpose.
+<P>
+
+<A NAME="IDX403"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>parse-ftp-address</B> <I>uri</I>
+<DD><P>
+
+Returns a list of the decoded FTP <VAR>uri</VAR>; or #f if indecipherable. FTP
+<EM>Uniform Resource Locator</EM>, <EM>ange-ftp</EM>, and <EM>getit</EM>
+<A NAME="IDX404"></A>
+<A NAME="IDX405"></A>
+<A NAME="IDX406"></A>
+formats are handled. The returned list has four elements which are
+strings or #f:
+</P>
+<P>
+
+<OL>
+<LI>
+username
+<LI>
+password
+<LI>
+remote-site
+<LI>
+remote-directory
+</OL>
+</DL>
+<P>
+
+<A NAME="Printing Scheme"></A>
+<HR SIZE="6">
+<A NAME="SEC78"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC76"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC79"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.11 Printing Scheme </H2>
+<!--docid::SEC78::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC79">4.11.1 Generic-Write</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'generic-write</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'object-&gt;string</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'pretty-print, 'pprint-file</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Generic-Write"></A>
+<HR SIZE="6">
+<A NAME="SEC79"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC80"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.11.1 Generic-Write </H3>
+<!--docid::SEC79::-->
+<P>
+
+<CODE>(require 'generic-write)</CODE>
+<A NAME="IDX407"></A>
+</P>
+<P>
+
+<CODE>generic-write</CODE> is a procedure that transforms a Scheme data value
+(or Scheme program expression) into its textual representation and
+prints it. The interface to the procedure is sufficiently general to
+easily implement other useful formatting procedures such as pretty
+printing, output to a string and truncated output.
+</P>
+<P>
+
+<A NAME="IDX408"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>generic-write</B> <I>obj display? width output</I>
+<DD><DL COMPACT>
+<DT><VAR>obj</VAR>
+<DD>Scheme data value to transform.
+<DT><VAR>display?</VAR>
+<DD>Boolean, controls whether characters and strings are quoted.
+<DT><VAR>width</VAR>
+<DD>Extended boolean, selects format:
+<DL COMPACT>
+<DT>#f
+<DD>single line format
+<DT>integer &gt; 0
+<DD>pretty-print (value = max nb of chars per line)
+</DL>
+<DT><VAR>output</VAR>
+<DD>Procedure of 1 argument of string type, called repeatedly with
+successive substrings of the textual representation. This procedure can
+return <CODE>#f</CODE> to stop the transformation.
+</DL>
+<P>
+
+The value returned by <CODE>generic-write</CODE> is undefined.
+</P>
+<P>
+
+Examples:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(write obj) == (generic-write obj #f #f <VAR>display-string</VAR>)
+(display obj) == (generic-write obj #t #f <VAR>display-string</VAR>)
+</pre></td></tr></table>where
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><VAR>display-string</VAR> ==
+(lambda (s) (for-each write-char (string-&gt;list s)) #t)
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Object-To-String"></A>
+<HR SIZE="6">
+<A NAME="SEC80"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC79"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC81"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.11.2 Object-To-String </H3>
+<!--docid::SEC80::-->
+<P>
+
+<CODE>(require 'object-&gt;string)</CODE>
+<A NAME="IDX409"></A>
+</P>
+<P>
+
+<A NAME="IDX410"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>object-&gt;string</B> <I>obj</I>
+<DD>Returns the textual representation of <VAR>obj</VAR> as a string.
+</DL>
+<P>
+
+<A NAME="IDX411"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>object-&gt;limited-string</B> <I>obj limit</I>
+<DD>Returns the textual representation of <VAR>obj</VAR> as a string of length
+at most <VAR>limit</VAR>.
+</DL>
+<P>
+
+<A NAME="Pretty-Print"></A>
+<HR SIZE="6">
+<A NAME="SEC81"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC80"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.11.3 Pretty-Print </H3>
+<!--docid::SEC81::-->
+<P>
+
+<CODE>(require 'pretty-print)</CODE>
+<A NAME="IDX412"></A>
+</P>
+<P>
+
+<A NAME="IDX413"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>pretty-print</B> <I>obj</I>
+<DD><A NAME="IDX414"></A>
+<DT><U>Procedure:</U> <B>pretty-print</B> <I>obj port</I>
+<DD><P>
+
+<CODE>pretty-print</CODE>s <VAR>obj</VAR> on <VAR>port</VAR>. If <VAR>port</VAR> is not
+specified, <CODE>current-output-port</CODE> is used.
+</P>
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(pretty-print '((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15)
+ (16 17 18 19 20) (21 22 23 24 25)))
+ -| ((1 2 3 4 5)
+ -| (6 7 8 9 10)
+ -| (11 12 13 14 15)
+ -| (16 17 18 19 20)
+ -| (21 22 23 24 25))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX415"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>pretty-print-&gt;string</B> <I>obj</I>
+<DD><A NAME="IDX416"></A>
+<DT><U>Procedure:</U> <B>pretty-print-&gt;string</B> <I>obj width</I>
+<DD><P>
+
+Returns the string of <VAR>obj</VAR> <CODE>pretty-print</CODE>ed in <VAR>width</VAR>
+columns. If <VAR>width</VAR> is not specified, <CODE>(output-port-width)</CODE> is
+used.
+</P>
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(pretty-print-&gt;string '((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15)
+ (16 17 18 19 20) (21 22 23 24 25)))
+=>
+&quot;((1 2 3 4 5)
+ (6 7 8 9 10)
+ (11 12 13 14 15)
+ (16 17 18 19 20)
+ (21 22 23 24 25))
+&quot;
+(pretty-print-&gt;string '((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15)
+ (16 17 18 19 20) (21 22 23 24 25))
+ 16)
+=>
+&quot;((1 2 3 4 5)
+ (6 7 8 9 10)
+ (11
+ 12
+ 13
+ 14
+ 15)
+ (16
+ 17
+ 18
+ 19
+ 20)
+ (21
+ 22
+ 23
+ 24
+ 25))
+&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<CODE>(require 'pprint-file)</CODE>
+<A NAME="IDX417"></A>
+</P>
+<P>
+
+<A NAME="IDX418"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>pprint-file</B> <I>infile</I>
+<DD><A NAME="IDX419"></A>
+<DT><U>Procedure:</U> <B>pprint-file</B> <I>infile outfile</I>
+<DD>Pretty-prints all the code in <VAR>infile</VAR>. If <VAR>outfile</VAR> is
+specified, the output goes to <VAR>outfile</VAR>, otherwise it goes to
+<CODE>(current-output-port)</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX420"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>pprint-filter-file</B> <I>infile proc outfile</I>
+<DD><A NAME="IDX421"></A>
+<DT><U>Function:</U> <B>pprint-filter-file</B> <I>infile proc</I>
+<DD><VAR>infile</VAR> is a port or a string naming an existing file. Scheme
+source code expressions and definitions are read from the port (or file)
+and <VAR>proc</VAR> is applied to them sequentially.
+<P>
+
+<VAR>outfile</VAR> is a port or a string. If no <VAR>outfile</VAR> is specified
+then <CODE>current-output-port</CODE> is assumed. These expanded expressions
+are then <CODE>pretty-print</CODE>ed to this port.
+</P>
+<P>
+
+Whitepsace and comments (introduced by <CODE>;</CODE>) which are not part of
+scheme expressions are reproduced in the output. This procedure does
+not affect the values returned by <CODE>current-input-port</CODE> and
+<CODE>current-output-port</CODE>.
+</P>
+</DL>
+<P>
+
+<CODE>pprint-filter-file</CODE> can be used to pre-compile macro-expansion and
+thus can reduce loading time. The following will write into
+`<TT>exp-code.scm</TT>' the result of expanding all defmacros in
+`<TT>code.scm</TT>'.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'pprint-file)
+<A NAME="IDX422"></A>(require 'defmacroexpand)
+<A NAME="IDX423"></A>(defmacro:load &quot;my-macros.scm&quot;)
+(pprint-filter-file &quot;code.scm&quot; defmacro:expand* &quot;exp-code.scm&quot;)
+</pre></td></tr></table><P>
+
+<A NAME="Time and Date"></A>
+<HR SIZE="6">
+<A NAME="SEC82"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC81"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC83"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.12 Time and Date </H2>
+<!--docid::SEC82::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'posix-time</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'common-lisp-time</TD></TR>
+</TABLE>
+<P>
+
+If <CODE>(provided? 'current-time)</CODE>:
+</P>
+<P>
+
+The procedures <CODE>current-time</CODE>, <CODE>difftime</CODE>, and
+<CODE>offset-time</CODE> deal with a <EM>calendar time</EM> datatype
+<A NAME="IDX424"></A>
+<A NAME="IDX425"></A>
+which may or may not be disjoint from other Scheme datatypes.
+</P>
+<P>
+
+<A NAME="IDX426"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>current-time</B>
+<DD>Returns the time since 00:00:00 GMT, January 1, 1970, measured in
+seconds. Note that the reference time is different from the reference
+time for <CODE>get-universal-time</CODE> in <A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A>.
+</DL>
+<P>
+
+<A NAME="IDX427"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>difftime</B> <I>caltime1 caltime0</I>
+<DD>Returns the difference (number of seconds) between twe calendar times:
+<VAR>caltime1</VAR> - <VAR>caltime0</VAR>. <VAR>caltime0</VAR> may also be a number.
+</DL>
+<P>
+
+<A NAME="IDX428"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>offset-time</B> <I>caltime offset</I>
+<DD>Returns the calendar time of <VAR>caltime</VAR> offset by <VAR>offset</VAR> number
+of seconds <CODE>(+ caltime offset)</CODE>.
+</DL>
+<P>
+
+<A NAME="Time Zone"></A>
+<HR SIZE="6">
+<A NAME="SEC83"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC84"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.12.1 Time Zone </H3>
+<!--docid::SEC83::-->
+<P>
+
+(require 'time-zone)
+</P>
+<P>
+
+<A NAME="IDX429"></A>
+</P>
+<DL>
+<DT><U>Data Format:</U> <B>TZ-string</B>
+<DD><P>
+
+POSIX standards specify several formats for encoding time-zone rules.
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><TT>:<I>&lt;pathname&gt;</I></TT>
+<DD>If the first character of <I>&lt;pathname&gt;</I> is `<SAMP>/</SAMP>', then
+<I>&lt;pathname&gt;</I> specifies the absolute pathname of a tzfile(5) format
+time-zone file. Otherwise, <I>&lt;pathname&gt;</I> is interpreted as a pathname
+within <VAR>tzfile:vicinity</VAR> (/usr/lib/zoneinfo/) naming a tzfile(5)
+format time-zone file.
+<DT><TT><I>&lt;std&gt;</I><I>&lt;offset&gt;</I></TT>
+<DD>The string <I>&lt;std&gt;</I> consists of 3 or more alphabetic characters.
+<I>&lt;offset&gt;</I> specifies the time difference from GMT. The <I>&lt;offset&gt;</I>
+is positive if the local time zone is west of the Prime Meridian and
+negative if it is east. <I>&lt;offset&gt;</I> can be the number of hours or
+hours and minutes (and optionally seconds) separated by `<SAMP>:</SAMP>'. For
+example, <CODE>-4:30</CODE>.
+<DT><TT><I>&lt;std&gt;</I><I>&lt;offset&gt;</I><I>&lt;dst&gt;</I></TT>
+<DD><I>&lt;dst&gt;</I> is the at least 3 alphabetic characters naming the local
+daylight-savings-time.
+<DT><TT><I>&lt;std&gt;</I><I>&lt;offset&gt;</I><I>&lt;dst&gt;</I><I>&lt;doffset&gt;</I></TT>
+<DD><I>&lt;doffset&gt;</I> specifies the offset from the Prime Meridian when
+daylight-savings-time is in effect.
+</DL>
+<P>
+
+The non-tzfile formats can optionally be followed by transition times
+specifying the day and time when a zone changes from standard to
+daylight-savings and back again.
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><TT>,<I>&lt;date&gt;</I>/<I>&lt;time&gt;</I>,<I>&lt;date&gt;</I>/<I>&lt;time&gt;</I></TT>
+<DD>The <I>&lt;time&gt;</I>s are specified like the <I>&lt;offset&gt;</I>s above, except that
+leading `<SAMP>+</SAMP>' and `<SAMP>-</SAMP>' are not allowed.
+<P>
+
+Each <I>&lt;date&gt;</I> has one of the formats:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><TT>J<I>&lt;day&gt;</I></TT>
+<DD>specifies the Julian day with <I>&lt;day&gt;</I> between 1 and 365. February 29
+is never counted and cannot be referenced.
+<DT><TT><I>&lt;day&gt;</I></TT>
+<DD>This specifies the Julian day with n between 0 and 365. February 29 is
+counted in leap years and can be specified.
+<DT><TT>M<I>&lt;month&gt;</I>.<I>&lt;week&gt;</I>.<I>&lt;day&gt;</I></TT>
+<DD>This specifies day <I>&lt;day&gt;</I> (0 &lt;= <I>&lt;day&gt;</I> &lt;= 6) of week <I>&lt;week&gt;</I> (1
+&lt;= <I>&lt;week&gt;</I> &lt;= 5) of month <I>&lt;month&gt;</I> (1 &lt;= <I>&lt;month&gt;</I> &lt;= 12). Week
+1 is the first week in which day d occurs and week 5 is the last week in
+which day <I>&lt;day&gt;</I> occurs. Day 0 is a Sunday.
+</DL>
+</DL>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX430"></A>
+</P>
+<DL>
+<DT><U>Data Type:</U> <B>time-zone</B>
+<DD>is a datatype encoding how many hours from Greenwich Mean Time the local
+time is, and the <EM>Daylight Savings Time</EM> rules for changing it.
+</DL>
+<P>
+
+<A NAME="IDX431"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>time-zone</B> <I>TZ-string</I>
+<DD>Creates and returns a time-zone object specified by the string
+<VAR>TZ-string</VAR>. If <CODE>time-zone</CODE> cannot interpret <VAR>TZ-string</VAR>,
+<CODE>#f</CODE> is returned.
+</DL>
+<P>
+
+<A NAME="IDX432"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tz:params</B> <I>caltime tz</I>
+<DD><VAR>tz</VAR> is a time-zone object. <CODE>tz:params</CODE> returns a list of
+three items:
+<OL>
+<LI>
+An integer. 0 if standard time is in effect for timezone <VAR>tz</VAR> at
+<VAR>caltime</VAR>; 1 if daylight savings time is in effect for timezone
+<VAR>tz</VAR> at <VAR>caltime</VAR>.
+<LI>
+The number of seconds west of the Prime Meridian timezone <VAR>tz</VAR> is at
+<VAR>caltime</VAR>.
+<LI>
+The name for timezone <VAR>tz</VAR> at <VAR>caltime</VAR>.
+</OL>
+<P>
+
+<CODE>tz:params</CODE> is unaffected by the default timezone; inquiries can be
+made of any timezone at any calendar time.
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX433"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tz:std-offset</B> <I>tz</I>
+<DD><VAR>tz</VAR> is a time-zone object. <CODE>tz:std-offset</CODE> returns the
+number of seconds west of the Prime Meridian timezone <VAR>tz</VAR> is.
+<P>
+
+</P>
+</DL>
+<P>
+
+The rest of these procedures and variables are provided for POSIX
+compatability. Because of shared state they are not thread-safe.
+</P>
+<P>
+
+<A NAME="IDX434"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tzset</B>
+<DD>Returns the default time-zone.
+<P>
+
+<A NAME="IDX435"></A>
+<DT><U>Function:</U> <B>tzset</B> <I>tz</I>
+<DD>Sets (and returns) the default time-zone to <VAR>tz</VAR>.
+</P>
+<P>
+
+<A NAME="IDX436"></A>
+<DT><U>Function:</U> <B>tzset</B> <I>TZ-string</I>
+<DD>Sets (and returns) the default time-zone to that specified by
+<VAR>TZ-string</VAR>.
+</P>
+<P>
+
+<CODE>tzset</CODE> also sets the variables <VAR>*timezone*</VAR>, <VAR>daylight?</VAR>,
+and <VAR>tzname</VAR>. This function is automatically called by the time
+conversion procedures which depend on the time zone (see section <A HREF="slib_4.html#SEC82">4.12 Time and Date</A>).
+</P>
+</DL>
+<P>
+
+<A NAME="IDX437"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*timezone*</B>
+<DD>Contains the difference, in seconds, between Greenwich Mean Time and
+local standard time (for example, in the U.S. Eastern time zone (EST),
+timezone is 5*60*60). <CODE>*timezone*</CODE> is initialized by <CODE>tzset</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX438"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>daylight?</B>
+<DD>is <CODE>#t</CODE> if the default timezone has rules for <EM>Daylight Savings
+Time</EM>. <EM>Note:</EM> <VAR>daylight?</VAR> does not tell you when Daylight
+Savings Time is in effect, just that the default zone sometimes has
+Daylight Savings Time.
+</DL>
+<P>
+
+<A NAME="IDX439"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>tzname</B>
+<DD>is a vector of strings. Index 0 has the abbreviation for the standard
+timezone; If <VAR>daylight?</VAR>, then index 1 has the abbreviation for the
+Daylight Savings timezone.
+</DL>
+<P>
+
+<A NAME="Posix Time"></A>
+<HR SIZE="6">
+<A NAME="SEC84"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC83"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC85"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.12.2 Posix Time </H3>
+<!--docid::SEC84::-->
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'posix-time)
+<A NAME="IDX440"></A></pre></td></tr></table><P>
+
+<A NAME="IDX441"></A>
+</P>
+<DL>
+<DT><U>Data Type:</U> <B>Calendar-Time</B>
+<DD><A NAME="IDX442"></A>
+<A NAME="IDX443"></A>
+is a datatype encapsulating time.
+</DL>
+<P>
+
+<A NAME="IDX444"></A>
+</P>
+<DL>
+<DT><U>Data Type:</U> <B>Coordinated Universal Time</B>
+<DD><A NAME="IDX445"></A>
+<A NAME="IDX446"></A>
+(abbreviated <EM>UTC</EM>) is a vector of integers representing time:
+<P>
+
+<OL>
+<LI>
+ seconds (0 - 61)
+<LI>
+ minutes (0 - 59)
+<LI>
+ hours since midnight (0 - 23)
+<LI>
+ day of month (1 - 31)
+<LI>
+ month (0 - 11). Note difference from <CODE>decode-universal-time</CODE>.
+<LI>
+ the number of years since 1900. Note difference from
+<CODE>decode-universal-time</CODE>.
+<LI>
+ day of week (0 - 6)
+<LI>
+ day of year (0 - 365)
+<LI>
+ 1 for daylight savings, 0 for regular time
+</OL>
+</DL>
+<P>
+
+<A NAME="IDX447"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>gmtime</B> <I>caltime</I>
+<DD>Converts the calendar time <VAR>caltime</VAR> to UTC and returns it.
+<P>
+
+<A NAME="IDX448"></A>
+<DT><U>Function:</U> <B>localtime</B> <I>caltime tz</I>
+<DD>Returns <VAR>caltime</VAR> converted to UTC relative to timezone <VAR>tz</VAR>.
+</P>
+<P>
+
+<A NAME="IDX449"></A>
+<DT><U>Function:</U> <B>localtime</B> <I>caltime</I>
+<DD>converts the calendar time <VAR>caltime</VAR> to a vector of integers
+expressed relative to the user's time zone. <CODE>localtime</CODE> sets the
+variable <VAR>*timezone*</VAR> with the difference between Coordinated
+Universal Time (UTC) and local standard time in seconds
+(see section <A HREF="slib_4.html#SEC83">tzset</A>).
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX450"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>gmktime</B> <I>univtime</I>
+<DD>Converts a vector of integers in GMT Coordinated Universal Time (UTC)
+format to a calendar time.
+<P>
+
+<A NAME="IDX451"></A>
+<DT><U>Function:</U> <B>mktime</B> <I>univtime</I>
+<DD>Converts a vector of integers in local Coordinated Universal Time (UTC)
+format to a calendar time.
+</P>
+<P>
+
+<A NAME="IDX452"></A>
+<DT><U>Function:</U> <B>mktime</B> <I>univtime tz</I>
+<DD>Converts a vector of integers in Coordinated Universal Time (UTC) format
+(relative to time-zone <VAR>tz</VAR>)
+to calendar time.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX453"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>asctime</B> <I>univtime</I>
+<DD>Converts the vector of integers <VAR>caltime</VAR> in Coordinated
+Universal Time (UTC) format into a string of the form
+<CODE>&quot;Wed Jun 30 21:49:08 1993&quot;</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX454"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>gtime</B> <I>caltime</I>
+<DD><A NAME="IDX455"></A>
+<DT><U>Function:</U> <B>ctime</B> <I>caltime</I>
+<DD><A NAME="IDX456"></A>
+<DT><U>Function:</U> <B>ctime</B> <I>caltime tz</I>
+<DD>Equivalent to <CODE>(asctime (gmtime <VAR>caltime</VAR>))</CODE>,
+<CODE>(asctime (localtime <VAR>caltime</VAR>))</CODE>, and
+<CODE>(asctime (localtime <VAR>caltime</VAR> <VAR>tz</VAR>))</CODE>, respectively.
+</DL>
+<P>
+
+<A NAME="Common-Lisp Time"></A>
+<HR SIZE="6">
+<A NAME="SEC85"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC84"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC86"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.12.3 Common-Lisp Time </H3>
+<!--docid::SEC85::-->
+<P>
+
+<A NAME="IDX457"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>get-decoded-time</B>
+<DD>Equivalent to <CODE>(decode-universal-time (get-universal-time))</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX458"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>get-universal-time</B>
+<DD>Returns the current time as <EM>Universal Time</EM>, number of seconds
+since 00:00:00 Jan 1, 1900 GMT. Note that the reference time is
+different from <CODE>current-time</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX459"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>decode-universal-time</B> <I>univtime</I>
+<DD>Converts <VAR>univtime</VAR> to <EM>Decoded Time</EM> format.
+Nine values are returned:
+<OL>
+<LI>
+ seconds (0 - 61)
+<LI>
+ minutes (0 - 59)
+<LI>
+ hours since midnight
+<LI>
+ day of month
+<LI>
+ month (1 - 12). Note difference from <CODE>gmtime</CODE> and <CODE>localtime</CODE>.
+<LI>
+ year (A.D.). Note difference from <CODE>gmtime</CODE> and <CODE>localtime</CODE>.
+<LI>
+ day of week (0 - 6)
+<LI>
+ #t for daylight savings, #f otherwise
+<LI>
+ hours west of GMT (-24 - +24)
+</OL>
+<P>
+
+Notice that the values returned by <CODE>decode-universal-time</CODE> do not
+match the arguments to <CODE>encode-universal-time</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX460"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>encode-universal-time</B> <I>second minute hour date month year</I>
+<DD><A NAME="IDX461"></A>
+<DT><U>Function:</U> <B>encode-universal-time</B> <I>second minute hour date month year time-zone</I>
+<DD>Converts the arguments in Decoded Time format to Universal Time format.
+If <VAR>time-zone</VAR> is not specified, the returned time is adjusted for
+daylight saving time. Otherwise, no adjustment is performed.
+<P>
+
+Notice that the values returned by <CODE>decode-universal-time</CODE> do not
+match the arguments to <CODE>encode-universal-time</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="NCBI-DNA"></A>
+<HR SIZE="6">
+<A NAME="SEC86"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC85"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC87"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.13 NCBI-DNA </H2>
+<!--docid::SEC86::-->
+<P>
+
+<A NAME="IDX462"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>ncbi:read-dna-sequence</B> <I>port</I>
+<DD><P>
+
+Reads the NCBI-format DNA sequence following the word `<SAMP>ORIGIN</SAMP>'
+from <VAR>port</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX463"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>ncbi:read-file</B> <I>file</I>
+<DD><P>
+
+Reads the NCBI-format DNA sequence following the word `<SAMP>ORIGIN</SAMP>'
+from <VAR>file</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX464"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>mrna&lt;-cdna</B> <I>str</I>
+<DD><P>
+
+Replaces `<SAMP>T</SAMP>' with `<SAMP>U</SAMP>' in <VAR>str</VAR>
+</P>
+</DL>
+<P>
+
+<A NAME="IDX465"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>codons&lt;-cdna</B> <I>cdna</I>
+<DD><P>
+
+Returns a list of three-letter symbol codons comprising the protein
+sequence encoded by <VAR>cdna</VAR> starting with its first occurence of
+`<SAMP>atg</SAMP>'.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX466"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>protein&lt;-cdna</B> <I>cdna</I>
+<DD><P>
+
+Returns a list of three-letter symbols for the protein sequence
+encoded by <VAR>cdna</VAR> starting with its first occurence of `<SAMP>atg</SAMP>'.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX467"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>p&lt;-cdna</B> <I>cdna</I>
+<DD><P>
+
+Returns a string of one-letter amino acid codes for the protein
+sequence encoded by <VAR>cdna</VAR> starting with its first occurence of
+`<SAMP>atg</SAMP>'.
+</P>
+</DL>
+<P>
+
+These cDNA count routines provide a means to check the nucleotide
+sequence with the `<SAMP>BASE COUNT</SAMP>' line preceding the sequence from
+NCBI.
+</P>
+<P>
+
+<A NAME="IDX468"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>cdna:base-count</B> <I>cdna</I>
+<DD><P>
+
+Returns a list of counts of `<SAMP>a</SAMP>', `<SAMP>c</SAMP>', `<SAMP>g</SAMP>', and
+`<SAMP>t</SAMP>' occurrencing in <VAR>cdna</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX469"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>cdna:report-base-count</B> <I>cdna</I>
+<DD><P>
+
+Prints the counts of `<SAMP>a</SAMP>', `<SAMP>c</SAMP>', `<SAMP>g</SAMP>', and `<SAMP>t</SAMP>'
+occurrencing in <VAR>cdna</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="Schmooz"></A>
+<HR SIZE="6">
+<A NAME="SEC87"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC86"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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> 4.14 Schmooz </H2>
+<!--docid::SEC87::-->
+<P>
+
+<A NAME="IDX470"></A>
+<EM>Schmooz</EM> is a simple, lightweight markup language for interspersing
+Texinfo documentation with Scheme source code. Schmooz does not create
+the top level Texinfo file; it creates `<SAMP>txi</SAMP>' files which can be
+imported into the documentation using the Texinfo command
+`<SAMP>@include</SAMP>'.
+</P>
+<P>
+
+<A NAME="IDX471"></A>
+<CODE>(require 'schmooz)</CODE> defines the function <CODE>schmooz</CODE>, which is
+used to process files. Files containing schmooz documentation should
+not contain <CODE>(require 'schmooz)</CODE>.
+</P>
+<P>
+
+<A NAME="IDX472"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>schmooz</B> <I>filename.scm <small>...</small></I>
+<DD><VAR>Filename</VAR>.scm should be a string ending with `<SAMP>.scm</SAMP>' naming an
+existing file containing Scheme source code. <CODE>schmooz</CODE> extracts
+top-level comments containing schmooz commands from <VAR>filename</VAR>.scm
+and writes the converted Texinfo source to a file named
+<VAR>filename</VAR>.txi.
+<P>
+
+<A NAME="IDX473"></A>
+<DT><U>Procedure:</U> <B>schmooz</B> <I>filename.texi <small>...</small></I>
+<DD><A NAME="IDX474"></A>
+<DT><U>Procedure:</U> <B>schmooz</B> <I>filename.tex <small>...</small></I>
+<DD><A NAME="IDX475"></A>
+<DT><U>Procedure:</U> <B>schmooz</B> <I>filename.txi <small>...</small></I>
+<DD><VAR>Filename</VAR> should be a string naming an existing file containing
+Texinfo source code. For every occurrence of the string `<SAMP>@include
+<VAR>filename</VAR>.txi</SAMP>' within that file, <CODE>schmooz</CODE> calls itself with
+the argument `<SAMP><VAR>filename</VAR>.scm</SAMP>'.
+</P>
+</DL>
+<P>
+
+Schmooz comments are distinguished (from non-schmooz comments) by their
+first line, which must start with an at-sign (@) preceded by one or
+more semicolons (<TT>;</TT>). A schmooz comment ends at the first subsequent
+line which does <EM>not</EM> start with a semicolon. Currently schmooz
+comments are recognized only at top level.
+</P>
+<P>
+
+Schmooz comments are copied to the Texinfo output file with the leading
+contiguous semicolons removed. Certain character sequences starting
+with at-sign are treated specially. Others are copied unchanged.
+</P>
+<P>
+
+A schmooz comment starting with `<SAMP>@body</SAMP>' must be followed by a
+Scheme definition. All comments between the `<SAMP>@body</SAMP>' line and
+the definition will be included in a Texinfo definition, either
+a `<SAMP>@defun</SAMP>' or a `<SAMP>@defvar</SAMP>', depending on whether a procedure
+or a variable is being defined.
+</P>
+<P>
+
+Within the text of that schmooz comment, at-sign
+followed by `<SAMP>0</SAMP>' will be replaced by <CODE>@code{procedure-name}</CODE>
+if the following definition is of a procedure; or
+<CODE>@var{variable}</CODE> if defining a variable.
+</P>
+<P>
+
+An at-sign followed by a non-zero digit will expand to the variable
+citation of that numbered argument: `<SAMP>@var{argument-name}</SAMP>'.
+</P>
+<P>
+
+If more than one definition follows a `<SAMP>@body</SAMP>' comment line
+without an intervening blank or comment line, then those definitions
+will be included in the same Texinfo definition using `<SAMP>@defvarx</SAMP>'
+or `<SAMP>@defunx</SAMP>', depending on whether the first definition is of
+a variable or of a procedure.
+</P>
+<P>
+
+Schmooz can figure out whether a definition is of a procedure if
+it is of the form:
+</P>
+<P>
+
+`<SAMP>(define (&lt;identifier&gt; &lt;arg&gt; ...) &lt;expression&gt;)</SAMP>'
+</P>
+<P>
+
+or if the left hand side of the definition is some form ending in
+a lambda expression. Obviously, it can be fooled. In order to
+force recognition of a procedure definition, start the documentation
+with `<SAMP>@args</SAMP>' instead of `<SAMP>@body</SAMP>'. `<SAMP>@args</SAMP>' should
+be followed by the argument list of the function being defined,
+which may be enclosed in parentheses and delimited by whitespace,
+(as in Scheme), enclosed in braces and separated by commas, (as
+in Texinfo), or consist of the remainder of the line, separated
+by whitespace.
+</P>
+<P>
+
+For example:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>;;@args arg1 args ...
+;;@0 takes argument @1 and any number of @2
+(define myfun (some-function-returning-magic))
+</pre></td></tr></table><P>
+
+Will result in:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>@defun myfun arg1 args @dots{}
+
+@code{myfun} takes argument @var{arg1} and any number of @var{args}
+@end defun
+</pre></td></tr></table><P>
+
+`<SAMP>@args</SAMP>' may also be useful for indicating optional arguments
+by name. If `<SAMP>@args</SAMP>' occurs inside a schmooz comment section,
+rather than at the beginning, then it will generate a `<SAMP>@defunx</SAMP>'
+line with the arguments supplied.
+</P>
+<P>
+
+If the first at-sign in a schmooz comment is immediately followed by
+whitespace, then the comment will be expanded to whatever follows that
+whitespace. If the at-sign is followed by a non-whitespace character
+then the at-sign will be included as the first character of the expansion.
+This feature is intended to make it easy to include Texinfo directives
+in schmooz comments.
+</P>
+<P>
+
+<A NAME="Mathematical Packages"></A>
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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>
diff --git a/slib_5.html b/slib_5.html
new file mode 100644
index 0000000..b3ef4b8
--- /dev/null
+++ b/slib_5.html
@@ -0,0 +1,6100 @@
+<!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: Mathematical Packages</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Mathematical Packages">
+<META NAME="keywords" CONTENT="SLIB: Mathematical 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="SEC88"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC87"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC89"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &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_6.html#SEC140"> &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> 5. Mathematical Packages </H1>
+<!--docid::SEC88::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC89">5.1 Bit-Twiddling</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'logical</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'modular</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'factor</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC97">5.4 Random Numbers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'random</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'fft</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'crc</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC102">5.7 Graphing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">VRML97</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC118">5.9 Color</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'root</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC135">5.11 Minimizing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'minimize</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'commutative-ring</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'determinant</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Bit-Twiddling"></A>
+<HR SIZE="6">
+<A NAME="SEC89"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC90"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.1 Bit-Twiddling </H2>
+<!--docid::SEC89::-->
+<P>
+
+<CODE>(require 'logical)</CODE>
+<A NAME="IDX476"></A>
+</P>
+<P>
+
+The bit-twiddling functions are made available through the use of the
+<CODE>logical</CODE> package. <CODE>logical</CODE> is loaded by inserting
+<CODE>(require 'logical)</CODE> before the code that uses these
+<A NAME="IDX477"></A>
+functions. These functions behave as though operating on integers
+in two's-complement representation.
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC90"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC89"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC91"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.1.1 Bitwise Operations </H3>
+<!--docid::SEC90::-->
+<P>
+
+<A NAME="IDX478"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>logand</B> <I>n1 n1</I>
+<DD>Returns the integer which is the bit-wise AND of the two integer
+arguments.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (logand #b1100 #b1010) 2)
+ => &quot;1000&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX479"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>logior</B> <I>n1 n2</I>
+<DD>Returns the integer which is the bit-wise OR of the two integer
+arguments.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (logior #b1100 #b1010) 2)
+ => &quot;1110&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX480"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>logxor</B> <I>n1 n2</I>
+<DD>Returns the integer which is the bit-wise XOR of the two integer
+arguments.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (logxor #b1100 #b1010) 2)
+ => &quot;110&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX481"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>lognot</B> <I>n</I>
+<DD>Returns the integer which is the 2s-complement of the integer argument.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (lognot #b10000000) 2)
+ => &quot;-10000001&quot;
+(number-&gt;string (lognot #b0) 2)
+ => &quot;-1&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX482"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>bitwise-if</B> <I>mask n0 n1</I>
+<DD>Returns an integer composed of some bits from integer <VAR>n0</VAR> and some
+from integer <VAR>n1</VAR>. A bit of the result is taken from <VAR>n0</VAR> if the
+corresponding bit of integer <VAR>mask</VAR> is 1 and from <VAR>n1</VAR> if that bit
+of <VAR>mask</VAR> is 0.
+</DL>
+<P>
+
+<A NAME="IDX483"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>logtest</B> <I>j k</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>(logtest j k) == (not (zero? (logand j k)))
+
+(logtest #b0100 #b1011) => #f
+(logtest #b0100 #b0111) => #t
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX484"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>logcount</B> <I>n</I>
+<DD>Returns the number of bits in integer <VAR>n</VAR>. If integer is positive,
+the 1-bits in its binary representation are counted. If negative, the
+0-bits in its two's-complement binary representation are counted. If 0,
+0 is returned.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(logcount #b10101010)
+ => 4
+(logcount 0)
+ => 0
+(logcount -2)
+ => 1
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC91"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC90"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC92"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.1.2 Bit Within Word </H3>
+<!--docid::SEC91::-->
+<P>
+
+<A NAME="IDX485"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>logbit?</B> <I>index j</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>(logbit? index j) == (logtest (integer-expt 2 index) j)
+
+(logbit? 0 #b1101) => #t
+(logbit? 1 #b1101) => #f
+(logbit? 2 #b1101) => #t
+(logbit? 3 #b1101) => #t
+(logbit? 4 #b1101) => #f
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX486"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>copy-bit</B> <I>index from bit</I>
+<DD>Returns an integer the same as <VAR>from</VAR> except in the <VAR>index</VAR>th bit,
+which is 1 if <VAR>bit</VAR> is <CODE>#t</CODE> and 0 if <VAR>bit</VAR> is <CODE>#f</CODE>.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (copy-bit 0 0 #t) 2) => &quot;1&quot;
+(number-&gt;string (copy-bit 2 0 #t) 2) => &quot;100&quot;
+(number-&gt;string (copy-bit 2 #b1111 #f) 2) => &quot;1011&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC92"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC91"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC93"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.1.3 Fields of Bits </H3>
+<!--docid::SEC92::-->
+<P>
+
+<A NAME="IDX487"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>logical:ones</B> <I>n</I>
+<DD>Returns the smallest non-negative integer having <VAR>n</VAR> binary ones.
+</DL>
+<P>
+
+<A NAME="IDX488"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>bit-field</B> <I>n start end</I>
+<DD>Returns the integer composed of the <VAR>start</VAR> (inclusive) through
+<VAR>end</VAR> (exclusive) bits of <VAR>n</VAR>. The <VAR>start</VAR>th bit becomes
+the 0-th bit in the result.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (bit-field #b1101101010 0 4) 2)
+ => &quot;1010&quot;
+(number-&gt;string (bit-field #b1101101010 4 9) 2)
+ => &quot;10110&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX489"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>copy-bit-field</B> <I>to start end from</I>
+<DD>Returns an integer the same as <VAR>to</VAR> except possibly in the
+<VAR>start</VAR> (inclusive) through <VAR>end</VAR> (exclusive) bits, which are
+the same as those of <VAR>from</VAR>. The 0-th bit of <VAR>from</VAR> becomes the
+<VAR>start</VAR>th bit of the result.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (copy-bit-field #b1101101010 0 4 0) 2)
+ => &quot;1101100000&quot;
+(number-&gt;string (copy-bit-field #b1101101010 0 4 -1) 2)
+ => &quot;1101101111&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX490"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>ash</B> <I>n count</I>
+<DD>Returns an integer equivalent to
+<CODE>(inexact-&gt;exact (floor (* <VAR>n</VAR> (expt 2 <VAR>count</VAR>))))</CODE>.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (ash #b1 3) 2)
+ => &quot;1000&quot;
+(number-&gt;string (ash #b1010 -1) 2)
+ => &quot;101&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX491"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>integer-length</B> <I>n</I>
+<DD>Returns the number of bits neccessary to represent <VAR>n</VAR>.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(integer-length #b10101010)
+ => 8
+(integer-length 0)
+ => 0
+(integer-length #b1111)
+ => 4
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX492"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>integer-expt</B> <I>n k</I>
+<DD>Returns <VAR>n</VAR> raised to the non-negative integer exponent <VAR>k</VAR>.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(integer-expt 2 5)
+ => 32
+(integer-expt -3 3)
+ => -27
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC93"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC92"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC94"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.1.4 Bit order and Lamination </H3>
+<!--docid::SEC93::-->
+<P>
+
+<A NAME="IDX493"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>logical:rotate</B> <I>k count len</I>
+<DD>Returns the low-order <VAR>len</VAR> bits of <VAR>k</VAR> cyclically permuted
+<VAR>count</VAR> bits towards high-order.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (logical:rotate #b0100 3 4) 2)
+=> &quot;10&quot;
+(number-&gt;string (logical:rotate #b0100 -1 4) 2)
+=> &quot;10&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX494"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>bit-reverse</B> <I>k n</I>
+<DD>Returns the low-order <VAR>k</VAR> bits of <VAR>n</VAR> with the bit order
+reversed. The low-order bit of <VAR>n</VAR> is the high order bit of the
+returned value.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(number-&gt;string (bit-reverse 8 #xa7) 16)
+ => &quot;e5&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX495"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>integer-&gt;list</B> <I>k len</I>
+<DD><A NAME="IDX496"></A>
+<DT><U>Function:</U> <B>integer-&gt;list</B> <I>k</I>
+<DD><CODE>integer-&gt;list</CODE> returns a list of <VAR>len</VAR> booleans corresponding
+to each bit of the given integer. #t is coded for each 1; #f for 0.
+The <VAR>len</VAR> argument defaults to <CODE>(integer-length <VAR>k</VAR>)</CODE>.
+<P>
+
+<A NAME="IDX497"></A>
+<DT><U>Function:</U> <B>list-&gt;integer</B> <I>list</I>
+<DD><CODE>list-&gt;integer</CODE> returns an integer formed from the booleans in the
+list <VAR>list</VAR>, which must be a list of booleans. A 1 bit is coded for
+each #t; a 0 bit for #f.
+</P>
+<P>
+
+<CODE>integer-&gt;list</CODE> and <CODE>list-&gt;integer</CODE> are inverses so far as
+<CODE>equal?</CODE> is concerned.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX498"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>booleans-&gt;integer</B> <I>bool1 <small>...</small></I>
+<DD>Returns the integer coded by the <VAR>bool1</VAR> <small>...</small> arguments.
+</DL>
+<P>
+
+<A NAME="IDX499"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>bitwise:laminate</B> <I>k1 <small>...</small></I>
+<DD>Returns an integer composed of the bits of <VAR>k1</VAR> <small>...</small> interlaced
+in argument order. Given <VAR>k1</VAR>, <small>...</small> <VAR>kn</VAR>, the n low-order
+bits of the returned value will be the lowest-order bit of each
+argument.
+<P>
+
+<A NAME="IDX500"></A>
+<DT><U>Function:</U> <B>bitwise:delaminate</B> <I>count k</I>
+<DD>Returns a list of <VAR>count</VAR> integers comprised of every <VAR>count</VAR>h
+bit of the integer <VAR>k</VAR>.
+</P>
+<P>
+
+For any non-negative integers <VAR>k</VAR> and <VAR>count</VAR>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(eqv? k (bitwise:laminate (bitwise:delaminate count k)))
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC94"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC93"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC95"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.1.5 Gray code </H3>
+<!--docid::SEC94::-->
+<P>
+
+<A NAME="IDX501"></A>
+A <EM>Gray code</EM> is an ordering of non-negative integers in which
+exactly one bit differs between each pair of successive elements. There
+are multiple Gray codings. An n-bit Gray code corresponds to a
+Hamiltonian cycle on an n-dimensional hypercube.
+</P>
+<P>
+
+Gray codes find use communicating incrementally changing values between
+asynchronous agents. De-laminated Gray codes comprise the coordinates
+of Peano-Hilbert space-filling curves.
+</P>
+<P>
+
+<A NAME="IDX502"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>integer-&gt;gray-code</B> <I>k</I>
+<DD>Converts <VAR>k</VAR> to a Gray code of the same <CODE>integer-length</CODE> as
+<VAR>k</VAR>.
+<P>
+
+<A NAME="IDX503"></A>
+<DT><U>Function:</U> <B>gray-code-&gt;integer</B> <I>k</I>
+<DD>Converts the Gray code <VAR>k</VAR> to an integer of the same
+<CODE>integer-length</CODE> as <VAR>k</VAR>.
+</P>
+<P>
+
+For any non-negative integer <VAR>k</VAR>,
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(eqv? k (gray-code-&gt;integer (integer-&gt;gray-code k)))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX504"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>=</B> <I>k1 k2</I>
+<DD><A NAME="IDX505"></A>
+<DT><U>Function:</U> <B>gray-code&lt;?</B> <I>k1 k2</I>
+<DD><A NAME="IDX506"></A>
+<DT><U>Function:</U> <B>gray-code&gt;?</B> <I>k1 k2</I>
+<DD><A NAME="IDX507"></A>
+<DT><U>Function:</U> <B>gray-code&lt;=?</B> <I>k1 k2</I>
+<DD><A NAME="IDX508"></A>
+<DT><U>Function:</U> <B>gray-code&gt;=?</B> <I>k1 k2</I>
+<DD>These procedures return #t if their Gray code arguments are
+(respectively): equal, monotonically increasing, monotonically
+decreasing, monotonically nondecreasing, or monotonically nonincreasing.
+<P>
+
+For any non-negative integers <VAR>k1</VAR> and <VAR>k2</VAR>, the Gray code
+predicate of <CODE>(integer-&gt;gray-code k1)</CODE> and
+<CODE>(integer-&gt;gray-code k2)</CODE> will return the same value as the
+corresponding predicate of <VAR>k1</VAR> and <VAR>k2</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="Modular Arithmetic"></A>
+<HR SIZE="6">
+<A NAME="SEC95"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC94"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC96"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.2 Modular Arithmetic </H2>
+<!--docid::SEC95::-->
+<P>
+
+<CODE>(require 'modular)</CODE>
+<A NAME="IDX509"></A>
+</P>
+<P>
+
+<A NAME="IDX510"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>mod</B> <I>x1 x2</I>
+<DD><A NAME="IDX511"></A>
+<DT><U>Function:</U> <B>rem</B> <I>x1 x2</I>
+<DD><P>
+
+These procedures implement the Common-Lisp functions of the same names.
+The real number <VAR>x2</VAR> must be non-zero.
+<CODE>mod</CODE> returns <CODE>(- <VAR>x1</VAR> (* <VAR>x2</VAR> (floor (/ <VAR>x1</VAR> <VAR>x2</VAR>))))</CODE>.
+<CODE>rem</CODE> returns <CODE>(- <VAR>x1</VAR> (* <VAR>x2</VAR> (truncate (/ <VAR>x1</VAR> <VAR>x2</VAR>))))</CODE>.
+</P>
+<P>
+
+If <VAR>x1</VAR> and <VAR>x2</VAR> are integers, then <CODE>mod</CODE> behaves like
+<CODE>modulo</CODE> and <CODE>rem</CODE> behaves like <CODE>remainder</CODE>.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif"><TT>(mod -90 360) => 270
+(rem -90 180) => -90
+
+(mod 540 360) => 180
+(rem 540 360) => 180
+
+(mod (* 5/2 pi) (* 2 pi)) => 1.5707963267948965
+(rem (* -5/2 pi) (* 2 pi)) => -1.5707963267948965
+</TT>
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX512"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>extended-euclid</B> <I>n1 n2</I>
+<DD><P>
+
+Returns a list of 3 integers <CODE>(d x y)</CODE> such that d = gcd(<VAR>n1</VAR>,
+<VAR>n2</VAR>) = <VAR>n1</VAR> * x + <VAR>n2</VAR> * y.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX513"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>symmetric:modulus</B> <I>n</I>
+<DD><P>
+
+Returns <CODE>(quotient (+ -1 n) -2)</CODE> for positive odd integer <VAR>n</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX514"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>modulus-&gt;integer</B> <I>modulus</I>
+<DD><P>
+
+Returns the non-negative integer characteristic of the ring formed when
+<VAR>modulus</VAR> is used with <CODE>modular:</CODE> procedures.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX515"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>modular:normalize</B> <I>modulus n</I>
+<DD><P>
+
+Returns the integer <CODE>(modulo <VAR>n</VAR> (modulus-&gt;integer
+<VAR>modulus</VAR>))</CODE> in the representation specified by <VAR>modulus</VAR>.
+</P>
+</DL>
+The rest of these functions assume normalized arguments; That is, the
+arguments are constrained by the following table:
+<P>
+
+For all of these functions, if the first argument (<VAR>modulus</VAR>) is:
+</P>
+<DL COMPACT>
+<DT><CODE>positive?</CODE>
+<DD>Work as before. The result is between 0 and <VAR>modulus</VAR>.
+<P>
+
+</P>
+<DT><CODE>zero?</CODE>
+<DD>The arguments are treated as integers. An integer is returned.
+<P>
+
+</P>
+<DT><CODE>negative?</CODE>
+<DD>The arguments and result are treated as members of the integers modulo
+<CODE>(+ 1 (* -2 <VAR>modulus</VAR>))</CODE>, but with <EM>symmetric</EM>
+<A NAME="IDX516"></A>
+representation; i.e. <CODE>(&lt;= (- <VAR>modulus</VAR>) <VAR>n</VAR>
+<VAR>modulus</VAR>)</CODE>.
+</DL>
+<P>
+
+If all the arguments are fixnums the computation will use only fixnums.
+</P>
+<P>
+
+<A NAME="IDX517"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>modular:invertable?</B> <I>modulus k</I>
+<DD><P>
+
+Returns <CODE>#t</CODE> if there exists an integer n such that <VAR>k</VAR> * n
+== 1 mod <VAR>modulus</VAR>, and <CODE>#f</CODE> otherwise.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX518"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>modular:invert</B> <I>modulus n2</I>
+<DD><P>
+
+Returns an integer n such that 1 = (n * <VAR>n2</VAR>) mod <VAR>modulus</VAR>. If
+<VAR>n2</VAR> has no inverse mod <VAR>modulus</VAR> an error is signaled.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX519"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>modular:negate</B> <I>modulus n2</I>
+<DD><P>
+
+Returns (-<VAR>n2</VAR>) mod <VAR>modulus</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX520"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>modular:+</B> <I>modulus n2 n3</I>
+<DD><P>
+
+Returns (<VAR>n2</VAR> + <VAR>n3</VAR>) mod <VAR>modulus</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX521"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>modular:-</B> <I>modulus n2 n3</I>
+<DD><P>
+
+Returns (<VAR>n2</VAR> - <VAR>n3</VAR>) mod <VAR>modulus</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX522"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>modular:*</B> <I>modulus n2 n3</I>
+<DD><P>
+
+Returns (<VAR>n2</VAR> * <VAR>n3</VAR>) mod <VAR>modulus</VAR>.
+</P>
+<P>
+
+The Scheme code for <CODE>modular:*</CODE> with negative <VAR>modulus</VAR> is
+not completed for fixnum-only implementations.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX523"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>modular:expt</B> <I>modulus n2 n3</I>
+<DD><P>
+
+Returns (<VAR>n2</VAR> ^ <VAR>n3</VAR>) mod <VAR>modulus</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="Prime Numbers"></A>
+<HR SIZE="6">
+<A NAME="SEC96"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC95"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.3 Prime Numbers </H2>
+<!--docid::SEC96::-->
+<P>
+
+<CODE>(require 'factor)</CODE>
+<A NAME="IDX524"></A>
+<A NAME="IDX525"></A>
+</P>
+<P>
+
+<A NAME="IDX526"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>prime:prngs</B>
+<DD><P>
+
+<VAR>prime:prngs</VAR> is the random-state (see section <A HREF="slib_5.html#SEC97">5.4 Random Numbers</A>) used by these
+procedures. If you call these procedures from more than one thread
+(or from interrupt), <CODE>random</CODE> may complain about reentrant
+calls.
+</P>
+</DL>
+<EM>Note:</EM> The prime test and generation procedures implement (or
+use) the Solovay-Strassen primality test. See
+<P>
+
+<UL>
+<LI>Robert Solovay and Volker Strassen,
+<CITE>A Fast Monte-Carlo Test for Primality</CITE>,
+SIAM Journal on Computing, 1977, pp 84-85.
+</UL>
+<P>
+
+<A NAME="IDX527"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>jacobi-symbol</B> <I>p q</I>
+<DD><P>
+
+Returns the value (+1, -1, or 0) of the Jacobi-Symbol of
+exact non-negative integer <VAR>p</VAR> and exact positive odd integer <VAR>q</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX528"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>prime:trials</B>
+<DD><P>
+
+<VAR>prime:trials</VAR> the maxinum number of iterations of Solovay-Strassen that will
+be done to test a number for primality.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX529"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prime?</B> <I>n</I>
+<DD><P>
+
+Returns <CODE>#f</CODE> if <VAR>n</VAR> is composite; <CODE>#t</CODE> if <VAR>n</VAR> is prime.
+There is a slight chance <CODE>(expt 2 (- prime:trials))</CODE> that a
+composite will return <CODE>#t</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX530"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>primes&lt;</B> <I>start count</I>
+<DD><P>
+
+Returns a list of the first <VAR>count</VAR> prime numbers less than
+<VAR>start</VAR>. If there are fewer than <VAR>count</VAR> prime numbers
+less than <VAR>start</VAR>, then the returned list will have fewer than
+<VAR>start</VAR> elements.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX531"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>primes&gt;</B> <I>start count</I>
+<DD><P>
+
+Returns a list of the first <VAR>count</VAR> prime numbers greater than <VAR>start</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX532"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>factor</B> <I>k</I>
+<DD><P>
+
+Returns a list of the prime factors of <VAR>k</VAR>. The order of the
+factors is unspecified. In order to obtain a sorted list do
+<CODE>(sort! (factor <VAR>k</VAR>) &lt;)</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="Random Numbers"></A>
+<HR SIZE="6">
+<A NAME="SEC97"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC96"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC98"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.4 Random Numbers </H2>
+<!--docid::SEC97::-->
+<P>
+
+<A NAME="IDX533"></A>
+<A NAME="IDX534"></A>
+A pseudo-random number generator is only as good as the tests it passes.
+George Marsaglia of Florida State University developed a battery of
+tests named <EM>DIEHARD</EM> (<A HREF="http://stat.fsu.edu/~geo/diehard.html">http://stat.fsu.edu/~geo/diehard.html</A>).
+`<TT>diehard.c</TT>' has a bug which the patch
+<A HREF="http://swissnet.ai.mit.edu/ftpdir/users/jaffer/diehard.c.pat">http://swissnet.ai.mit.edu/ftpdir/users/jaffer/diehard.c.pat</A> corrects.
+</P>
+<P>
+
+SLIB's PRNG generates 8 bits at a time. With the degenerate seed
+`<SAMP>0</SAMP>', the numbers generated pass DIEHARD; but when bits are
+combined from sequential bytes, tests fail. With the seed
+`<SAMP>http://swissnet.ai.mit.edu/~jaffer/SLIB.html</SAMP>', all of those
+tests pass.
+</P>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'random</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'random-inexact</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Exact Random Numbers"></A>
+<HR SIZE="6">
+<A NAME="SEC98"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC99"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.4.1 Exact Random Numbers </H3>
+<!--docid::SEC98::-->
+<P>
+
+<CODE>(require 'random)</CODE>
+<A NAME="IDX535"></A>
+</P>
+<P>
+
+<A NAME="IDX536"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>random</B> <I>n state</I>
+<DD><P>
+
+<A NAME="IDX537"></A>
+<DT><U>Function:</U> <B>random</B> <I>n</I>
+<DD></P>
+<P>
+
+<VAR>n</VAR> must be an exact positive integer. <CODE>random</CODE> returns an exact integer
+between zero (inclusive) and <VAR>n</VAR> (exclusive). The values returned by
+<CODE>random</CODE> are uniformly distributed from 0 to <VAR>n</VAR>.
+</P>
+<P>
+
+The optional argument <VAR>state</VAR> must be of the type returned by
+<CODE>(seed-&gt;random-state)</CODE> or <CODE>(make-random-state)</CODE>. It
+defaults to the value of the variable <CODE>*random-state*</CODE>. This
+object is used to maintain the state of the pseudo-random-number
+generator and is altered as a side effect of calls to <CODE>random</CODE>.
+</P>
+</DL>
+<A NAME="IDX538"></A>
+<DL>
+<DT><U>Variable:</U> <B>*random-state*</B>
+<DD>Holds a data structure that encodes the internal state of the
+random-number generator that <CODE>random</CODE> uses by default. The nature
+of this data structure is implementation-dependent. It may be printed
+out and successfully read back in, but may or may not function correctly
+as a random-number state object in another implementation.
+</DL>
+<P>
+
+<A NAME="IDX539"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>copy-random-state</B> <I>state</I>
+<DD><P>
+
+Returns a new copy of argument <VAR>state</VAR>.
+</P>
+<P>
+
+<A NAME="IDX540"></A>
+<DT><U>Function:</U> <B>copy-random-state</B>
+<DD>Returns a new copy of <CODE>*random-state*</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX541"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>seed-&gt;random-state</B> <I>seed</I>
+<DD><P>
+
+Returns a new object of type suitable for use as the value of the
+variable <CODE>*random-state*</CODE> or as a second argument to <CODE>random</CODE>.
+The number or string <VAR>seed</VAR> is used to initialize the state. If
+<CODE>seed-&gt;random-state</CODE> is called twice with arguments which are
+<CODE>equal?</CODE>, then the returned data structures will be <CODE>equal?</CODE>.
+Calling <CODE>seed-&gt;random-state</CODE> with unequal arguments will nearly
+always return unequal states.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX542"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-random-state</B>
+<DD><P>
+
+<A NAME="IDX543"></A>
+<DT><U>Function:</U> <B>make-random-state</B> <I>obj</I>
+<DD>Returns a new object of type suitable for use as the value of the
+variable <CODE>*random-state*</CODE> or as a second argument to <CODE>random</CODE>.
+If the optional argument <VAR>obj</VAR> is given, it should be a printable
+Scheme object; the first 50 characters of its printed representation
+will be used as the seed. Otherwise the value of <CODE>*random-state*</CODE>
+is used as the seed.
+</P>
+</DL>
+<P>
+
+<A NAME="Inexact Random Numbers"></A>
+<HR SIZE="6">
+<A NAME="SEC99"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC98"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC100"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.4.2 Inexact Random Numbers </H3>
+<!--docid::SEC99::-->
+<P>
+
+<CODE>(require 'random-inexact)</CODE>
+<A NAME="IDX544"></A>
+</P>
+<P>
+
+<A NAME="IDX545"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>random:uniform</B>
+<DD><P>
+
+<A NAME="IDX546"></A>
+<DT><U>Function:</U> <B>random:uniform</B> <I>state</I>
+<DD>Returns an uniformly distributed inexact real random number in the
+range between 0 and 1.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX547"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>random:exp</B>
+<DD><P>
+
+<A NAME="IDX548"></A>
+<DT><U>Function:</U> <B>random:exp</B> <I>state</I>
+<DD>Returns an inexact real in an exponential distribution with mean 1. For
+an exponential distribution with mean <VAR>u</VAR> use
+<CODE>(* <VAR>u</VAR> (random:exp))</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX549"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>random:normal</B>
+<DD><P>
+
+<A NAME="IDX550"></A>
+<DT><U>Function:</U> <B>random:normal</B> <I>state</I>
+<DD>Returns an inexact real in a normal distribution with mean 0 and
+standard deviation 1. For a normal distribution with mean <VAR>m</VAR> and
+standard deviation <VAR>d</VAR> use
+<CODE>(+ <VAR>m</VAR> (* <VAR>d</VAR> (random:normal)))</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX551"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>random:normal-vector!</B> <I>vect</I>
+<DD><P>
+
+<A NAME="IDX552"></A>
+<DT><U>Procedure:</U> <B>random:normal-vector!</B> <I>vect state</I>
+<DD>Fills <VAR>vect</VAR> with inexact real random numbers which are independent
+and standard normally distributed (i.e., with mean 0 and variance 1).
+</P>
+</DL>
+<P>
+
+<A NAME="IDX553"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>random:hollow-sphere!</B> <I>vect</I>
+<DD><P>
+
+<A NAME="IDX554"></A>
+<DT><U>Procedure:</U> <B>random:hollow-sphere!</B> <I>vect state</I>
+<DD>Fills <VAR>vect</VAR> with inexact real random numbers the sum of whose
+squares is equal to 1.0. Thinking of <VAR>vect</VAR> as coordinates in space
+of dimension n = <CODE>(vector-length <VAR>vect</VAR>)</CODE>, the coordinates are
+uniformly distributed over the surface of the unit n-shere.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX555"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>random:solid-sphere!</B> <I>vect</I>
+<DD><P>
+
+<A NAME="IDX556"></A>
+<DT><U>Procedure:</U> <B>random:solid-sphere!</B> <I>vect state</I>
+<DD>Fills <VAR>vect</VAR> with inexact real random numbers the sum of whose
+squares is less than 1.0. Thinking of <VAR>vect</VAR> as coordinates in
+space of dimension <VAR>n</VAR> = <CODE>(vector-length <VAR>vect</VAR>)</CODE>, the
+coordinates are uniformly distributed within the unit <VAR>n</VAR>-shere.
+The sum of the squares of the numbers is returned.
+</P>
+</DL>
+<P>
+
+<A NAME="Fast Fourier Transform"></A>
+<HR SIZE="6">
+<A NAME="SEC100"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC99"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC101"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.5 Fast Fourier Transform </H2>
+<!--docid::SEC100::-->
+<P>
+
+<CODE>(require 'fft)</CODE>
+<A NAME="IDX557"></A>
+</P>
+<P>
+
+<A NAME="IDX558"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>fft</B> <I>array</I>
+<DD><P>
+
+<VAR>array</VAR> is an array of <CODE>(expt 2 n)</CODE> numbers. <CODE>fft</CODE>
+returns an array of complex numbers comprising the
+<EM>Discrete Fourier Transform</EM> of <VAR>array</VAR>.
+<A NAME="IDX559"></A>
+</P>
+</DL>
+<P>
+
+<A NAME="IDX560"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>fft-1</B> <I>array</I>
+<DD><P>
+
+<CODE>fft-1</CODE> returns an array of complex numbers comprising the
+inverse Discrete Fourier Transform of <VAR>array</VAR>.
+</P>
+</DL>
+<CODE>(fft-1 (fft <VAR>array</VAR>))</CODE> will return an array of values close to
+<VAR>array</VAR>.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(fft '#(1 0+i -1 0-i 1 0+i -1 0-i)) =>
+
+#(0.0 0.0 0.0+628.0783185208527e-18i 0.0
+ 0.0 0.0 8.0-628.0783185208527e-18i 0.0)
+
+(fft-1 '#(0 0 0 0 0 0 8 0)) =>
+
+#(1.0 -61.23031769111886e-18+1.0i -1.0 61.23031769111886e-18-1.0i
+ 1.0 -61.23031769111886e-18+1.0i -1.0 61.23031769111886e-18-1.0i)
+</pre></td></tr></table><P>
+
+<A NAME="Cyclic Checksum"></A>
+<HR SIZE="6">
+<A NAME="SEC101"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC100"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.6 Cyclic Checksum </H2>
+<!--docid::SEC101::-->
+<P>
+
+<CODE>(require 'crc)</CODE>
+<A NAME="IDX561"></A>
+Cyclic Redundancy Checks using Galois field GF(2) polynomial
+arithmetic are used for error detection in many data transmission
+and storage applications.
+</P>
+<P>
+
+The generator polynomials for various CRC protocols are availble
+from many sources. But the polynomial is just one of many
+parameters which must match in order for a CRC implementation to
+interoperate with existing systems:
+</P>
+<P>
+
+<UL>
+
+<LI>
+the byte-order and bit-order of the data stream;
+<P>
+
+</P>
+<LI>
+whether the CRC or its inverse is being calculated;
+<P>
+
+</P>
+<LI>
+the initial CRC value; and
+<P>
+
+</P>
+<LI>
+whether and where the CRC value is appended (inverted
+or non-inverted) to the data stream.
+<P>
+
+</UL>
+<P>
+
+There is even some controversy over the polynomials themselves.
+</P>
+<P>
+
+<A NAME="IDX562"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>crc-32-polynomial</B>
+<DD>For CRC-32, http://www2.sis.pitt.edu/~jkabara/tele-2100/lect08.html
+gives x^32+x^26+x^23+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+1.
+<P>
+
+But
+http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
+http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm,
+http://spinroot.com/spin/Doc/Book91_PDF/ch3.pdf,
+http://www.erg.abdn.ac.uk/users/gorry/course/dl-pages/crc.html,
+http://www.rad.com/networks/1994/err_con/crc_most.htm, and
+http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html,
+http://www.nobugconsulting.ro/crc.php give
+x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
+</P>
+<P>
+
+SLIB <CODE>crc-32-polynomial</CODE> uses the latter definition.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX563"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>crc-ccitt-polynomial</B>
+<DD><P>
+
+http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html,
+http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm,
+http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
+http://www2.sis.pitt.edu/~jkabara/tele-2100/lect08.html, and
+http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html give
+CRC-CCITT: x^16+x^12+x^5+1.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX564"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>crc-16-polynomial</B>
+<DD><P>
+
+http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html,
+http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm,
+http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
+http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html, and
+http://www.usb.org/developers/data/crcdes.pdf give
+CRC-16: x^16+x^15+x^2+1.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX565"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>crc-12-polynomial</B>
+<DD><P>
+
+http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html,
+http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
+http://www.it.iitb.ac.in/it605/lectures/link/node4.html, and
+http://spinroot.com/spin/Doc/Book91_PDF/ch3.pdf give
+CRC-12: x^12+x^11+x^3+x^2+1.
+</P>
+<P>
+
+But
+http://www.ffldusoe.edu/Faculty/Denenberg/Topics/Networks/Error_Detection_Correction/crc.html,
+http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm,
+http://www.eng.uwi.tt/depts/elec/staff/kimal/errorcc.html,
+http://www.ee.uwa.edu.au/~roberto/teach/itc314/java/CRC/,
+http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html, and
+http://www.efg2.com/Lab/Mathematics/CRC.htm give
+CRC-12: x^12+x^11+x^3+x^2+x+1.
+</P>
+<P>
+
+These differ in bit 1 and calculations using them return different
+values. With citations near evenly split, it is hard to know which is
+correct.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX566"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>crc-10-polynomial</B>
+<DD><P>
+
+http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html gives
+CRC-10: x^10+x^9+x^5+x^4+1;
+but
+http://cell-relay.indiana.edu/cell-relay/publications/software/CRC/crc10.html,
+http://www.it.iitb.ac.in/it605/lectures/link/node4.html,
+http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html,
+http://www.techfest.com/networking/atm/atm.htm,
+http://www.protocols.com/pbook/atmcell2.htm, and
+http://www.nobugconsulting.ro/crc.php give
+CRC-10: x^10+x^9+x^5+x^4+x+1.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX567"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>crc-08-polynomial</B>
+<DD><P>
+
+http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html,
+http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html,
+http://www.it.iitb.ac.in/it605/lectures/link/node4.html, and
+http://www.nobugconsulting.ro/crc.php give
+CRC-8: x^8+x^2+x^1+1
+</P>
+</DL>
+<P>
+
+<A NAME="IDX568"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>atm-hec-polynomial</B>
+<DD><P>
+
+http://cell-relay.indiana.edu/cell-relay/publications/software/CRC/32bitCRC.tutorial.html and
+http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html give
+ATM HEC: x^8+x^2+x+1.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX569"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>dowcrc-polynomial</B>
+<DD><P>
+
+http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html gives
+DOWCRC: x^8+x^5+x^4+1.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX570"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>usb-token-polynomial</B>
+<DD><P>
+
+http://www.usb.org/developers/data/crcdes.pdf and
+http://www.nobugconsulting.ro/crc.php give
+USB-token: x^5+x^2+1.
+</P>
+</DL>
+<P>
+
+Each of these polynomial constants is a string of `<SAMP>1</SAMP>'s and
+`<SAMP>0</SAMP>'s, the exponent of each power of <VAR>x</VAR> in descending order.
+</P>
+<P>
+
+<A NAME="IDX571"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>crc:make-table</B> <I>poly</I>
+<DD><P>
+
+<VAR>poly</VAR> must be string of `<SAMP>1</SAMP>'s and `<SAMP>0</SAMP>'s beginning with
+`<SAMP>1</SAMP>' and having length greater than 8. <CODE>crc:make-table</CODE>
+returns a vector of 256 integers, such that:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! <VAR>crc</VAR>
+ (logxor (ash (logand (+ -1 (ash 1 (- <VAR>deg</VAR> 8))) <VAR>crc</VAR>) 8)
+ (vector-ref <VAR>crc-table</VAR>
+ (logxor (ash <VAR>crc</VAR> (- 8 <VAR>deg</VAR>)) <VAR>byte</VAR>))))
+</pre></td></tr></table><P>
+
+will compute the <VAR>crc</VAR> with the 8 additional bits in <VAR>byte</VAR>;
+where <VAR>crc</VAR> is the previous accumulated CRC value, <VAR>deg</VAR> is
+the degree of <VAR>poly</VAR>, and <VAR>crc-table</VAR> is the vector returned
+by <CODE>crc:make-table</CODE>.
+</P>
+<P>
+
+If the implementation does not support <VAR>deg</VAR>-bit integers, then
+<CODE>crc:make-table</CODE> returns #f.
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX572"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>cksum</B> <I>file</I>
+<DD><P>
+
+Computes the P1003.2/D11.2 (POSIX.2) 32-bit checksum of <VAR>file</VAR>.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'crc)
+<A NAME="IDX573"></A>(cksum (in-vicinity (library-vicinity) &quot;ratize.scm&quot;))
+=> 157103930
+</pre></td></tr></table><P>
+
+<A NAME="IDX574"></A>
+<DT><U>Function:</U> <B>cksum</B> <I>port</I>
+<DD>Computes the checksum of the bytes read from <VAR>port</VAR> until the
+end-of-file.
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX575"></A>
+<CODE>cksum-string</CODE>, which returns the P1003.2/D11.2 (POSIX.2) 32-bit
+checksum of the bytes in <VAR>str</VAR>, can be defined as follows:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'string-port)
+(define (cksum-string str) (call-with-input-string str cksum))
+</pre></td></tr></table><P>
+
+<A NAME="IDX576"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>crc16</B> <I>file</I>
+<DD><P>
+
+Computes the USB data-packet (16-bit) CRC of <VAR>file</VAR>.
+</P>
+<P>
+
+<A NAME="IDX577"></A>
+<DT><U>Function:</U> <B>crc16</B> <I>port</I>
+<DD>Computes the USB data-packet (16-bit) CRC of the bytes read from
+<VAR>port</VAR> until the end-of-file.
+</P>
+<P>
+
+<CODE>crc16</CODE> calculates the same values as the crc16.pl program given
+in http://www.usb.org/developers/data/crcdes.pdf.
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX578"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>crc5</B> <I>file</I>
+<DD><P>
+
+Computes the USB token (5-bit) CRC of <VAR>file</VAR>.
+</P>
+<P>
+
+<A NAME="IDX579"></A>
+<DT><U>Function:</U> <B>crc5</B> <I>port</I>
+<DD>Computes the USB token (5-bit) CRC of the bytes read from
+<VAR>port</VAR> until the end-of-file.
+</P>
+<P>
+
+<CODE>crc5</CODE> calculates the same values as the crc5.pl program given
+in http://www.usb.org/developers/data/crcdes.pdf.
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="Graphing"></A>
+<HR SIZE="6">
+<A NAME="SEC102"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC101"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC103"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7 Graphing </H2>
+<!--docid::SEC102::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Character Plotting"></A>
+<HR SIZE="6">
+<A NAME="SEC103"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7.1 Character Plotting </H3>
+<!--docid::SEC103::-->
+<P>
+
+<CODE>(require 'charplot)</CODE>
+<A NAME="IDX580"></A>
+</P>
+<P>
+
+<A NAME="IDX581"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>charplot:dimensions</B>
+<DD>A list of the maximum height (number of lines) and maximum width (number
+of columns) for the graph, its scales, and labels.
+<P>
+
+The default value for <VAR>charplot:dimensions</VAR> is the
+<CODE>output-port-height</CODE> and <CODE>output-port-width</CODE> of
+<CODE>current-output-port</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX582"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>plot</B> <I>coords x-label y-label</I>
+<DD><VAR>coords</VAR> is a list or vector of coordinates, lists of x and y
+coordinates. <VAR>x-label</VAR> and <VAR>y-label</VAR> are strings with which to
+label the x and y axes.
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'charplot)
+<A NAME="IDX583"></A>(set! charplot:dimensions '(20 55))
+
+(define (make-points n)
+ (if (zero? n)
+ '()
+ (cons (list (/ n 6) (sin (/ n 6))) (make-points (1- n)))))
+
+(plot (make-points 40) &quot;x&quot; &quot;Sin(x)&quot;)
+-|
+ Sin(x) _________________________________________
+ 1|- **** |
+ | ** ** |
+ 0.75|- * * |
+ | * * |
+ 0.5|- * * |
+ | * *|
+ 0.25|- * * |
+ | * * |
+ 0|-------------------*------------------*--|
+ | * |
+ -0.25|- * * |
+ | * * |
+ -0.5|- * |
+ | * * |
+ -0.75|- * * |
+ | ** ** |
+ -1|- **** |
+ |:_____._____:_____._____:_____._____:____|
+ x 2 4 6
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX584"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>plot</B> <I>func x1 x2</I>
+<DD><A NAME="IDX585"></A>
+<DT><U>Procedure:</U> <B>plot</B> <I>func x1 x2 npts</I>
+<DD>Plots the function of one argument <VAR>func</VAR> over the range <VAR>x1</VAR> to
+<VAR>x2</VAR>. If the optional integer argument <VAR>npts</VAR> is supplied, it
+specifies the number of points to evaluate <VAR>func</VAR> at.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(plot sin 0 (* 2 pi))
+-|
+ _________________________________________
+ 1|-: **** |
+ | : ** ** |
+ 0.75|-: * * |
+ | : * * |
+ 0.5|-: ** ** |
+ | : * * |
+ 0.25|-:** ** |
+ | :* * |
+ 0|-*------------------*--------------------|
+ | : * * |
+ -0.25|-: ** ** |
+ | : * * |
+ -0.5|-: * ** |
+ | : * * |
+ -0.75|-: * ** |
+ | : ** ** |
+ -1|-: **** |
+ |_:_____._____:_____._____:_____._____:___|
+ 0 2 4 6
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX586"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>histograph</B> <I>data label</I>
+<DD>Creates and displays a histogram of the numerical values contained in
+vector or list <VAR>data</VAR>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'random-inexact)
+(histograph (do ((idx 99 (+ -1 idx))
+ (lst '() (cons (* .02 (random:normal)) lst)))
+ ((negative? idx) lst))
+ &quot;normal&quot;)
+-|
+ _________________________________________
+ 8|- : I |
+ | : I |
+ 7|- I I : I |
+ | I I : I |
+ 6|- III I :I I |
+ | III I :I I |
+ 5|- IIIIIIIIII I |
+ | IIIIIIIIII I |
+ 4|- IIIIIIIIIIII |
+ | IIIIIIIIIIII |
+ 3|-I I I IIIIIIIIIIII II I |
+ | I I I IIIIIIIIIIII II I |
+ 2|-I I I IIIIIIIIIIIIIIIII I |
+ | I I I IIIIIIIIIIIIIIIII I |
+ 1|-II I I IIIIIIIIIIIIIIIIIIIII I I I |
+ | II I I IIIIIIIIIIIIIIIIIIIII I I I |
+ 0|-IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII----|
+ |__.____:____.____:____.____:____.____:___|
+ normal -0.025 0 0.025 0.05
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="PostScript Graphing"></A>
+<HR SIZE="6">
+<A NAME="SEC104"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC103"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC105"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7.2 PostScript Graphing </H3>
+<!--docid::SEC104::-->
+<P>
+
+<CODE>(require 'eps-graph)</CODE>
+</P>
+<P>
+
+This is a graphing package creating encapsulated-PostScript files.
+Its motivations and design choice are described in
+<A HREF="http://swissnet.ai.mit.edu/~jaffer/Docupage/grapheps">http://swissnet.ai.mit.edu/~jaffer/Docupage/grapheps</A>
+</P>
+<P>
+
+A dataset to be plotted is taken from a 2-dimensional array.
+Corresponding coordinates are in rows. Coordinates from any
+pair of columns can be plotted.
+</P>
+<P>
+
+<A NAME="IDX587"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>create-postscript-graph</B> <I>filename.eps size elt1 <small>...</small></I>
+<DD><P>
+
+<VAR>filename.eps</VAR> should be a string naming an output file to be created. <VAR>size</VAR>
+should be an exact integer, a list of two exact integers, or #f.
+<VAR>elt1</VAR>, ... are values returned by graphing primitives described here.
+</P>
+<P>
+
+<CODE>create-postscript-graph</CODE> creates an <EM>Encapsulated-PostScript</EM> file named <VAR>filename.eps</VAR> containing
+<A NAME="IDX588"></A>
+graphs as directed by the <VAR>elt1</VAR>, ... arguments.
+</P>
+<P>
+
+The size of the graph is determined by the <VAR>size</VAR> argument. If a list
+of two integers, they specify the width and height. If one integer,
+then that integer is the width and the height is 3/4 of the width.
+If #f, the graph will be 800 by 600.
+</P>
+</DL>
+These graphing procedures should be called as arguments to
+<CODE>create-postscript-graph</CODE>. The order of these arguments is
+significant; PostScript graphics state is affected serially from the
+first <VAR>elt</VAR> argument to the last.
+<P>
+
+<A NAME="IDX589"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>whole-page</B>
+<DD><P>
+
+Pushes a rectangle for the whole encapsulated page onto the
+PostScript stack. This pushed rectangle is an implicit argument to
+<CODE>partition-page</CODE> or <CODE>setup-plot</CODE>.
+</P>
+</DL>
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC106">5.7.2.2 Drawing the Graph</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC111">5.7.2.7 Example Graph</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Column Ranges"></A>
+<HR SIZE="6">
+<A NAME="SEC105"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC106"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7.2.1 Column Ranges </H4>
+<!--docid::SEC105::-->
+<P>
+
+A <EM>range</EM> is a list of two numbers, the minimum and the maximum.
+<A NAME="IDX590"></A>
+<A NAME="IDX591"></A>
+Ranges can be given explicity or computed in PostScript by
+<CODE>column-range</CODE>.
+</P>
+<P>
+
+<A NAME="IDX592"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>column-range</B> <I>array k</I>
+<DD><P>
+
+Returns the range of values in 2-dimensional <VAR>array</VAR> column <VAR>k</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX593"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>pad-range</B> <I>range p</I>
+<DD><P>
+
+Expands <VAR>range</VAR> by <VAR>p</VAR>/100 on each end.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX594"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>snap-range</B> <I>range</I>
+<DD><P>
+
+Expands <VAR>range</VAR> to round number of ticks.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX595"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>combine-ranges</B> <I>range1 range2 <small>...</small></I>
+<DD><P>
+
+Returns the minimal range covering all <VAR>range1</VAR>, <VAR>range2</VAR>, ...
+</P>
+</DL>
+<P>
+
+<A NAME="IDX596"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>setup-plot</B> <I>x-range y-range pagerect</I>
+<DD><P>
+
+<A NAME="IDX597"></A>
+<DT><U>Function:</U> <B>setup-plot</B> <I>x-range y-range</I>
+<DD><VAR>x-range</VAR> and <VAR>y-range</VAR> should each be a list of two numbers or the value returned
+by <CODE>pad-range</CODE>, <CODE>snap-range</CODE>, or <CODE>combine-range</CODE>.
+<VAR>pagerect</VAR> is the rectangle bounding the graph to be drawn; if missing, the
+rectangle from the top of the PostScript stack is popped and used.
+</P>
+<P>
+
+Based on the given ranges, <CODE>setup-plot</CODE> sets up scaling and margins for making
+a graph. The margins are sized proportional to the <VAR>fontheight</VAR>
+value at the time of the call to setup-plot. <CODE>setup-plot</CODE> sets two variables:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><VAR>plotrect</VAR>
+<DD>The region where data points will be plotted.
+<DT><VAR>graphrect</VAR>
+<DD>The <VAR>pagerect</VAR> argument to <CODE>setup-plot</CODE>. Includes plotrect, legends, etc.
+</DL>
+</DL>
+<A NAME="Drawing the Graph"></A>
+<HR SIZE="6">
+<A NAME="SEC106"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC105"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC107"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7.2.2 Drawing the Graph </H4>
+<!--docid::SEC106::-->
+<P>
+
+<A NAME="IDX598"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>plot-column</B> <I>array x-column y-column proc3s</I>
+<DD><P>
+
+Plots points with x coordinate in <VAR>x-column</VAR> of <VAR>array</VAR> and y coordinate <VAR>y-column</VAR> of
+<VAR>array</VAR>. The symbol <VAR>proc3s</VAR> specifies the type of glyph or drawing style for
+presenting these coordinates.
+</P>
+</DL>
+The glyphs and drawing styles available are:
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>line</CODE>
+<DD>Draws line connecting points in order.
+<DT><CODE>mountain</CODE>
+<DD>Fill area below line connecting points.
+<DT><CODE>cloud</CODE>
+<DD>Fill area above line connecting points.
+<DT><CODE>impulse</CODE>
+<DD>Draw line from x-axis to each point.
+<DT><CODE>bargraph</CODE>
+<DD>Draw rectangle from x-axis to each point.
+<DT><CODE>disc</CODE>
+<DD>Solid round dot.
+<DT><CODE>point</CODE>
+<DD>Minimal point -- invisible if linewidth is 0.
+<DT><CODE>square</CODE>
+<DD>Square box.
+<DT><CODE>diamond</CODE>
+<DD>Square box at 45.o
+<DT><CODE>plus</CODE>
+<DD>Plus sign.
+<DT><CODE>cross</CODE>
+<DD>X sign.
+<DT><CODE>triup</CODE>
+<DD>Triangle pointing upward
+<DT><CODE>tridown</CODE>
+<DD>Triangle pointing downward
+<DT><CODE>pentagon</CODE>
+<DD>Five sided polygon
+<DT><CODE>circle</CODE>
+<DD>Hollow circle
+</DL>
+<P>
+
+<A NAME="Graphics Context"></A>
+<HR SIZE="6">
+<A NAME="SEC107"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC106"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC108"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7.2.3 Graphics Context </H4>
+<!--docid::SEC107::-->
+<P>
+
+<A NAME="IDX599"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>in-graphic-context</B> <I>arg <small>...</small></I>
+<DD><P>
+
+Saves the current graphics state, executes <VAR>args</VAR>, then restores
+to saved graphics state.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX600"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>set-color</B> <I>color</I>
+<DD><P>
+
+<VAR>color</VAR> should be a string naming a Resene color, a saturate color, or a
+number between 0 and 100.
+</P>
+<P>
+
+<CODE>set-color</CODE> sets the PostScript color to the color of the given string, or a
+grey value between black (0) and white (100).
+</P>
+</DL>
+<P>
+
+<A NAME="IDX601"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>set-font</B> <I>name fontheight</I>
+<DD><P>
+
+<VAR>name</VAR> should be a (case-sensitive) string naming a PostScript font.
+<VAR>fontheight</VAR> should be a positive real number.
+</P>
+<P>
+
+<CODE>set-font</CODE> Changes the current PostScript font to <VAR>name</VAR> with height equal to
+<VAR>fontheight</VAR>. The default font is Helvetica (12pt).
+</P>
+</DL>
+The base set of PostScript fonts is:
+<P>
+
+</P>
+<TABLE>
+<TR><TD>Times </TD><TD> Times-Italic </TD><TD> Times-Bold </TD><TD> Times-BoldItalic</TD>
+</TR>
+<TR><TD>Helvetica </TD><TD> Helvetica-Oblique </TD><TD> Helvetica-Bold </TD><TD> Helvetica-BoldOblique</TD>
+</TR>
+<TR><TD>Courier </TD><TD> Courier-Oblique </TD><TD> Courier-Bold </TD><TD> Courier-BoldOblique</TD>
+</TR>
+<TR><TD>Symbol</TD>
+</TR></TABLE>
+<P>
+
+Line parameters do no affect fonts; they do effect glyphs.
+</P>
+<P>
+
+<A NAME="IDX602"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>set-linewidth</B> <I>w</I>
+<DD><P>
+
+The default linewidth is 1. Setting it to 0 makes the lines drawn
+as skinny as possible. Linewidth must be much smaller than
+glyphsize for readable glyphs.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX603"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>set-linedash</B> <I>j k</I>
+<DD><P>
+
+Lines are drawn <VAR>j</VAR>-on <VAR>k</VAR>-off.
+</P>
+<P>
+
+<A NAME="IDX604"></A>
+<DT><U>Function:</U> <B>set-linedash</B> <I>j</I>
+<DD>Lines are drawn <VAR>j</VAR>-on <VAR>j</VAR>-off.
+</P>
+<P>
+
+<A NAME="IDX605"></A>
+<DT><U>Function:</U> <B>set-linedash</B>
+<DD>Turns off dashing.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX606"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>set-glyphsize</B> <I>w</I>
+<DD><P>
+
+Sets the (PostScript) variable glyphsize to <VAR>w</VAR>. The default
+glyphsize is 6.
+</P>
+</DL>
+The effects of <CODE>clip-to-rect</CODE> are also part of the graphic
+context.
+<P>
+
+<A NAME="Rectangles"></A>
+<HR SIZE="6">
+<A NAME="SEC108"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC107"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC109"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7.2.4 Rectangles </H4>
+<!--docid::SEC108::-->
+<P>
+
+A <EM>rectangle</EM> is a list of 4 numbers; the first two elements are
+<A NAME="IDX607"></A>
+the x and y coordinates of lower left corner of the rectangle. The
+other two elements are the width and height of the rectangle.
+</P>
+<P>
+
+<A NAME="IDX608"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>whole-page</B>
+<DD><P>
+
+Pushes a rectangle for the whole encapsulated page onto the
+PostScript stack. This pushed rectangle is an implicit argument to
+<CODE>partition-page</CODE> or <CODE>setup-plot</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX609"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>partition-page</B> <I>xparts yparts</I>
+<DD><P>
+
+Pops the rectangle currently on top of the stack and pushes <VAR>xparts</VAR> * <VAR>yparts</VAR>
+sub-rectangles onto the stack in decreasing y and increasing x order.
+If you are drawing just one graph, then you don't need <CODE>partition-page</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX610"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>plotrect</B>
+<DD><P>
+
+The rectangle where data points should be plotted. <VAR>plotrect</VAR> is set by
+<CODE>setup-plot</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX611"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>graphrect</B>
+<DD><P>
+
+The <VAR>pagerect</VAR> argument of the most recent call to
+<CODE>setup-plot</CODE>. Includes plotrect, legends, etc.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX612"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>fill-rect</B> <I>rect</I>
+<DD><P>
+
+fills <VAR>rect</VAR> with the current color.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX613"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>outline-rect</B> <I>rect</I>
+<DD><P>
+
+Draws the perimiter of <VAR>rect</VAR> in the current color.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX614"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>clip-to-rect</B> <I>rect</I>
+<DD><P>
+
+Modifies the current graphics-state so that nothing will be drawn
+outside of the rectangle <VAR>rect</VAR>. Use <CODE>in-graphic-context</CODE> to limit
+the extent of <CODE>clip-to-rect</CODE>.
+</P>
+</DL>
+<A NAME="Legending"></A>
+<HR SIZE="6">
+<A NAME="SEC109"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC108"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC110"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7.2.5 Legending </H4>
+<!--docid::SEC109::-->
+<P>
+
+<A NAME="IDX615"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>title-top</B> <I>title subtitle</I>
+<DD><P>
+
+<A NAME="IDX616"></A>
+<DT><U>Function:</U> <B>title-top</B> <I>title</I>
+<DD>Puts a <VAR>title</VAR> line and an optional <VAR>subtitle</VAR> line above the <CODE>graphrect</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX617"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>title-bottom</B> <I>title subtitle</I>
+<DD><P>
+
+<A NAME="IDX618"></A>
+<DT><U>Function:</U> <B>title-bottom</B> <I>title</I>
+<DD>Puts a <VAR>title</VAR> line and an optional <VAR>subtitle</VAR> line below the <CODE>graphrect</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX619"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>topedge</B>
+<DD><A NAME="IDX620"></A>
+<DT><U>Variable:</U> <B>bottomedge</B>
+<DD><P>
+
+These edge coordinates of <CODE>graphrect</CODE> are suitable for passing
+as the first argument to <CODE>rule-horizontal</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX621"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>leftedge</B>
+<DD><A NAME="IDX622"></A>
+<DT><U>Variable:</U> <B>rightedge</B>
+<DD><P>
+
+These edge coordinates of <CODE>graphrect</CODE> are suitable for passing
+as the first argument to <CODE>rule-vertical</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX623"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>rule-vertical</B> <I>x-coord text tick-width</I>
+<DD><P>
+
+Draws a vertical ruler with X coordinate <VAR>x-coord</VAR> and labeled with string
+<VAR>text</VAR>. If <VAR>tick-width</VAR> is positive, then the ticks are <VAR>tick-width</VAR> long on the right side
+of <VAR>x-coord</VAR>; and <VAR>text</VAR> and numeric legends are on the left. If <VAR>tick-width</VAR> is
+negative, then the ticks are -<VAR>tick-width</VAR> long on the left side of <VAR>x-coord</VAR>; and <VAR>text</VAR>
+and numeric legends are on the right.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX624"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>rule-horizontal</B> <I>x-coord text tick-height</I>
+<DD><P>
+
+Draws a horizontal ruler with X coordinate <VAR>x-coord</VAR> and labeled with
+string <VAR>text</VAR>. If <VAR>tick-height</VAR> is positive, then the ticks are <VAR>tick-height</VAR> long on the
+right side of <VAR>x-coord</VAR>; and <VAR>text</VAR> and numeric legends are on the left. If <VAR>tick-height</VAR>
+is negative, then the ticks are -<VAR>tick-height</VAR> long on the left side of <VAR>x-coord</VAR>; and
+<VAR>text</VAR> and numeric legends are on the right.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX625"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>y-axis</B>
+<DD><P>
+
+Draws the y-axis.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX626"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>x-axis</B>
+<DD><P>
+
+Draws the x-axis.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX627"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>grid-verticals</B>
+<DD><P>
+
+Draws vertical lines through <CODE>graphrect</CODE> at each tick on the
+vertical ruler.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX628"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>grid-horizontals</B>
+<DD><P>
+
+Draws horizontal lines through <CODE>graphrect</CODE> at each tick on the
+horizontal ruler.
+</P>
+</DL>
+<A NAME="Legacy Plotting"></A>
+<HR SIZE="6">
+<A NAME="SEC110"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC109"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC111"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7.2.6 Legacy Plotting </H4>
+<!--docid::SEC110::-->
+<P>
+
+<A NAME="IDX629"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>graph:dimensions</B>
+<DD><P>
+
+A list of the width and height of the graph to be plotted using
+<CODE>plot</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX630"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>plot</B> <I>func x1 x2 npts</I>
+<DD><P>
+
+<A NAME="IDX631"></A>
+<DT><U>Function:</U> <B>plot</B> <I>func x1 x2</I>
+<DD>Creates and displays using <CODE>(system &quot;gv tmp.eps&quot;)</CODE> an
+encapsulated PostScript graph of the function of one argument <VAR>func</VAR>
+over the range <VAR>x1</VAR> to <VAR>x2</VAR>. If the optional integer argument <VAR>npts</VAR> is
+supplied, it specifies the number of points to evaluate <VAR>func</VAR> at.
+</P>
+<P>
+
+<A NAME="IDX632"></A>
+<DT><U>Function:</U> <B>plot</B> <I>coords x-label y-label</I>
+<DD><VAR>coords</VAR> is a list or vector of coordinates, lists of x and y
+coordinates. <VAR>x-label</VAR> and <VAR>y-label</VAR> are strings with which
+to label the x and y axes.
+</P>
+</DL>
+<A NAME="Example Graph"></A>
+<HR SIZE="6">
+<A NAME="SEC111"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC110"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC112"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.7.2.7 Example Graph </H4>
+<!--docid::SEC111::-->
+<P>
+
+The file `<TT>am1.5.html</TT>', a table of solar irradiance, is fetched
+with `<SAMP>wget</SAMP>' if it isn't already in the working directory. The
+file is read and stored into an array, <VAR>irradiance</VAR>.
+</P>
+<P>
+
+<CODE>create-postscript-graph</CODE> is then called to create an
+encapsulated-PostScript file, `<TT>solarad.eps</TT>'. The size of the
+page is set to 600 by 300. <CODE>whole-page</CODE> is called and leaves
+the rectangle on the PostScript stack. <CODE>setup-plot</CODE> is called
+with a literal range for x and computes the range for column 1.
+</P>
+<P>
+
+Two calls to <CODE>top-title</CODE> are made so a different font can be
+used for the lower half. <CODE>in-graphic-context</CODE> is used to limit
+the scope of the font change. The graphing area is outlined and a
+rule drawn on the left side.
+</P>
+<P>
+
+Because the X range was intentionally reduced,
+<CODE>in-graphic-context</CODE> is called and <CODE>clip-to-rect</CODE> limits
+drawing to the plotting area. A black line is drawn from data
+column 1. That line is then overlayed with a mountain plot of the
+same column colored &quot;Bright Sun&quot;.
+</P>
+<P>
+
+After returning from the <CODE>in-graphic-context</CODE>, the bottom ruler
+is drawn. Had it been drawn earlier, all its ticks would have been
+painted over by the mountain plot.
+</P>
+<P>
+
+The color is then changed to `<SAMP>seagreen</SAMP>' and the same graphrect
+is setup again, this time with a different Y scale, 0 to 1000. The
+graphic context is again clipped to <VAR>plotrect</VAR>, linedash is set,
+and column 2 is plotted as a dashed line. Finally the rightedge is
+ruled. Having the line and its scale both in green helps
+disambiguate the scales.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'eps-graph)
+(require 'line-i/o)
+(require 'string-port)
+
+(define irradiance
+ (let ((url &quot;http://www.pv.unsw.edu.au/am1.5.html&quot;)
+ (file &quot;am1.5.html&quot;))
+ (define (read-&gt;list line)
+ (define elts '())
+ (call-with-input-string line
+ (lambda (iprt) (do ((elt (read iprt) (read iprt)))
+ ((eof-object? elt) elts)
+ (set! elts (cons elt elts))))))
+ (if (not (file-exists? file))
+ (system (string-append &quot;wget -c -O&quot; file &quot; &quot; url)))
+ (call-with-input-file file
+ (lambda (iprt)
+ (define lines '())
+ (do ((line (read-line iprt) (read-line iprt)))
+ ((eof-object? line)
+ (let ((nra (create-array (Ar64)
+ (length lines)
+ (length (car lines)))))
+ (do ((lns lines (cdr lns))
+ (idx (+ -1 (length lines)) (+ -1 idx)))
+ ((null? lns) nra)
+ (do ((kdx (+ -1 (length (car lines))) (+ -1 kdx))
+ (lst (car lns) (cdr lst)))
+ ((null? lst))
+ (array-set! nra (car lst) idx kdx)))))
+ (if (and (positive? (string-length line))
+ (char-numeric? (string-ref line 0)))
+ (set! lines (cons (read-&gt;list line) lines))))))))
+
+(let ((xrange '(.25 2.5)))
+ (create-postscript-graph
+ &quot;solarad.eps&quot; '(600 300)
+ (whole-page)
+ (setup-plot xrange (column-range irradiance 1))
+ (title-top
+ &quot;Solar Irradiance http://www.pv.unsw.edu.au/am1.5.html&quot;)
+ (in-graphic-context
+ (set-font &quot;Helvetica-Oblique&quot; 12)
+ (title-top
+ &quot;&quot;
+ &quot;Key Centre for Photovoltaic Engineering UNSW - Air Mass 1.5 Global Spectrum&quot;))
+ (outline-rect plotrect)
+ (rule-vertical leftedge &quot;W/(m^2.um)&quot; 10)
+ (in-graphic-context (clip-to-rect plotrect)
+ (plot-column irradiance 0 1 'line)
+ (set-color &quot;Bright Sun&quot;)
+ (plot-column irradiance 0 1 'mountain)
+ )
+ (rule-horizontal bottomedge &quot;Wavelength in .um&quot; 5)
+ (set-color 'seagreen)
+
+ (setup-plot xrange '(0 1000) graphrect)
+ (in-graphic-context (clip-to-rect plotrect)
+ (set-linedash 5 2)
+ (plot-column irradiance 0 2 'line))
+ (rule-vertical rightedge &quot;Integrated .W/(m^2)&quot; -10)
+ ))
+
+(system &quot;gv solarad.eps&quot;)
+</pre></td></tr></table><P>
+
+<A NAME="Solid Modeling"></A>
+<HR SIZE="6">
+<A NAME="SEC112"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC111"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.8 Solid Modeling </H2>
+<!--docid::SEC112::-->
+<P>
+
+&lt;A NAME=&quot;Solid&quot;&gt;
+<CODE>(require 'solid)</CODE>
+&lt;/A&gt;
+<A NAME="IDX633"></A>
+<A NAME="IDX634"></A>
+<A NAME="IDX635"></A>
+</P>
+<P>
+
+<A HREF="http://swissnet.ai.mit.edu/~jaffer/Solid/#Example">http://swissnet.ai.mit.edu/~jaffer/Solid/#Example</A> gives an
+example use of this package.
+</P>
+<P>
+
+<A NAME="IDX636"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>vrml</B> <I>node <small>...</small></I>
+<DD>Returns the VRML97 string (including header) of the concatenation
+of strings <VAR>nodes</VAR>, <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX637"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>vrml-append</B> <I>node1 node2 <small>...</small></I>
+<DD>Returns the concatenation with interdigitated newlines of
+strings <VAR>node1</VAR>, <VAR>node2</VAR>, <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX638"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>vrml-to-file</B> <I>file node <small>...</small></I>
+<DD>Writes to file named <VAR>file</VAR> the VRML97 string (including header) of
+the concatenation of strings <VAR>nodes</VAR>, <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX639"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>world:info</B> <I>title info <small>...</small></I>
+<DD>Returns a VRML97 string setting the title of the file in which
+it appears to <VAR>title</VAR>. Additional strings <VAR>info</VAR>, <small>...</small> are comments.
+</DL>
+<P>
+
+VRML97 strings passed to <CODE>vrml</CODE> and <CODE>vrml-to-file</CODE> as
+arguments will appear in the resulting VRML code. This string turns
+off the headlight at the viewpoint:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>&quot; NavigationInfo {headlight FALSE}&quot;
+</pre></td></tr></table><P>
+
+<A NAME="IDX640"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scene:panorama</B> <I>front right back left top bottom</I>
+<DD>Specifies the distant images on the inside faces of the cube
+enclosing the virtual world.
+</DL>
+<P>
+
+<A NAME="IDX641"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scene:sphere</B> <I>colors angles</I>
+<DD><P>
+
+<VAR>colors</VAR> is a list of color objects. Each may be of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB integer, or a list of 3 numbers
+between 0.0 and 1.0.
+</P>
+<P>
+
+<VAR>angles</VAR> is a list of non-increasing angles the same length as
+<VAR>colors</VAR>. Each angle is between 90 and -90 degrees. If 90 or -90 are not
+elements of <VAR>angles</VAR>, then the color at the zenith and nadir are taken from
+the colors paired with the angles nearest them.
+</P>
+<P>
+
+<CODE>scene:sphere</CODE> fills horizontal bands with interpolated colors on the backgroud
+sphere encasing the world.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX642"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scene:sky-and-dirt</B>
+<DD>Returns a blue and brown backgroud sphere encasing the world.
+</DL>
+<P>
+
+<A NAME="IDX643"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scene:sky-and-grass</B>
+<DD>Returns a blue and green backgroud sphere encasing the world.
+</DL>
+<P>
+
+<A NAME="IDX644"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scene:sun</B> <I>latitude julian-day hour turbidity strength</I>
+<DD><P>
+
+<A NAME="IDX645"></A>
+<DT><U>Function:</U> <B>scene:sun</B> <I>latitude julian-day hour turbidity</I>
+<DD></P>
+<P>
+
+<VAR>latitude</VAR> is the virtual place's latitude in degrees. <VAR>julian-day</VAR> is an integer from
+0 to 366, the day of the year. <VAR>hour</VAR> is a real number from 0 to 24 for
+the time of day; 12 is noon. <VAR>turbidity</VAR> is the degree of fogginess described
+in See section <A HREF="slib_5.html#SEC133">turbidity</A>.
+</P>
+<P>
+
+<CODE>scene:sun</CODE> returns a bright yellow, distant sphere where the sun would be at
+<VAR>hour</VAR> on <VAR>julian-day</VAR> at <VAR>latitude</VAR>. If <VAR>strength</VAR> is positive, included is a light source of <VAR>strength</VAR>
+(default 1).
+</P>
+</DL>
+<P>
+
+<A NAME="IDX646"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scene:overcast</B> <I>latitude julian-day hour turbidity strength</I>
+<DD><P>
+
+<A NAME="IDX647"></A>
+<DT><U>Function:</U> <B>scene:overcast</B> <I>latitude julian-day hour turbidity</I>
+<DD></P>
+<P>
+
+<VAR>latitude</VAR> is the virtual place's latitude in degrees. <VAR>julian-day</VAR> is an integer from
+0 to 366, the day of the year. <VAR>hour</VAR> is a real number from 0 to 24 for
+the time of day; 12 is noon. <VAR>turbidity</VAR> is the degree of cloudiness described
+in See section <A HREF="slib_5.html#SEC133">turbidity</A>.
+</P>
+<P>
+
+<CODE>scene:overcast</CODE> returns an overcast sky as it might look at <VAR>hour</VAR> on <VAR>julian-day</VAR> at <VAR>latitude</VAR>. If <VAR>strength</VAR>
+is positive, included is an ambient light source of <VAR>strength</VAR> (default 1).
+</P>
+</DL>
+Viewpoints are objects in the virtual world, and can be transformed
+individually or with solid objects.
+<P>
+
+<A NAME="IDX648"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scene:viewpoint</B> <I>name distance compass pitch</I>
+<DD><P>
+
+<A NAME="IDX649"></A>
+<DT><U>Function:</U> <B>scene:viewpoint</B> <I>name distance compass</I>
+<DD>Returns a viewpoint named <VAR>name</VAR> facing the origin and placed <VAR>distance</VAR> from it.
+<VAR>compass</VAR> is a number from 0 to 360 giving the compass heading. <VAR>pitch</VAR> is a
+number from -90 to 90, defaulting to 0, specifying the angle from the
+horizontal.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX650"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scene:viewpoints</B> <I>proximity</I>
+<DD>Returns 6 viewpoints, one at the center of each face of a cube
+with sides 2 * <VAR>proximity</VAR>, centered on the origin.
+</DL>
+<A NAME="SEC113"></A>
+<H3> Light Sources </H3>
+<!--docid::SEC113::-->
+<P>
+
+In VRML97, lights shine only on objects within the same children node
+and descendants of that node. Although it would have been convenient
+to let light direction be rotated by <CODE>solid:rotation</CODE>, this
+restricts a rotated light's visibility to objects rotated with it.
+</P>
+<P>
+
+To workaround this limitation, these directional light source
+procedures accept either Cartesian or spherical coordinates for
+direction. A spherical coordinate is a list <CODE>(<VAR>theta</VAR>
+<VAR>azimuth</VAR>)</CODE>; where <VAR>theta</VAR> is the angle in degrees from the
+zenith, and <VAR>azimuth</VAR> is the angle in degrees due west of south.
+</P>
+<P>
+
+It is sometimes useful for light sources to be brighter than `<SAMP>1</SAMP>'.
+When <VAR>intensity</VAR> arguments are greater than 1, these functions
+gang multiple sources to reach the desired strength.
+</P>
+<P>
+
+<A NAME="IDX651"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>light:ambient</B> <I>color intensity</I>
+<DD><P>
+
+<A NAME="IDX652"></A>
+<DT><U>Function:</U> <B>light:ambient</B> <I>color</I>
+<DD>Ambient light shines on all surfaces with which it is grouped.
+</P>
+<P>
+
+<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB
+integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f,
+then the default color will be used. <VAR>intensity</VAR> is a real non-negative number
+defaulting to `<SAMP>1</SAMP>'.
+</P>
+<P>
+
+<CODE>light:ambient</CODE> returns a light source or sources of <VAR>color</VAR> with total strength of <VAR>intensity</VAR>
+(or 1 if omitted).
+</P>
+</DL>
+<P>
+
+<A NAME="IDX653"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>light:directional</B> <I>color direction intensity</I>
+<DD><P>
+
+<A NAME="IDX654"></A>
+<DT><U>Function:</U> <B>light:directional</B> <I>color direction</I>
+<DD></P>
+<P>
+
+<A NAME="IDX655"></A>
+<DT><U>Function:</U> <B>light:directional</B> <I>color</I>
+<DD>Directional light shines parallel rays with uniform intensity on all
+objects with which it is grouped.
+</P>
+<P>
+
+<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB
+integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f,
+then the default color will be used.
+</P>
+<P>
+
+<VAR>direction</VAR> must be a list or vector of 2 or 3 numbers specifying the direction
+to this light. If <VAR>direction</VAR> has 2 numbers, then these numbers are the angle
+from zenith and the azimuth in degrees; if <VAR>direction</VAR> has 3 numbers, then
+these are taken as a Cartesian vector specifying the direction to the
+light source. The default direction is upwards; thus its light will
+shine down.
+</P>
+<P>
+
+<VAR>intensity</VAR> is a real non-negative number defaulting to `<SAMP>1</SAMP>'.
+</P>
+<P>
+
+<CODE>light:directional</CODE> returns a light source or sources of <VAR>color</VAR> with total strength of <VAR>intensity</VAR>,
+shining from <VAR>direction</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX656"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>light:beam</B> <I>attenuation radius aperture peak</I>
+<DD><P>
+
+<A NAME="IDX657"></A>
+<DT><U>Function:</U> <B>light:beam</B> <I>attenuation radius aperture</I>
+<DD></P>
+<P>
+
+<A NAME="IDX658"></A>
+<DT><U>Function:</U> <B>light:beam</B> <I>attenuation radius</I>
+<DD></P>
+<P>
+
+<A NAME="IDX659"></A>
+<DT><U>Function:</U> <B>light:beam</B> <I>attenuation</I>
+<DD></P>
+<P>
+
+<VAR>attenuation</VAR> is a list or vector of three nonnegative real numbers specifying
+the reduction of intensity, the reduction of intensity with distance,
+and the reduction of intensity as the square of distance. <VAR>radius</VAR> is the
+distance beyond which the light does not shine. <VAR>radius</VAR> defaults to
+`<SAMP>100</SAMP>'.
+</P>
+<P>
+
+<VAR>aperture</VAR> is a real number between 0 and 180, the angle centered on the
+light's axis through which it sheds some light. <VAR>peak</VAR> is a real number
+between 0 and 90, the angle of greatest illumination.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX660"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>light:point</B> <I>location color intensity beam</I>
+<DD><P>
+
+<A NAME="IDX661"></A>
+<DT><U>Function:</U> <B>light:point</B> <I>location color intensity</I>
+<DD></P>
+<P>
+
+<A NAME="IDX662"></A>
+<DT><U>Function:</U> <B>light:point</B> <I>location color</I>
+<DD></P>
+<P>
+
+<A NAME="IDX663"></A>
+<DT><U>Function:</U> <B>light:point</B> <I>location</I>
+<DD></P>
+<P>
+
+Point light radiates from <VAR>location</VAR>, intensity decreasing with distance,
+towards all objects with which it is grouped.
+</P>
+<P>
+
+<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB
+integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f,
+then the default color will be used. <VAR>intensity</VAR> is a real non-negative number
+defaulting to `<SAMP>1</SAMP>'. <VAR>beam</VAR> is a structure returned by
+<CODE>light:beam</CODE> or #f.
+</P>
+<P>
+
+<CODE>light:point</CODE> returns a light source or sources at <VAR>location</VAR> of <VAR>color</VAR> with total strength
+<VAR>intensity</VAR> and <VAR>beam</VAR> properties. Note that the pointlight itself is not visible.
+To make it so, place an object with emissive appearance at <VAR>location</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX664"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>light:spot</B> <I>location direction color intensity beam</I>
+<DD><P>
+
+<A NAME="IDX665"></A>
+<DT><U>Function:</U> <B>light:spot</B> <I>location direction color intensity</I>
+<DD></P>
+<P>
+
+<A NAME="IDX666"></A>
+<DT><U>Function:</U> <B>light:spot</B> <I>location direction color</I>
+<DD></P>
+<P>
+
+<A NAME="IDX667"></A>
+<DT><U>Function:</U> <B>light:spot</B> <I>location direction</I>
+<DD></P>
+<P>
+
+<A NAME="IDX668"></A>
+<DT><U>Function:</U> <B>light:spot</B> <I>location</I>
+<DD></P>
+<P>
+
+Spot light radiates from <VAR>location</VAR> towards <VAR>direction</VAR>, intensity decreasing with
+distance, illuminating objects with which it is grouped.
+</P>
+<P>
+
+<VAR>direction</VAR> must be a list or vector of 2 or 3 numbers specifying the direction
+to this light. If <VAR>direction</VAR> has 2 numbers, then these numbers are the angle
+from zenith and the azimuth in degrees; if <VAR>direction</VAR> has 3 numbers, then
+these are taken as a Cartesian vector specifying the direction to the
+light source. The default direction is upwards; thus its light will
+shine down.
+</P>
+<P>
+
+<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB
+integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f,
+then the default color will be used.
+</P>
+<P>
+
+<VAR>intensity</VAR> is a real non-negative number defaulting to `<SAMP>1</SAMP>'.
+</P>
+<P>
+
+<CODE>light:spot</CODE> returns a light source or sources at <VAR>location</VAR> of <VAR>direction</VAR> with total strength
+<VAR>color</VAR>. Note that the spotlight itself is not visible. To make it so,
+place an object with emissive appearance at <VAR>location</VAR>.
+</P>
+</DL>
+<A NAME="SEC114"></A>
+<H3> Object Primitives </H3>
+<!--docid::SEC114::-->
+<P>
+
+<A NAME="IDX669"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:box</B> <I>geometry appearance</I>
+<DD><P>
+
+<A NAME="IDX670"></A>
+<DT><U>Function:</U> <B>solid:box</B> <I>geometry</I>
+<DD><VAR>geometry</VAR> must be a number or a list or vector of three numbers. If <VAR>geometry</VAR> is a
+number, the <CODE>solid:box</CODE> returns a cube with sides of length <VAR>geometry</VAR> centered on the
+origin. Otherwise, <CODE>solid:box</CODE> returns a rectangular box with dimensions <VAR>geometry</VAR>
+centered on the origin. <VAR>appearance</VAR> determines the surface properties of the
+returned object.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX671"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:cylinder</B> <I>radius height appearance</I>
+<DD><P>
+
+<A NAME="IDX672"></A>
+<DT><U>Function:</U> <B>solid:cylinder</B> <I>radius height</I>
+<DD>Returns a right cylinder with dimensions <VAR>radius</VAR> and <CODE>(abs <VAR>height</VAR>)</CODE>
+centered on the origin. If <VAR>height</VAR> is positive, then the cylinder ends
+will be capped. <VAR>appearance</VAR> determines the surface properties of the returned
+object.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX673"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:disk</B> <I>radius thickness appearance</I>
+<DD><P>
+
+<A NAME="IDX674"></A>
+<DT><U>Function:</U> <B>solid:disk</B> <I>radius thickness</I>
+<DD><VAR>thickness</VAR> must be a positive real number. <CODE>solid:disk</CODE> returns a circular disk
+with dimensions <VAR>radius</VAR> and <VAR>thickness</VAR> centered on the origin. <VAR>appearance</VAR> determines the
+surface properties of the returned object.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX675"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:cone</B> <I>radius height appearance</I>
+<DD><P>
+
+<A NAME="IDX676"></A>
+<DT><U>Function:</U> <B>solid:cone</B> <I>radius height</I>
+<DD>Returns an isosceles cone with dimensions <VAR>radius</VAR> and <VAR>height</VAR> centered on
+the origin. <VAR>appearance</VAR> determines the surface properties of the returned
+object.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX677"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:pyramid</B> <I>side height appearance</I>
+<DD><P>
+
+<A NAME="IDX678"></A>
+<DT><U>Function:</U> <B>solid:pyramid</B> <I>side height</I>
+<DD>Returns an isosceles pyramid with dimensions <VAR>side</VAR> and <VAR>height</VAR> centered on
+the origin. <VAR>appearance</VAR> determines the surface properties of the returned
+object.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX679"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:sphere</B> <I>radius appearance</I>
+<DD><P>
+
+<A NAME="IDX680"></A>
+<DT><U>Function:</U> <B>solid:sphere</B> <I>radius</I>
+<DD>Returns a sphere of radius <VAR>radius</VAR> centered on the origin. <VAR>appearance</VAR> determines
+the surface properties of the returned object.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX681"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:ellipsoid</B> <I>geometry appearance</I>
+<DD><P>
+
+<A NAME="IDX682"></A>
+<DT><U>Function:</U> <B>solid:ellipsoid</B> <I>geometry</I>
+<DD><VAR>geometry</VAR> must be a number or a list or vector of three numbers. If <VAR>geometry</VAR> is a
+number, the <CODE>solid:ellipsoid</CODE> returns a sphere of diameter <VAR>geometry</VAR> centered on the origin.
+Otherwise, <CODE>solid:ellipsoid</CODE> returns an ellipsoid with diameters <VAR>geometry</VAR> centered on the
+origin. <VAR>appearance</VAR> determines the surface properties of the returned object.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX683"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:basrelief</B> <I>width height depth colorray appearance</I>
+<DD><P>
+
+<A NAME="IDX684"></A>
+<DT><U>Function:</U> <B>solid:basrelief</B> <I>width height depth appearance</I>
+<DD></P>
+<P>
+
+<A NAME="IDX685"></A>
+<DT><U>Function:</U> <B>solid:basrelief</B> <I>width height depth</I>
+<DD>One of <VAR>width</VAR>, <VAR>height</VAR>, or <VAR>depth</VAR> must be a 2-dimensional array; the others must
+be real numbers giving the length of the basrelief in those
+dimensions. The rest of this description assumes that <VAR>height</VAR> is an
+array of heights.
+</P>
+<P>
+
+<CODE>solid:basrelief</CODE> returns a <VAR>width</VAR> by <VAR>depth</VAR> basrelief solid with heights per array <VAR>height</VAR> with
+the buttom surface centered on the origin.
+</P>
+<P>
+
+If present, <VAR>appearance</VAR> determines the surface properties of the returned
+object. If present, <VAR>colorray</VAR> must be an array of objects of type
+<A HREF="slib_5.html#SEC119">color</A>, 24-bit sRGB integers or lists of 3
+numbers between 0.0 and 1.0.
+</P>
+<P>
+
+If <VAR>colorray</VAR>'s dimensions match <VAR>height</VAR>, then each element of <VAR>colorray</VAR> paints its
+corresponding vertex of <VAR>height</VAR>. If <VAR>colorray</VAR> has all dimensions one smaller
+than <VAR>height</VAR>, then each element of <VAR>colorray</VAR> paints the corresponding face of
+<VAR>height</VAR>. Other dimensions for <VAR>colorray</VAR> are in error.
+</P>
+</DL>
+<A NAME="SEC115"></A>
+<H3> Surface Attributes </H3>
+<!--docid::SEC115::-->
+<P>
+
+<A NAME="IDX686"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor shininess emissiveColor transparency</I>
+<DD><P>
+
+<A NAME="IDX687"></A>
+<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor shininess emissiveColor</I>
+<DD></P>
+<P>
+
+<A NAME="IDX688"></A>
+<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor shininess</I>
+<DD></P>
+<P>
+
+<A NAME="IDX689"></A>
+<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor</I>
+<DD></P>
+<P>
+
+<A NAME="IDX690"></A>
+<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity</I>
+<DD></P>
+<P>
+
+<A NAME="IDX691"></A>
+<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor</I>
+<DD></P>
+<P>
+
+Returns an <EM>appearance</EM>, the optical properties of the objects
+<A NAME="IDX692"></A>
+with which it is associated. <VAR>ambientIntensity</VAR>, <VAR>shininess</VAR>, and <VAR>transparency</VAR> must be numbers between 0
+and 1. <VAR>diffuseColor</VAR>, <VAR>specularColor</VAR>, and <VAR>emissiveColor</VAR> are objects of type <A HREF="slib_5.html#SEC119">color</A>,
+24-bit sRGB integers or lists of 3 numbers between 0.0 and 1.0.
+If a color argument is omitted or #f, then the default color will be used.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX693"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale rotation center translation</I>
+<DD><P>
+
+<A NAME="IDX694"></A>
+<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale rotation center</I>
+<DD></P>
+<P>
+
+<A NAME="IDX695"></A>
+<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale rotation</I>
+<DD></P>
+<P>
+
+<A NAME="IDX696"></A>
+<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale</I>
+<DD></P>
+<P>
+
+<A NAME="IDX697"></A>
+<DT><U>Function:</U> <B>solid:texture</B> <I>image color</I>
+<DD></P>
+<P>
+
+<A NAME="IDX698"></A>
+<DT><U>Function:</U> <B>solid:texture</B> <I>image</I>
+<DD></P>
+<P>
+
+Returns an <EM>appearance</EM>, the optical properties of the objects
+<A NAME="IDX699"></A>
+with which it is associated. <VAR>image</VAR> is a string naming a JPEG or PNG
+image resource. <VAR>color</VAR> is #f, a color, or the string returned by
+<CODE>solid:color</CODE>. The rest of the optional arguments specify
+2-dimensional transforms applying to the <VAR>image</VAR>.
+</P>
+<P>
+
+<VAR>scale</VAR> must be #f, a number, or list or vector of 2 numbers specifying the
+scale to apply to <VAR>image</VAR>. <VAR>rotation</VAR> must be #f or the number of degrees to
+rotate <VAR>image</VAR>. <VAR>center</VAR> must be #f or a list or vector of 2 numbers specifying
+the center of <VAR>image</VAR> relative to the <VAR>image</VAR> dimensions. <VAR>translation</VAR> must be #f or a
+list or vector of 2 numbers specifying the translation to apply to <VAR>image</VAR>.
+</P>
+</DL>
+<A NAME="SEC116"></A>
+<H3> Aggregating Objects </H3>
+<!--docid::SEC116::-->
+<P>
+
+<A NAME="IDX700"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:center-row-of</B> <I>number solid spacing</I>
+<DD>Returns a row of <VAR>number</VAR> <VAR>solid</VAR> objects spaced evenly <VAR>spacing</VAR> apart.
+</DL>
+<P>
+
+<A NAME="IDX701"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:center-array-of</B> <I>number-a number-b solid spacing-a spacing-b</I>
+<DD>Returns <VAR>number-b</VAR> rows, <VAR>spacing-b</VAR> apart, of <VAR>number-a</VAR> <VAR>solid</VAR> objects <VAR>spacing-a</VAR> apart.
+</DL>
+<P>
+
+<A NAME="IDX702"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:center-pile-of</B> <I>number-a number-b number-c solid spacing-a spacing-b spacing-c</I>
+<DD>Returns <VAR>number-c</VAR> planes, <VAR>spacing-c</VAR> apart, of <VAR>number-b</VAR> rows, <VAR>spacing-b</VAR> apart, of <VAR>number-a</VAR> <VAR>solid</VAR> objects <VAR>spacing-a</VAR> apart.
+</DL>
+<P>
+
+<A NAME="IDX703"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:arrow</B> <I>center</I>
+<DD><P>
+
+<VAR>center</VAR> must be a list or vector of three numbers. Returns an upward
+pointing metallic arrow centered at <VAR>center</VAR>.
+</P>
+<P>
+
+<A NAME="IDX704"></A>
+<DT><U>Function:</U> <B>solid:arrow</B>
+<DD>Returns an upward pointing metallic arrow centered at the origin.
+</P>
+</DL>
+<A NAME="SEC117"></A>
+<H3> Spatial Transformations </H3>
+<!--docid::SEC117::-->
+<P>
+
+<A NAME="IDX705"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:translation</B> <I>center solid <small>...</small></I>
+<DD><VAR>center</VAR> must be a list or vector of three numbers. <CODE>solid:translation</CODE> Returns an
+aggregate of <VAR>solids</VAR>, <small>...</small> with their origin moved to <VAR>center</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX706"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:scale</B> <I>scale solid <small>...</small></I>
+<DD><VAR>scale</VAR> must be a number or a list or vector of three numbers. <CODE>solid:scale</CODE>
+Returns an aggregate of <VAR>solids</VAR>, <small>...</small> scaled per <VAR>scale</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX707"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solid:rotation</B> <I>axis angle solid <small>...</small></I>
+<DD><VAR>axis</VAR> must be a list or vector of three numbers. <CODE>solid:rotation</CODE> Returns an
+aggregate of <VAR>solids</VAR>, <small>...</small> rotated <VAR>angle</VAR> degrees around the axis <VAR>axis</VAR>.
+</DL>
+<P>
+
+<A NAME="Color"></A>
+<HR SIZE="6">
+<A NAME="SEC118"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC112"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC119"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9 Color </H2>
+<!--docid::SEC118::-->
+<P>
+
+&lt;A NAME=&quot;Color&quot;&gt;&lt;/A&gt;
+</P>
+<P>
+
+<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color">http://swissnet.ai.mit.edu/~jaffer/Color</A>
+</P>
+<P>
+
+The goals of this package are to provide methods to specify, compute,
+and transform colors in a core set of additive color spaces. The color
+spaces supported should be sufficient for working with the color data
+encountered in practice and the literature.
+</P>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'color</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC122">5.9.2 Color Spaces</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">XYZ, L*a*b*, L*u*v*, L*C*h, RGB709, sRGB</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Color Temperatures and CIEXYZ(1931)</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Society of Dyers and Colorists</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Low-level</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">in relational databases</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Sunlight and sky colors</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Color Data-Type"></A>
+<HR SIZE="6">
+<A NAME="SEC119"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC120"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9.1 Color Data-Type </H3>
+<!--docid::SEC119::-->
+<P>
+
+&lt;A NAME=&quot;Color_Data-Type&quot;&gt;&lt;/A&gt;
+<CODE>(require 'color)</CODE>
+</P>
+<P>
+
+<A NAME="IDX708"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color?</B> <I>obj</I>
+<DD>Returns #t if <VAR>obj</VAR> is a color.
+<P>
+
+<A NAME="IDX709"></A>
+<DT><U>Function:</U> <B>color?</B> <I>obj typ</I>
+<DD>Returns #t if <VAR>obj</VAR> is a color of color-space <VAR>typ</VAR>. The symbol
+<VAR>typ</VAR> must be one of:
+</P>
+<P>
+
+<UL>
+<LI>
+CIEXYZ
+<LI>
+RGB709
+<LI>
+L*a*b*
+<LI>
+L*u*v*
+<LI>
+sRGB
+<LI>
+e-sRGB
+<LI>
+L*C*h
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX710"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-color</B> <I>space arg <small>...</small></I>
+<DD>Returns a color of type <VAR>space</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX711"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-space</B> <I>color</I>
+<DD>Returns the symbol for the color-space in which <VAR>color</VAR> is embedded.
+</DL>
+<P>
+
+<A NAME="IDX712"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-precision</B> <I>color</I>
+<DD>For colors in digital color-spaces, <CODE>color-precision</CODE> returns the
+number of bits used for each of the R, G, and B channels of the
+encoding. Otherwise, <CODE>color-precision</CODE> returns #f
+</DL>
+<P>
+
+<A NAME="IDX713"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-white-point</B> <I>color</I>
+<DD>Returns the white-point of <VAR>color</VAR> in all color-spaces except CIEXYZ.
+</DL>
+<P>
+
+<A NAME="IDX714"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>convert-color</B> <I>color space white-point</I>
+<DD><A NAME="IDX715"></A>
+<DT><U>Function:</U> <B>convert-color</B> <I>color space</I>
+<DD><A NAME="IDX716"></A>
+<DT><U>Function:</U> <B>convert-color</B> <I>color e-sRGB precision</I>
+<DD>Converts <VAR>color</VAR> into <VAR>space</VAR> at optional <VAR>white-point</VAR>.
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC120"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC119"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC121"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9.1.1 External Representation </H4>
+<!--docid::SEC120::-->
+<P>
+
+Each color encoding has an external, case-insensitive representation.
+To ensure portability, the white-point for all color strings is D65.
+<A NAME="DOCF4" HREF="slib_fot.html#FOOT4">(4)</A>
+</P>
+<P>
+
+</P>
+<TABLE>
+<TR><TD>Color Space</TD>
+</TD><TD> External Representation
+</TR>
+<TR><TD>CIEXYZ</TD>
+</TD><TD> CIEXYZ:<I>&lt;X&gt;</I>/<I>&lt;Y&gt;</I>/<I>&lt;Z&gt;</I>
+</TR>
+<TR><TD>RGB709</TD>
+</TD><TD> RGBi:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
+</TR>
+<TR><TD>L*a*b*</TD>
+</TD><TD> CIELAB:<I>&lt;L&gt;</I>/<I>&lt;a&gt;</I>/<I>&lt;b&gt;</I>
+</TR>
+<TR><TD>L*u*v*</TD>
+</TD><TD> CIELuv:<I>&lt;L&gt;</I>/<I>&lt;u&gt;</I>/<I>&lt;v&gt;</I>
+</TR>
+<TR><TD>L*C*h</TD>
+</TD><TD> CIELCh:<I>&lt;L&gt;</I>/<I>&lt;C&gt;</I>/<I>&lt;h&gt;</I>
+</TR></TABLE>
+<P>
+
+The <VAR>X</VAR>, <VAR>Y</VAR>, <VAR>Z</VAR>, <VAR>L</VAR>, <VAR>a</VAR>, <VAR>b</VAR>, <VAR>u</VAR>,
+<VAR>v</VAR>, <VAR>C</VAR>, <VAR>h</VAR>, <VAR>R</VAR>, <VAR>G</VAR>, and <VAR>B</VAR> fields are
+(Scheme) real numbers within the appropriate ranges.
+</P>
+<P>
+
+</P>
+<TABLE>
+<TR><TD>Color Space</TD>
+</TD><TD> External Representation
+</TR>
+<TR><TD>sRGB</TD>
+</TD><TD> sRGB:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
+</TR>
+<TR><TD>e-sRGB10</TD>
+</TD><TD> e-sRGB10:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
+</TR>
+<TR><TD>e-sRGB12</TD>
+</TD><TD> e-sRGB12:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
+</TR>
+<TR><TD>e-sRGB16</TD>
+</TD><TD> e-sRGB16:<I>&lt;R&gt;</I>/<I>&lt;G&gt;</I>/<I>&lt;B&gt;</I>
+</TR></TABLE>
+<P>
+
+The <VAR>R</VAR>, <VAR>G</VAR>, and <VAR>B</VAR>, fields are non-negative exact decimal
+integers within the appropriate ranges.
+</P>
+<P>
+
+Several additional syntaxes are supported by <CODE>string-&gt;color</CODE>:
+</P>
+<P>
+
+</P>
+<TABLE>
+<TR><TD>Color Space</TD>
+</TD><TD> External Representation
+</TR>
+<TR><TD>sRGB</TD>
+</TD><TD> sRGB:<I>&lt;RRGGBB&gt;</I>
+</TR>
+<TR><TD>sRGB</TD>
+</TD><TD> #<I>&lt;RRGGBB&gt;</I>
+</TR>
+<TR><TD>sRGB</TD>
+</TD><TD> 0x<I>&lt;RRGGBB&gt;</I>
+</TR>
+<TR><TD>sRGB</TD>
+</TD><TD> #x<I>&lt;RRGGBB&gt;</I>
+</TR></TABLE>
+<P>
+
+Where <VAR>RRGGBB</VAR> is a non-negative six-digit hexadecimal number.
+</P>
+<P>
+
+<A NAME="IDX717"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-&gt;string</B> <I>color</I>
+<DD>Returns a string representation of <VAR>color</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX718"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>string-&gt;color</B> <I>string</I>
+<DD>Returns the color represented by <VAR>string</VAR>. If <VAR>string</VAR> is not a
+syntactically valid notation for a color, then <CODE>string-&gt;color</CODE>
+returns #f.
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC121"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC120"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC122"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9.1.2 White </H4>
+<!--docid::SEC121::-->
+<P>
+
+We experience color relative to the illumination around us.
+CIEXYZ coordinates, although subject to uniform scaling, are
+objective. Thus other color spaces are specified relative to a
+<A NAME="IDX719"></A>
+<EM>white point</EM> in CIEXYZ coordinates.
+<A NAME="IDX720"></A>
+</P>
+<P>
+
+The white point for digital color spaces is set to D65. For the other
+spaces a <VAR>white-point</VAR> argument can be specified. The default if
+none is specified is the white-point with which the color was created
+or last converted; and D65 if none has been specified.
+</P>
+<P>
+
+<A NAME="IDX721"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>D65</B>
+<DD>Is the color of 6500.K (blackbody) illumination. D65 is close
+to the average color of daylight.
+</DL>
+<P>
+
+<A NAME="IDX722"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>D50</B>
+<DD>Is the color of 5000.K (blackbody) illumination. D50 is the color of
+indoor lighting by incandescent bulbs, whose filaments have
+temperatures around 5000.K.
+</DL>
+<P>
+
+<A NAME="Color Spaces"></A>
+<HR SIZE="6">
+<A NAME="SEC122"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC121"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC127"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9.2 Color Spaces </H3>
+<!--docid::SEC122::-->
+<P>
+
+&lt;A NAME=&quot;Color_Spaces&quot;&gt;&lt;/A&gt;
+<A NAME="SEC123"></A>
+<H4> Measurement-based Color Spaces </H4>
+<!--docid::SEC123::-->
+<P>
+
+<A NAME="IDX723"></A>
+The <EM>tristimulus</EM> color spaces are those whose component values
+<A NAME="IDX724"></A>
+are proportional measurements of light intensity. The CIEXYZ(1931)
+system provides 3 sets of spectra to convolve with a spectrum of
+interest. The result of those convolutions is coordinates in CIEXYZ
+space. All tristimuls color spaces are related to CIEXYZ by linear
+transforms, namely matrix multiplication. Of the color spaces listed
+here, CIEXYZ and RGB709 are tristimulus spaces.
+</P>
+<P>
+
+<A NAME="IDX725"></A>
+</P>
+<DL>
+<DT><U>Color Space:</U> <B>CIEXYZ</B>
+<DD>The CIEXYZ color space covers the full <EM>gamut</EM>.
+<A NAME="IDX726"></A>
+It is the basis for color-space conversions.
+<P>
+
+CIEXYZ is a list of three inexact numbers between 0 and 1.1.
+'(0. 0. 0.) is black; '(1. 1. 1.) is white.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX727"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>ciexyz-&gt;color</B> <I>xyz</I>
+<DD><P>
+
+<VAR>xyz</VAR> must be a list of 3 numbers. If <VAR>xyz</VAR> is valid CIEXYZ coordinates,
+then <CODE>ciexyz-&gt;color</CODE> returns the color specified by <VAR>xyz</VAR>; otherwise returns #f.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX728"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color:ciexyz</B> <I>x y z</I>
+<DD><P>
+
+Returns the CIEXYZ color composed of <VAR>x</VAR>, <VAR>y</VAR>, <VAR>z</VAR>. If the
+coordinates do not encode a valid CIEXYZ color, then an error is
+signaled.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX729"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-&gt;ciexyz</B> <I>color</I>
+<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in CIEXYZ.
+</DL>
+<A NAME="IDX730"></A>
+<DL>
+<DT><U>Color Space:</U> <B>RGB709</B>
+<DD>BT.709-4 (03/00) <CITE>Parameter values for the HDTV standards for
+production and international programme exchange</CITE> specifies parameter
+values for chromaticity, sampling, signal format, frame rates, etc., of
+high definition television signals.
+<P>
+
+An RGB709 color is represented by a list of three inexact numbers
+between 0 and 1. '(0. 0. 0.) is black '(1. 1. 1.) is white.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX731"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>rgb709-&gt;color</B> <I>rgb</I>
+<DD><P>
+
+<VAR>rgb</VAR> must be a list of 3 numbers. If <VAR>rgb</VAR> is valid RGB709 coordinates,
+then <CODE>rgb709-&gt;color</CODE> returns the color specified by <VAR>rgb</VAR>; otherwise returns #f.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX732"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color:rgb709</B> <I>r g b</I>
+<DD><P>
+
+Returns the RGB709 color composed of <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>. If the
+coordinates do not encode a valid RGB709 color, then an error is
+signaled.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX733"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-&gt;rgb709</B> <I>color</I>
+<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in RGB709.
+</DL>
+<A NAME="SEC124"></A>
+<H4> Perceptual Uniformity </H4>
+<!--docid::SEC124::-->
+<P>
+
+Although properly encoding the chromaticity, tristimulus spaces do not
+match the logarithmic response of human visual systems to intensity.
+Minimum detectable differences between colors correspond to a smaller
+range of distances (6:1) in the L*a*b* and L*u*v* spaces than in
+tristimulus spaces (80:1). For this reason, color distances are
+computed in L*a*b* (or L*C*h).
+</P>
+<P>
+
+<A NAME="IDX734"></A>
+</P>
+<DL>
+<DT><U>Color Space:</U> <B>L*a*b*</B>
+<DD>Is a CIE color space which better matches the human visual system's
+perception of color. It is a list of three numbers:
+<P>
+
+<UL>
+<LI>
+0 &lt;= L* &lt;= 100 (CIE <EM>Lightness</EM>)
+<A NAME="IDX735"></A>
+<P>
+
+</P>
+<LI>
+-500 &lt;= a* &lt;= 500
+<LI>
+-200 &lt;= b* &lt;= 200
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX736"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>l*a*b*-&gt;color</B> <I>L*a*b* white-point</I>
+<DD><P>
+
+<VAR>L*a*b*</VAR> must be a list of 3 numbers. If <VAR>L*a*b*</VAR> is valid L*a*b* coordinates,
+then <CODE>l*a*b*-&gt;color</CODE> returns the color specified by <VAR>L*a*b*</VAR>; otherwise returns #f.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX737"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color:l*a*b*</B> <I>L* a* b* white-point</I>
+<DD><P>
+
+Returns the L*a*b* color composed of <VAR>L*</VAR>, <VAR>a*</VAR>, <VAR>b*</VAR> with <VAR>white-point</VAR>.
+</P>
+<P>
+
+<A NAME="IDX738"></A>
+<DT><U>Function:</U> <B>color:l*a*b*</B> <I>L* a* b*</I>
+<DD>Returns the L*a*b* color composed of <VAR>L*</VAR>, <VAR>a*</VAR>, <VAR>b*</VAR>. If the coordinates
+do not encode a valid L*a*b* color, then an error is signaled.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX739"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-&gt;l*a*b*</B> <I>color white-point</I>
+<DD><P>
+
+Returns the list of 3 numbers encoding <VAR>color</VAR> in L*a*b* with <VAR>white-point</VAR>.
+</P>
+<P>
+
+<A NAME="IDX740"></A>
+<DT><U>Function:</U> <B>color-&gt;l*a*b*</B> <I>color</I>
+<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in L*a*b*.
+</P>
+</DL>
+<A NAME="IDX741"></A>
+<DL>
+<DT><U>Color Space:</U> <B>L*u*v*</B>
+<DD>Is another CIE encoding designed to better match the human visual
+system's perception of color.
+</DL>
+<P>
+
+<A NAME="IDX742"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>l*u*v*-&gt;color</B> <I>L*u*v* white-point</I>
+<DD><P>
+
+<VAR>L*u*v*</VAR> must be a list of 3 numbers. If <VAR>L*u*v*</VAR> is valid L*u*v* coordinates,
+then <CODE>l*u*v*-&gt;color</CODE> returns the color specified by <VAR>L*u*v*</VAR>; otherwise returns #f.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX743"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color:l*u*v*</B> <I>L* u* v* white-point</I>
+<DD><P>
+
+Returns the L*u*v* color composed of <VAR>L*</VAR>, <VAR>u*</VAR>, <VAR>v*</VAR> with <VAR>white-point</VAR>.
+</P>
+<P>
+
+<A NAME="IDX744"></A>
+<DT><U>Function:</U> <B>color:l*u*v*</B> <I>L* u* v*</I>
+<DD>Returns the L*u*v* color composed of <VAR>L*</VAR>, <VAR>u*</VAR>, <VAR>v*</VAR>. If the coordinates
+do not encode a valid L*u*v* color, then an error is signaled.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX745"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-&gt;l*u*v*</B> <I>color white-point</I>
+<DD><P>
+
+Returns the list of 3 numbers encoding <VAR>color</VAR> in L*u*v* with <VAR>white-point</VAR>.
+</P>
+<P>
+
+<A NAME="IDX746"></A>
+<DT><U>Function:</U> <B>color-&gt;l*u*v*</B> <I>color</I>
+<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in L*u*v*.
+</P>
+</DL>
+<A NAME="SEC125"></A>
+<H4> Cylindrical Coordinates </H4>
+<!--docid::SEC125::-->
+<P>
+
+HSL (Hue Saturation Lightness), HSV (Hue Saturation Value), HSI (Hue
+Saturation Intensity) and HCI (Hue Chroma Intensity) are cylindrical
+color spaces (with angle hue). But these spaces are all defined in
+terms device-dependent RGB spaces.
+</P>
+<P>
+
+One might wonder if there is some fundamental reason why intuitive
+specification of color must be device-dependent. But take heart! A
+cylindrical system can be based on L*a*b* and is used for predicting how
+close colors seem to observers.
+</P>
+<P>
+
+<A NAME="IDX747"></A>
+</P>
+<DL>
+<DT><U>Color Space:</U> <B>L*C*h</B>
+<DD>Expresses the *a and b* of L*a*b* in polar coordinates. It is a list of
+three numbers:
+<P>
+
+<UL>
+<LI>
+0 &lt;= L* &lt;= 100 (CIE <EM>Lightness</EM>)
+<A NAME="IDX748"></A>
+<P>
+
+</P>
+<LI>
+C* (CIE <EM>Chroma</EM>) is the distance from the neutral (gray) axis.
+<A NAME="IDX749"></A>
+<LI>
+0 &lt;= h &lt;= 360 (CIE <EM>Hue</EM>) is the angle.
+<A NAME="IDX750"></A>
+</UL>
+<P>
+
+The colors by quadrant of h are:
+</P>
+<P>
+
+</P>
+<TABLE>
+<TR><TD>0 </TD><TD> red, orange, yellow </TD><TD> 90</TD>
+</TR>
+<TR><TD>90 </TD><TD> yellow, yellow-green, green </TD><TD> 180</TD>
+</TR>
+<TR><TD>180 </TD><TD> green, cyan (blue-green), blue </TD><TD> 270</TD>
+</TR>
+<TR><TD>270 </TD><TD> blue, purple, magenta </TD><TD> 360</TD>
+</TR></TABLE>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX751"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>l*c*h-&gt;color</B> <I>L*C*h white-point</I>
+<DD><P>
+
+<VAR>L*C*h</VAR> must be a list of 3 numbers. If <VAR>L*C*h</VAR> is valid L*C*h coordinates,
+then <CODE>l*c*h-&gt;color</CODE> returns the color specified by <VAR>L*C*h</VAR>; otherwise returns #f.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX752"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color:l*c*h</B> <I>L* C* h white-point</I>
+<DD><P>
+
+Returns the L*C*h color composed of <VAR>L*</VAR>, <VAR>C*</VAR>, <VAR>h</VAR> with <VAR>white-point</VAR>.
+</P>
+<P>
+
+<A NAME="IDX753"></A>
+<DT><U>Function:</U> <B>color:l*c*h</B> <I>L* C* h</I>
+<DD>Returns the L*C*h color composed of <VAR>L*</VAR>, <VAR>C*</VAR>, <VAR>h</VAR>. If the coordinates
+do not encode a valid L*C*h color, then an error is signaled.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX754"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-&gt;l*c*h</B> <I>color white-point</I>
+<DD><P>
+
+Returns the list of 3 numbers encoding <VAR>color</VAR> in L*C*h with <VAR>white-point</VAR>.
+</P>
+<P>
+
+<A NAME="IDX755"></A>
+<DT><U>Function:</U> <B>color-&gt;l*c*h</B> <I>color</I>
+<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in L*C*h.
+</P>
+</DL>
+<A NAME="SEC126"></A>
+<H4> Digital Color Spaces </H4>
+<!--docid::SEC126::-->
+<P>
+
+The color spaces discussed so far are impractical for image data because
+of numerical precision and computational requirements. In 1998 the IEC
+adopted <CITE>A Standard Default Color Space for the Internet - sRGB</CITE>
+(<A HREF="http://www.w3.org/Graphics/Color/sRGB">http://www.w3.org/Graphics/Color/sRGB</A>). sRGB was cleverly
+designed to employ the 24-bit (256x256x256) color encoding already in
+widespread use; and the 2.2 gamma intrinsic to CRT monitors.
+</P>
+<P>
+
+Conversion from CIEXYZ to digital (sRGB) color spaces is accomplished by
+conversion first to a RGB709 tristimulus space with D65 white-point;
+then each coordinate is individually subjected to the same non-linear
+mapping. Inverse operations in the reverse order create the inverse
+transform.
+</P>
+<P>
+
+<A NAME="IDX756"></A>
+</P>
+<DL>
+<DT><U>Color Space:</U> <B>sRGB</B>
+<DD>Is &quot;A Standard Default Color Space for the Internet&quot;. Most display
+monitors will work fairly well with sRGB directly. Systems using ICC
+profiles
+<A NAME="IDX757"></A>
+<A NAME="DOCF5" HREF="slib_fot.html#FOOT5">(5)</A>
+should work very well with sRGB.
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX758"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>srgb-&gt;color</B> <I>rgb</I>
+<DD><P>
+
+<VAR>rgb</VAR> must be a list of 3 numbers. If <VAR>rgb</VAR> is valid sRGB coordinates,
+then <CODE>srgb-&gt;color</CODE> returns the color specified by <VAR>rgb</VAR>; otherwise returns #f.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX759"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color:srgb</B> <I>r g b</I>
+<DD><P>
+
+Returns the sRGB color composed of <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>. If the
+coordinates do not encode a valid sRGB color, then an error is
+signaled.
+</P>
+</DL>
+<A NAME="IDX760"></A>
+<DL>
+<DT><U>Color Space:</U> <B>xRGB</B>
+<DD>Represents the equivalent sRGB color with a single 24-bit integer. The
+most significant 8 bits encode red, the middle 8 bits blue, and the
+least significant 8 bits green.
+</DL>
+<P>
+
+<A NAME="IDX761"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-&gt;srgb</B> <I>color</I>
+<DD><P>
+
+Returns the list of 3 integers encoding <VAR>color</VAR> in sRGB.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX762"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-&gt;xrgb</B> <I>color</I>
+<DD>Returns the 24-bit integer encoding <VAR>color</VAR> in sRGB.
+</DL>
+<P>
+
+<A NAME="IDX763"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>xrgb-&gt;color</B> <I>k</I>
+<DD><P>
+
+Returns the sRGB color composed of the 24-bit integer <VAR>k</VAR>.
+</P>
+</DL>
+<A NAME="IDX764"></A>
+<DL>
+<DT><U>Color Space:</U> <B>e-sRGB</B>
+<DD>Is &quot;Photography - Electronic still picture imaging - Extended sRGB color
+encoding&quot; (PIMA 7667:2001). It extends the gamut of sRGB; and its
+higher precision numbers provide a larger dynamic range.
+<P>
+
+A triplet of integers represent e-sRGB colors. Three precisions are
+supported:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT>e-sRGB10
+<DD>0 to 1023
+<DT>e-sRGB12
+<DD>0 to 4095
+<DT>e-sRGB16
+<DD>0 to 65535
+</DL>
+</DL>
+<P>
+
+<A NAME="IDX765"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>e-srgb-&gt;color</B> <I>precision rgb</I>
+<DD><VAR>precision</VAR> must be the integer 10, 12, or 16. <VAR>rgb</VAR> must be a list of 3
+numbers. If <VAR>rgb</VAR> is valid e-sRGB coordinates, then <CODE>e-srgb-&gt;color</CODE> returns the color
+specified by <VAR>rgb</VAR>; otherwise returns #f.
+</DL>
+<P>
+
+<A NAME="IDX766"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color:e-srgb</B> <I>10 r g b</I>
+<DD><P>
+
+Returns the e-sRGB10 color composed of integers <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>.
+</P>
+<P>
+
+<A NAME="IDX767"></A>
+<DT><U>Function:</U> <B>color:e-srgb</B> <I>12 r g b</I>
+<DD>Returns the e-sRGB12 color composed of integers <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>.
+</P>
+<P>
+
+<A NAME="IDX768"></A>
+<DT><U>Function:</U> <B>color:e-srgb</B> <I>16 r g b</I>
+<DD>Returns the e-sRGB16 color composed of integers <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>.
+If the coordinates do not encode a valid e-sRGB color, then an error
+is signaled.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX769"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-&gt;e-srgb</B> <I>precision color</I>
+<DD><VAR>precision</VAR> must be the integer 10, 12, or 16. <CODE>color-&gt;e-srgb</CODE> returns the list of 3
+integers encoding <VAR>color</VAR> in sRGB10, sRGB12, or sRGB16.
+</DL>
+<P>
+
+<A NAME="Spectra"></A>
+<HR SIZE="6">
+<A NAME="SEC127"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC122"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC128"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9.3 Spectra </H3>
+<!--docid::SEC127::-->
+<P>
+
+&lt;A NAME=&quot;Spectra&quot;&gt;&lt;/A&gt;
+The following functions compute colors from spectra, scale color
+luminance, and extract chromaticity. XYZ is used in the names of
+procedures for unnormalized colors; the coordinates of CIEXYZ colors are
+constrained as described in <A HREF="slib_5.html#SEC122">5.9.2 Color Spaces</A>.
+</P>
+<P>
+
+<CODE>(require 'color-space)</CODE>
+</P>
+<P>
+
+A spectrum may be represented as:
+</P>
+<P>
+
+<UL>
+<LI>
+A procedure of one argument accepting real numbers from 380e-9 to
+780e-9, the wavelength in meters; or
+<LI>
+A vector of real numbers representing intensity samples evenly spaced
+over some range of wavelengths overlapping the range 380e-9 to 780e-9.
+</UL>
+<P>
+
+CIEXYZ values are calculated as dot-product with the X, Y (Luminance),
+and Z <EM>Spectral Tristimulus Values</EM>. The files `<TT>cie1931.xyz</TT>'
+and `<TT>cie1964.xyz</TT>' in the distribution contain these CIE-defined
+values.
+<A NAME="IDX770"></A>
+</P>
+<P>
+
+<A NAME="IDX771"></A>
+</P>
+<DL>
+<DT><U>Feature:</U> <B>cie1964</B>
+<DD><A NAME="IDX772"></A>
+Loads the Spectral Tristimulus Values defining <CITE>CIE 1964
+Supplementary Standard Colorimetric Observer</CITE>.
+<A NAME="IDX773"></A>
+<DT><U>Feature:</U> <B>cie1931</B>
+<DD><A NAME="IDX774"></A>
+Loads the Spectral Tristimulus Values defining <CITE>CIE 1931
+Supplementary Standard Colorimetric Observer</CITE>.
+<A NAME="IDX775"></A>
+<DT><U>Feature:</U> <B>ciexyz</B>
+<DD><A NAME="IDX776"></A>
+Requires Spectral Tristimulus Values, defaulting to cie1931.
+</DL>
+<P>
+
+<CODE>(require 'cie1964)</CODE> or <CODE>(require 'cie1931)</CODE> will
+<A NAME="IDX777"></A>
+<CODE>load-ciexyz</CODE> specific values used by the following spectrum
+conversion procedures. The spectrum conversion procedures
+<CODE>(require 'ciexyz)</CODE> to assure that a set is loaded.
+</P>
+<P>
+
+<A NAME="IDX778"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>spectrum-&gt;XYZ</B> <I>proc</I>
+<DD><VAR>proc</VAR> must be a function of one argument. <CODE>spectrum-&gt;XYZ</CODE>
+computes the CIEXYZ(1931) values for the spectrum returned by <VAR>proc</VAR>
+when called with arguments from 380e-9 to 780e-9, the wavelength in
+meters.
+<P>
+
+<A NAME="IDX779"></A>
+<DT><U>Function:</U> <B>spectrum-&gt;XYZ</B> <I>spectrum x1 x2</I>
+<DD><VAR>x1</VAR> and <VAR>x2</VAR> must be positive real numbers specifying the
+wavelengths (in meters) corresponding to the zeroth and last elements of
+vector or list <VAR>spectrum</VAR>. <CODE>spectrum-&gt;XYZ</CODE> returns the
+CIEXYZ(1931) values for a light source with spectral values proportional
+to the elements of <VAR>spectrum</VAR> at evenly spaced wavelengths between
+<VAR>x1</VAR> and <VAR>x2</VAR>.
+</P>
+<P>
+
+Compute the colors of 6500.K and 5000.K blackbody radiation:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'color-space)
+(define xyz (spectrum-&gt;XYZ (blackbody-spectrum 6500)))
+(define y_n (cadr xyz))
+(map (lambda (x) (/ x y_n)) xyz)
+ => (0.9687111145512467 1.0 1.1210875945303613)
+
+(define xyz (spectrum-&gt;XYZ (blackbody-spectrum 5000)))
+(map (lambda (x) (/ x y_n)) xyz)
+ => (0.2933441826889158 0.2988931825387761 0.25783646831201573)
+</pre></td></tr></table><P>
+
+<A NAME="IDX780"></A>
+<DT><U>Function:</U> <B>spectrum-&gt;CIEXYZ</B> <I>proc</I>
+<DD><A NAME="IDX781"></A>
+<DT><U>Function:</U> <B>spectrum-&gt;CIEXYZ</B> <I>spectrum x1 x2</I>
+<DD><CODE>spectrum-&gt;CIEXYZ</CODE> computes the CIEXYZ(1931) values for the
+spectrum, scaled so their sum is 1.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX782"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>spectrum-&gt;chromaticity</B> <I>proc</I>
+<DD><A NAME="IDX783"></A>
+<DT><U>Function:</U> <B>spectrum-&gt;chromaticity</B> <I>spectrum x1 x2</I>
+<DD>Computes the chromaticity for the given spectrum.
+</DL>
+<P>
+
+<A NAME="IDX784"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>wavelength-&gt;XYZ</B> <I>w</I>
+<DD><A NAME="IDX785"></A>
+<DT><U>Function:</U> <B>wavelength-&gt;chromaticity</B> <I>w</I>
+<DD><A NAME="IDX786"></A>
+<DT><U>Function:</U> <B>wavelength-&gt;CIEXYZ</B> <I>w</I>
+<DD><VAR>w</VAR> must be a number between 380e-9 to 780e-9.
+<CODE>wavelength-&gt;XYZ</CODE> returns (unnormalized) XYZ values for a
+monochromatic light source with wavelength <VAR>w</VAR>.
+<CODE>wavelength-&gt;chromaticity</CODE> returns the chromaticity for a
+monochromatic light source with wavelength <VAR>w</VAR>.
+<CODE>wavelength-&gt;CIEXYZ</CODE> returns XYZ values for the saturated color
+having chromaticity of a monochromatic light source with wavelength
+<VAR>w</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX787"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>blackbody-spectrum</B> <I>temp</I>
+<DD><A NAME="IDX788"></A>
+<DT><U>Function:</U> <B>blackbody-spectrum</B> <I>temp span</I>
+<DD>Returns a procedure of one argument (wavelength in meters), which
+returns the radiance of a black body at <VAR>temp</VAR>.
+<P>
+
+The optional argument <VAR>span</VAR> is the wavelength analog of bandwidth.
+With the default <VAR>span</VAR> of 1.nm (1e-9.m), the values returned by the
+procedure correspond to the power of the photons with wavelengths
+<VAR>w</VAR> to <VAR>w</VAR>+1e-9.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX789"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>temperature-&gt;XYZ</B> <I>x</I>
+<DD>The positive number <VAR>x</VAR> is a temperature in degrees kelvin.
+<CODE>temperature-&gt;XYZ</CODE> computes the CIEXYZ(1931) values for the
+spectrum of a black body at temperature <VAR>x</VAR>.
+<P>
+
+Compute the chromaticities of 6500.K and 5000.K blackbody radiation:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'color-space)
+(XYZ-&gt;chromaticity (temperature-&gt;XYZ 6500))
+ => (0.3135191660557008 0.3236456786200268)
+
+(XYZ-&gt;chromaticity (temperature-&gt;XYZ 5000))
+ => (0.34508082841161052 0.3516084965163377)
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX790"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>temperature-&gt;CIEXYZ</B> <I>x</I>
+<DD>The positive number <VAR>x</VAR> is a temperature in degrees kelvin.
+<CODE>temperature-&gt;CIEXYZ</CODE> computes the CIEXYZ(1931) values for the
+spectrum of a black body at temperature <VAR>x</VAR>, scaled to be just
+inside the RGB709 gamut.
+</DL>
+<P>
+
+<A NAME="IDX791"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>temperature-&gt;chromaticity</B> <I>x</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX792"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>XYZ:normalize</B> <I>xyz</I>
+<DD><VAR>xyz</VAR> is a list of three non-negative real numbers.
+<CODE>XYZ:normalize</CODE> returns a list of numbers proportional to
+<VAR>xyz</VAR>; scaled so their sum is 1.
+</DL>
+<P>
+
+<A NAME="IDX793"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>XYZ:normalize-colors</B> <I>colors <small>...</small></I>
+<DD><VAR>colors</VAR> is a list of XYZ triples. <CODE>XYZ:normalize-colors</CODE>
+scales all the triples by a common factor such that the maximum sum of
+numbers in a scaled triple is 1.
+</DL>
+<P>
+
+<A NAME="IDX794"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>XYZ-&gt;chromaticity</B> <I>xyz</I>
+<DD>Returns a two element list: the x and y components of <VAR>xyz</VAR>
+normalized to 1 (= <VAR>x</VAR> + <VAR>y</VAR> + <VAR>z</VAR>).
+</DL>
+<P>
+
+<A NAME="IDX795"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>chromaticity-&gt;CIEXYZ</B> <I>x y</I>
+<DD>Returns the list of <VAR>x</VAR>, and <VAR>y</VAR>, 1 - <VAR>y</VAR> - <VAR>x</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX796"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>chromaticity-&gt;whitepoint</B> <I>x y</I>
+<DD>Returns the CIEXYZ(1931) values having luminosity 1 and chromaticity
+<VAR>x</VAR> and <VAR>y</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX797"></A>
+Many color datasets are expressed in <EM>xyY</EM> format; chromaticity with
+CIE luminance (Y). But xyY is not a CIE standard like CIEXYZ, CIELAB,
+and CIELUV. Although chrominance is well defined, the luminance
+component is sometimes scaled to 1, sometimes to 100, but usually has no
+obvious range. With no given whitepoint, the only reasonable course is
+to ascertain the luminance range of a dataset and normalize the values
+to lie from 0 to 1.
+</P>
+<P>
+
+<A NAME="IDX798"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>XYZ-&gt;xyY</B> <I>xyz</I>
+<DD>Returns a three element list: the <VAR>x</VAR> and <VAR>y</VAR> components of
+<VAR>XYZ</VAR> normalized to 1, and CIE luminance <VAR>Y</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX799"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>xyY-&gt;XYZ</B> <I>xyY</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX800"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>xyY:normalize-colors</B> <I>colors</I>
+<DD><VAR>colors</VAR> is a list of xyY triples. <CODE>xyY:normalize-colors</CODE>
+scales each chromaticity so it sums to 1 or less; and divides the
+<VAR>Y</VAR> values by the maximum <VAR>Y</VAR> in the dataset, so all lie between
+0 and 1.
+<P>
+
+<A NAME="IDX801"></A>
+<DT><U>Function:</U> <B>xyY:normalize-colors</B> <I>colors n</I>
+<DD>If <VAR>n</VAR> is positive real, then <CODE>xyY:normalize-colors</CODE> divides
+the <VAR>Y</VAR> values by <VAR>n</VAR> times the maximum <VAR>Y</VAR> in the dataset.
+</P>
+<P>
+
+If <VAR>n</VAR> is an exact non-positive integer, then
+<CODE>xyY:normalize-colors</CODE> divides the <VAR>Y</VAR> values by the maximum of
+the <VAR>Y</VAR>s in the dataset excepting the -<VAR>n</VAR> largest <VAR>Y</VAR>
+values.
+</P>
+<P>
+
+In all cases, returned <VAR>Y</VAR> values are limited to lie from 0 to 1.
+</P>
+</DL>
+<P>
+
+Why would one want to normalize to other than 1? If the sun or its
+reflection is the brightest object in a scene, then normalizing to its
+luminance will tend to make the rest of the scene very dark. As with
+photographs, limiting the specular highlights looks better than
+darkening everything else.
+</P>
+<P>
+
+The results of measurements being what they are,
+<CODE>xyY:normalize-colors</CODE> is extremely tolerant. Negative numbers are
+replaced with zero, and chromaticities with sums greater than one are
+scaled to sum to one.
+</P>
+<P>
+
+<A NAME="Color Difference Metrics"></A>
+<HR SIZE="6">
+<A NAME="SEC128"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC127"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC129"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9.4 Color Difference Metrics </H3>
+<!--docid::SEC128::-->
+<P>
+
+&lt;A NAME=&quot;Color_Difference_Metrics&quot;&gt;&lt;/A&gt;
+</P>
+<P>
+
+<CODE>(require 'color-space)</CODE>
+</P>
+<P>
+
+The low-level metric functions operate on lists of 3 numbers, lab1,
+lab2, lch1, or lch2.
+</P>
+<P>
+
+<CODE>(require 'color)</CODE>
+</P>
+<P>
+
+The wrapped functions operate on objects of type color, color1 and
+color2 in the function entries.
+</P>
+<P>
+
+<A NAME="IDX802"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>L*a*b*:DE*</B> <I>lab1 lab2</I>
+<DD>Returns the Euclidean distance between <VAR>lab1</VAR> and <VAR>lab2</VAR>.
+<P>
+
+<A NAME="IDX803"></A>
+<DT><U>Function:</U> <B>CIE:DE*</B> <I>color1 color2 white-point</I>
+<DD><A NAME="IDX804"></A>
+<DT><U>Function:</U> <B>CIE:DE*</B> <I>color1 color2</I>
+<DD>Returns the Euclidean distance in L*a*b* space between <VAR>color1</VAR> and
+<VAR>color2</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX805"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>L*C*h:DE*94</B> <I>lch1 lch2 parametric-factors</I>
+<DD><A NAME="IDX806"></A>
+<DT><U>Function:</U> <B>L*C*h:DE*94</B> <I>lch1 lch2</I>
+<DD><P>
+
+<A NAME="IDX807"></A>
+<DT><U>Function:</U> <B>CIE:DE*94</B> <I>color1 color2 parametric-factors</I>
+<DD><A NAME="IDX808"></A>
+<DT><U>Function:</U> <B>CIE:DE*94</B> <I>color1 color2</I>
+<DD></P>
+<P>
+
+Measures distance in the L*C*h cylindrical color-space.
+The three axes are individually scaled (depending on C*) in their
+contributions to the total distance.
+</P>
+<P>
+
+The CIE has defined reference conditions under which the metric with
+default parameters can be expected to perform well. These are:
+</P>
+<P>
+
+<UL>
+<LI>
+The specimens are homogeneous in colour.
+<LI>
+The colour difference (CIELAB) is &lt;= 5 units.
+<LI>
+They are placed in direct edge contact.
+<LI>
+Each specimen subtends an angle of &gt;4 degrees to the assessor, whose
+colour vision is normal.
+<LI>
+They are illuminated at 1000 lux, and viewed against a background of
+uniform grey, with L* of 50, under illumination simulating D65.
+</UL>
+<P>
+
+The <VAR>parametric-factors</VAR> argument is a list of 3 quantities kL, kC
+and kH. <VAR>parametric-factors</VAR> independently adjust each
+colour-difference term to account for any deviations from the reference
+viewing conditions. Under the reference conditions explained above, the
+default is kL = kC = kH = 1.
+</P>
+</DL>
+<P>
+
+The Color Measurement Committee of The Society of Dyers and Colorists in
+Great Britain created a more sophisticated color-distance function for
+use in judging the consistency of dye lots. With CMC:DE* it is possible
+to use a single value pass/fail tolerance for all shades.
+</P>
+<P>
+
+<A NAME="IDX809"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2 parametric-factors</I>
+<DD><A NAME="IDX810"></A>
+<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2 l c</I>
+<DD><A NAME="IDX811"></A>
+<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2 l</I>
+<DD><A NAME="IDX812"></A>
+<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2</I>
+<DD><P>
+
+<A NAME="IDX813"></A>
+<DT><U>Function:</U> <B>CMC:DE*</B> <I>color1 color2 l c</I>
+<DD><A NAME="IDX814"></A>
+<DT><U>Function:</U> <B>CMC:DE*</B> <I>color1 color2</I>
+<DD></P>
+<P>
+
+<CODE>CMC:DE</CODE> is a L*C*h metric. The <VAR>parametric-factors</VAR>
+argument is a list of 2 numbers <VAR>l</VAR> and <VAR>c</VAR>. <VAR>l</VAR> and
+<VAR>c</VAR> parameterize this metric. 1 and 1 are recommended for
+perceptibility; the default, 2 and 1, for acceptability.
+</P>
+</DL>
+<P>
+
+<A NAME="Color Conversions"></A>
+<HR SIZE="6">
+<A NAME="SEC129"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC128"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC130"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9.5 Color Conversions </H3>
+<!--docid::SEC129::-->
+<P>
+
+&lt;A NAME=&quot;Color_Conversions&quot;&gt;&lt;/A&gt;
+</P>
+<P>
+
+This package contains the low-level color conversion and color metric
+routines operating on lists of 3 numbers. There is no type or range
+checking.
+</P>
+<P>
+
+<CODE>(require 'color-space)</CODE>
+</P>
+<P>
+
+<A NAME="IDX815"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>CIEXYZ:D65</B>
+<DD>Is the color of 6500.K (blackbody) illumination. D65 is close to the
+average color of daylight.
+</DL>
+<P>
+
+<A NAME="IDX816"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>CIEXYZ:D50</B>
+<DD>Is the color of 5000.K (blackbody) illumination. D50 is the color of
+indoor lighting by incandescent bulbs.
+</DL>
+<P>
+
+<A NAME="IDX817"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>CIEXYZ:A</B>
+<DD><A NAME="IDX818"></A>
+<DT><U>Constant:</U> <B>CIEXYZ:B</B>
+<DD><A NAME="IDX819"></A>
+<DT><U>Constant:</U> <B>CIEXYZ:C</B>
+<DD><A NAME="IDX820"></A>
+<DT><U>Constant:</U> <B>CIEXYZ:E</B>
+<DD>CIE 1931 illuminants normalized to 1 = y.
+</DL>
+<P>
+
+<A NAME="IDX821"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color:linear-transform</B> <I>matrix row</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX822"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>CIEXYZ-&gt;RGB709</B> <I>xyz</I>
+<DD><A NAME="IDX823"></A>
+<DT><U>Function:</U> <B>RGB709-&gt;CIEXYZ</B> <I>srgb</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX824"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>CIEXYZ-&gt;L*u*v*</B> <I>xyz white-point</I>
+<DD><A NAME="IDX825"></A>
+<DT><U>Function:</U> <B>CIEXYZ-&gt;L*u*v*</B> <I>xyz</I>
+<DD><A NAME="IDX826"></A>
+<DT><U>Function:</U> <B>L*u*v*-&gt;CIEXYZ</B> <I>L*u*v* white-point</I>
+<DD><A NAME="IDX827"></A>
+<DT><U>Function:</U> <B>L*u*v*-&gt;CIEXYZ</B> <I>L*u*v*</I>
+<DD>The <VAR>white-point</VAR> defaults to CIEXYZ:D65.
+</DL>
+<P>
+
+<A NAME="IDX828"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>CIEXYZ-&gt;L*a*b*</B> <I>xyz white-point</I>
+<DD><A NAME="IDX829"></A>
+<DT><U>Function:</U> <B>CIEXYZ-&gt;L*a*b*</B> <I>xyz</I>
+<DD><A NAME="IDX830"></A>
+<DT><U>Function:</U> <B>L*a*b*-&gt;CIEXYZ</B> <I>L*a*b* white-point</I>
+<DD><A NAME="IDX831"></A>
+<DT><U>Function:</U> <B>L*a*b*-&gt;CIEXYZ</B> <I>L*a*b*</I>
+<DD>The XYZ <VAR>white-point</VAR> defaults to CIEXYZ:D65.
+</DL>
+<P>
+
+<A NAME="IDX832"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>L*a*b*-&gt;L*C*h</B> <I>L*a*b*</I>
+<DD><A NAME="IDX833"></A>
+<DT><U>Function:</U> <B>L*C*h-&gt;L*a*b*</B> <I>L*C*h</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX834"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>CIEXYZ-&gt;sRGB</B> <I>xyz</I>
+<DD><A NAME="IDX835"></A>
+<DT><U>Function:</U> <B>sRGB-&gt;CIEXYZ</B> <I>srgb</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX836"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>CIEXYZ-&gt;xRGB</B> <I>xyz</I>
+<DD><A NAME="IDX837"></A>
+<DT><U>Function:</U> <B>xRGB-&gt;CIEXYZ</B> <I>srgb</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX838"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>sRGB-&gt;xRGB</B> <I>xyz</I>
+<DD><A NAME="IDX839"></A>
+<DT><U>Function:</U> <B>xRGB-&gt;sRGB</B> <I>srgb</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX840"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>CIEXYZ-&gt;e-sRGB</B> <I>n xyz</I>
+<DD><A NAME="IDX841"></A>
+<DT><U>Function:</U> <B>e-sRGB-&gt;CIEXYZ</B> <I>n srgb</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX842"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>sRGB-&gt;e-sRGB</B> <I>n srgb</I>
+<DD><A NAME="IDX843"></A>
+<DT><U>Function:</U> <B>e-sRGB-&gt;sRGB</B> <I>n srgb</I>
+<DD>The integer <VAR>n</VAR> must be 10, 12, or 16. Because sRGB and e-sRGB use
+the same RGB709 chromaticities, conversion between them is simpler than
+conversion through CIEXYZ.
+</DL>
+<P>
+
+Do not convert e-sRGB precision through <CODE>e-sRGB-&gt;sRGB</CODE> then
+<CODE>sRGB-&gt;e-sRGB</CODE> -- values would be truncated to 8-bits!
+</P>
+<P>
+
+<A NAME="IDX844"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>e-sRGB-&gt;e-sRGB</B> <I>n1 srgb n2</I>
+<DD>The integers <VAR>n1</VAR> and <VAR>n2</VAR> must be 10, 12, or 16.
+<CODE>e-sRGB-&gt;e-sRGB</CODE> converts <VAR>srgb</VAR> to e-sRGB of precision
+<VAR>n2</VAR>.
+</DL>
+<P>
+
+<A NAME="Color Names"></A>
+<HR SIZE="6">
+<A NAME="SEC130"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC129"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC133"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9.6 Color Names </H3>
+<!--docid::SEC130::-->
+<P>
+
+&lt;A NAME=&quot;Color_Names&quot;&gt;&lt;/A&gt;
+<CODE>(require 'color-names)</CODE>
+<A NAME="IDX845"></A>
+</P>
+<P>
+
+Rather than ballast the color dictionaries with numbered grays,
+<CODE>file-&gt;color-dictionary</CODE> discards them. They are provided
+through the <CODE>grey</CODE> procedure:
+</P>
+<P>
+
+<A NAME="IDX846"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>grey</B> <I>k</I>
+<DD><P>
+
+Returns <CODE>(inexact-&gt;exact (round (* k 2.55)))</CODE>, the X11 color
+grey<I>&lt;k&gt;</I>.
+</P>
+</DL>
+A color dictionary is a database table relating <EM>canonical</EM>
+<A NAME="IDX847"></A>
+color-names to color-strings
+(see section <A HREF="slib_5.html#SEC119">External Representation</A>).
+<P>
+
+The column names in a color dictionary are unimportant; the first
+field is the key, and the second is the color-string.
+</P>
+<P>
+
+<A NAME="IDX848"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-name:canonicalize</B> <I>name</I>
+<DD>Returns a downcased copy of the string or symbol <VAR>name</VAR> with
+`<SAMP>_</SAMP>', `<SAMP>-</SAMP>', and whitespace removed.
+</DL>
+<P>
+
+<A NAME="IDX849"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-name-&gt;color</B> <I>name table1 table2 <small>...</small></I>
+<DD><P>
+
+<VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small> must be color-dictionary tables. <CODE>color-name-&gt;color</CODE> searches for the
+canonical form of <VAR>name</VAR> in <VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small> in order; returning the
+color-string of the first matching record; #f otherwise.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX850"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-dictionaries-&gt;lookup</B> <I>table1 table2 <small>...</small></I>
+<DD><P>
+
+<VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small> must be color-dictionary tables. <CODE>color-dictionaries-&gt;lookup</CODE> returns a
+procedure which searches for the canonical form of its string argument
+in <VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small>; returning the color-string of the first matching
+record; and #f otherwise.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX851"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>color-dictionary</B> <I>name rdb base-table-type</I>
+<DD><P>
+
+<VAR>rdb</VAR> must be a string naming a relational database file; and the symbol
+<VAR>name</VAR> a table therein. The database will be opened as
+<VAR>base-table-type</VAR>. <CODE>color-dictionary</CODE> returns the read-only table <VAR>name</VAR> in database
+<VAR>name</VAR> if it exists; #f otherwise.
+</P>
+<P>
+
+<A NAME="IDX852"></A>
+<DT><U>Function:</U> <B>color-dictionary</B> <I>name rdb</I>
+<DD></P>
+<P>
+
+<VAR>rdb</VAR> must be an open relational database or a string naming a relational
+database file; and the symbol <VAR>name</VAR> a table therein. <CODE>color-dictionary</CODE> returns the
+read-only table <VAR>name</VAR> in database <VAR>name</VAR> if it exists; #f otherwise.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX853"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>load-color-dictionary</B> <I>name rdb base-table-type</I>
+<DD><P>
+
+<A NAME="IDX854"></A>
+<DT><U>Function:</U> <B>load-color-dictionary</B> <I>name rdb</I>
+<DD></P>
+<P>
+
+<VAR>rdb</VAR> must be a string naming a relational database file; and the symbol
+<VAR>name</VAR> a table therein. If the symbol <VAR>base-table-type</VAR> is provided, the database will
+be opened as <VAR>base-table-type</VAR>. <CODE>load-color-dictionary</CODE> creates a top-level definition of the symbol <VAR>name</VAR>
+to a lookup procedure for the color dictionary <VAR>name</VAR> in <VAR>rdb</VAR>.
+</P>
+<P>
+
+The value returned by <CODE>load-color-dictionary</CODE> is unspecified.
+</P>
+</DL>
+<P>
+
+<A NAME="SEC131"></A>
+<H4> Dictionary Creation </H4>
+<!--docid::SEC131::-->
+<P>
+
+<CODE>(require 'color-database)</CODE>
+<A NAME="IDX855"></A>
+</P>
+<P>
+
+<A NAME="IDX856"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>file-&gt;color-dictionary</B> <I>file table-name rdb base-table-type</I>
+<DD><P>
+
+<A NAME="IDX857"></A>
+<DT><U>Function:</U> <B>file-&gt;color-dictionary</B> <I>file table-name rdb</I>
+<DD></P>
+<P>
+
+<VAR>rdb</VAR> must be an open relational database or a string naming a relational
+database file, <VAR>table-name</VAR> a symbol, and the string <VAR>file</VAR> must name an existing
+file with colornames and their corresponding xRGB (6-digit hex)
+values. <CODE>file-&gt;color-dictionary</CODE> creates a table <VAR>table-name</VAR> in <VAR>rdb</VAR> and enters the associations found
+in <VAR>file</VAR> into it.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX858"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>url-&gt;color-dictionary</B> <I>url table-name rdb base-table-type</I>
+<DD><P>
+
+<A NAME="IDX859"></A>
+<DT><U>Function:</U> <B>url-&gt;color-dictionary</B> <I>url table-name rdb</I>
+<DD></P>
+<P>
+
+<VAR>rdb</VAR> must be an open relational database or a string naming a relational
+database file and <VAR>table-name</VAR> a symbol. <CODE>url-&gt;color-dictionary</CODE> retrieves the resource named by the
+string <VAR>url</VAR> using the <EM>wget</EM> program; then calls
+<A NAME="IDX860"></A>
+<CODE>file-&gt;color-dictionary</CODE> to enter its associations in <VAR>table-name</VAR> in <VAR>url</VAR>.
+</P>
+</DL>
+This section has detailed the procedures for creating and loading
+color dictionaries. So where are the dictionaries to load?
+<P>
+
+<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color/Dictionaries.html">http://swissnet.ai.mit.edu/~jaffer/Color/Dictionaries.html</A>
+</P>
+<P>
+
+Describes and evaluates several color-name dictionaries on the web.
+The following procedure creates a database containing two of these
+dictionaries.
+</P>
+<P>
+
+<A NAME="IDX861"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-slib-color-name-db</B>
+<DD><P>
+
+Creates an alist-table relational database in library-vicinity
+containing the <EM>Resene</EM> and <EM>saturate</EM> color-name
+<A NAME="IDX862"></A>
+<A NAME="IDX863"></A>
+dictionaries.
+</P>
+<P>
+
+If the files `<TT>resenecolours.txt</TT>' and `<TT>saturate.txt</TT>' exist in
+the library-vicinity, then they used as the source of color-name
+data. Otherwise, <CODE>make-slib-color-name-db</CODE> calls url-&gt;color-dictionary with the URLs of
+appropriate source files.
+</P>
+</DL>
+<P>
+
+<A NAME="SEC132"></A>
+<H4> The Short List </H4>
+<!--docid::SEC132::-->
+<P>
+
+<CODE>(require 'saturate)</CODE>
+<A NAME="IDX864"></A>
+</P>
+<P>
+
+<A NAME="IDX865"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>saturate</B> <I>name</I>
+<DD>Looks for <VAR>name</VAR> among the 19 saturated colors from
+<CITE>Approximate Colors on CIE Chromaticity Diagram</CITE>:
+<P>
+
+</P>
+<TABLE>
+<TR><TD>reddish orange </TD><TD> orange </TD><TD> yellowish orange </TD><TD> yellow</TD>
+</TR>
+<TR><TD>greenish yellow </TD><TD> yellow green </TD><TD> yellowish green </TD><TD> green</TD>
+</TR>
+<TR><TD>bluish green </TD><TD> blue green </TD><TD> greenish blue </TD><TD> blue</TD>
+</TR>
+<TR><TD>purplish blue </TD><TD> bluish purple </TD><TD> purple </TD><TD> reddish purple</TD>
+</TR>
+<TR><TD>red purple </TD><TD> purplish red </TD><TD> red</TD>
+</TR></TABLE>
+<P>
+
+(<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color/saturate.pdf">http://swissnet.ai.mit.edu/~jaffer/Color/saturate.pdf</A>). If
+<VAR>name</VAR> is found, the corresponding color is returned. Otherwise #f
+is returned. Use saturate only for light source colors.
+</P>
+</DL>
+<P>
+
+Resene Paints Limited, New Zealand's largest privately-owned and
+operated paint manufacturing company, has generously made their
+<CITE>Resene RGB Values List</CITE> available.
+</P>
+<P>
+
+<CODE>(require 'resene)</CODE>
+<A NAME="IDX866"></A>
+</P>
+<P>
+
+<A NAME="IDX867"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>resene</B> <I>name</I>
+<DD>Looks for <VAR>name</VAR> among the 1300 entries in the Resene color-name
+dictionary (<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color/resene.pdf">http://swissnet.ai.mit.edu/~jaffer/Color/resene.pdf</A>).
+If <VAR>name</VAR> is found, the corresponding color is returned. Otherwise
+#f is returned. The <CITE>Resene RGB Values List</CITE> is an excellent
+source for surface colors.
+</DL>
+<P>
+
+If you include the <EM>Resene RGB Values List</EM> in binary form in a
+program, then you must include its license with your program:
+</P>
+<P>
+
+<BLOCKQUOTE>
+Resene RGB Values List<BR>
+For further information refer to http://www.resene.co.nz<BR>
+Copyright Resene Paints Ltd 2001
+<P>
+
+Permission to copy this dictionary, to modify it, to redistribute it,
+to distribute modified versions, and to use it for any purpose is
+granted, subject to the following restrictions and understandings.
+</P>
+<P>
+
+<OL>
+<LI>
+Any text copy made of this dictionary must include this copyright
+notice in full.
+<P>
+
+</P>
+<LI>
+Any redistribution in binary form must reproduce this copyright
+notice in the documentation or other materials provided with the
+distribution.
+<P>
+
+</P>
+<LI>
+Resene Paints Ltd makes no warranty or representation that this
+dictionary is error-free, and is under no obligation to provide any
+services, by way of maintenance, update, or otherwise.
+<P>
+
+</P>
+<LI>
+There shall be no use of the name of Resene or Resene Paints Ltd
+in any advertising, promotional, or sales literature without prior
+written consent in each case.
+<P>
+
+</P>
+<LI>
+These RGB colour formulations may not be used to the detriment of
+Resene Paints Ltd.
+</OL>
+</BLOCKQUOTE>
+<P>
+
+<A NAME="Daylight"></A>
+<HR SIZE="6">
+<A NAME="SEC133"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC130"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC134"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.9.7 Daylight </H3>
+<!--docid::SEC133::-->
+<P>
+
+&lt;A NAME=&quot;Daylight&quot;&gt;&lt;/A&gt;
+<CODE>(require 'daylight)</CODE>
+<A NAME="IDX868"></A>
+<A NAME="IDX869"></A>
+<A NAME="IDX870"></A>
+<A NAME="IDX871"></A>
+</P>
+<P>
+
+This package calculates the colors of sky as detailed in:<BR>
+<A HREF="http://www.cs.utah.edu/vissim/papers/sunsky/sunsky.pdf">http://www.cs.utah.edu/vissim/papers/sunsky/sunsky.pdf</A><BR>
+<CITE>A Practical Analytic Model for Daylight</CITE><BR>
+A. J. Preetham, Peter Shirley, Brian Smits
+</P>
+<P>
+
+<A NAME="IDX872"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solar-hour</B> <I>julian-day hour</I>
+<DD><P>
+
+Returns the solar-time in hours given the integer <VAR>julian-day</VAR> in the range 1 to
+366, and the local time in hours.
+</P>
+<P>
+
+To be meticulous, subtract 4 minutes for each degree of longitude west
+of the standard meridian of your time zone.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX873"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solar-declination</B> <I>julian-day</I>
+<DD><P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX874"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solar-polar</B> <I>declination latitude solar-hour</I>
+<DD>Returns a list of <VAR>theta_s</VAR>, the solar angle from the
+zenith, and <VAR>phi_s</VAR>, the solar azimuth. 0 &lt;= <VAR>theta_s</VAR>
+measured in degrees. <VAR>phi_s</VAR> is measured in degrees from due
+south; west of south being positive.
+</DL>
+In the following procedures, the number 0 &lt;= <VAR>theta_s</VAR> &lt;= 90 is
+the solar angle from the zenith in degrees.
+<P>
+
+<A NAME="IDX875"></A>
+Turbidity is a measure of the fraction of scattering due to haze as
+opposed to molecules. This is a convenient quantity because it can be
+estimated based on visibility of distant objects. This model fails
+for turbidity values less than 1.3.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> _______________________________________________________________
+512|-: |
+ | * pure-air |
+256|-:** |
+ | : ** exceptionally-clear |
+128|-: * |
+ | : ** |
+ 64|-: * |
+ | : ** very-clear |
+ 32|-: ** |
+ | : ** |
+ 16|-: *** clear |
+ | : **** |
+ 8|-: **** |
+ | : **** light-haze |
+ 4|-: **** |
+ | : ****** |
+ 2|-: ******** haze thin-|
+ | : *********** fog |
+ 1|-:----------------------------------------------------*******--|
+ |_:____.____:____.____:____.____:____.____:____.____:____.____:_|
+ 1 2 4 8 16 32 64
+ Meterorological range (km) versus Turbidity
+</pre></td></tr></table><P>
+
+<A NAME="IDX876"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>sunlight-spectrum</B> <I>turbidity theta_s</I>
+<DD>Returns a vector of 41 values, the spectrum of sunlight from
+380.nm to 790.nm for a given <VAR>turbidity</VAR> and <VAR>theta_s</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX877"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>sunlight-xyz</B> <I>turbidity theta_s</I>
+<DD>Returns (unnormalized) XYZ values for color of sunlight for a
+given <VAR>turbidity</VAR> and <VAR>theta_s</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX878"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>sunlight-ciexyz</B> <I>turbidity theta_s</I>
+<DD>Given <VAR>turbidity</VAR> and <VAR>theta_s</VAR>, <CODE>sunlight-ciexyz</CODE> returns the CIEXYZ triple for color of
+sunlight scaled to be just inside the RGB709 gamut.
+</DL>
+<P>
+
+<A NAME="IDX879"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>zenith-xyy</B> <I>turbidity theta_s</I>
+<DD>Returns the xyY (chromaticity and luminance) at the zenith. The
+Luminance has units kcd/m^2.
+</DL>
+<P>
+
+<A NAME="IDX880"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>overcast-sky-color-xyy</B> <I>turbidity theta_s</I>
+<DD><VAR>turbidity</VAR> is a positive real number expressing the amount of light
+scattering. The real number <VAR>theta_s</VAR> is the solar angle from the zenith in
+degrees.
+<P>
+
+<CODE>overcast-sky-color-xyy</CODE> returns a function of one angle <VAR>theta</VAR>, the angle from the
+zenith of the viewing direction (in degrees); and returning the xyY
+value for light coming from that elevation of the sky.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX881"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>clear-sky-color-xyy</B> <I>turbidity theta_s phi_s</I>
+<DD><A NAME="IDX882"></A>
+<DT><U>Function:</U> <B>sky-color-xyy</B> <I>turbidity theta_s phi_s</I>
+<DD><VAR>turbidity</VAR> is a positive real number expressing the amount of light
+scattering. The real number <VAR>theta_s</VAR> is the solar angle from the zenith in
+degrees. The real number <VAR>phi_s</VAR> is the solar angle from south.
+<P>
+
+<CODE>clear-sky-color-xyy</CODE> returns a function of two angles, <VAR>theta</VAR> and <VAR>phi</VAR> which
+specify the angles from the zenith and south meridian of the viewing
+direction (in degrees); returning the xyY value for light coming from
+that direction of the sky.
+</P>
+<P>
+
+<CODE>sky-color-xyY</CODE> calls <CODE>overcast-sky-color-xyY</CODE> for
+<VAR>turbidity</VAR> &lt;= 20; otherwise the <CODE>clear-sky-color-xyy</CODE> function.
+</P>
+</DL>
+<P>
+
+<A NAME="Root Finding"></A>
+<HR SIZE="6">
+<A NAME="SEC134"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC133"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC135"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.10 Root Finding </H2>
+<!--docid::SEC134::-->
+<P>
+
+<CODE>(require 'root)</CODE>
+<A NAME="IDX883"></A>
+</P>
+<P>
+
+<A NAME="IDX884"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>newton:find-integer-root</B> <I>f df/dx x0</I>
+<DD>Given integer valued procedure <VAR>f</VAR>, its derivative (with respect to
+its argument) <VAR>df/dx</VAR>, and initial integer value <VAR>x0</VAR> for which
+<VAR>df/dx</VAR>(<VAR>x0</VAR>) is non-zero, returns an integer <VAR>x</VAR> for which
+<VAR>f</VAR>(<VAR>x</VAR>) is closer to zero than either of the integers adjacent
+to <VAR>x</VAR>; or returns <CODE>#f</CODE> if such an integer can't be found.
+<P>
+
+To find the closest integer to a given integers square root:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (integer-sqrt y)
+ (newton:find-integer-root
+ (lambda (x) (- (* x x) y))
+ (lambda (x) (* 2 x))
+ (ash 1 (quotient (integer-length y) 2))))
+
+(integer-sqrt 15) => 4
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX885"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>integer-sqrt</B> <I>y</I>
+<DD>Given a non-negative integer <VAR>y</VAR>, returns the rounded square-root of
+<VAR>y</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX886"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>newton:find-root</B> <I>f df/dx x0 prec</I>
+<DD>Given real valued procedures <VAR>f</VAR>, <VAR>df/dx</VAR> of one (real)
+argument, initial real value <VAR>x0</VAR> for which <VAR>df/dx</VAR>(<VAR>x0</VAR>) is
+non-zero, and positive real number <VAR>prec</VAR>, returns a real <VAR>x</VAR>
+for which <CODE>abs</CODE>(<VAR>f</VAR>(<VAR>x</VAR>)) is less than <VAR>prec</VAR>; or
+returns <CODE>#f</CODE> if such a real can't be found.
+<P>
+
+If <VAR>prec</VAR> is instead a negative integer, <CODE>newton:find-root</CODE>
+returns the result of -<VAR>prec</VAR> iterations.
+</P>
+</DL>
+<P>
+
+H. J. Orchard, <CITE>The Laguerre Method for Finding the Zeros of
+Polynomials</CITE>, IEEE Transactions on Circuits and Systems, Vol. 36,
+No. 11, November 1989, pp 1377-1381.
+</P>
+<P>
+
+<BLOCKQUOTE>
+There are 2 errors in Orchard's Table II. Line k=2 for starting
+value of 1000+j0 should have Z_k of 1.0475 + j4.1036 and line k=2
+for starting value of 0+j1000 should have Z_k of 1.0988 + j4.0833.
+</BLOCKQUOTE>
+<P>
+
+<A NAME="IDX887"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>laguerre:find-root</B> <I>f df/dz ddf/dz^2 z0 prec</I>
+<DD>Given complex valued procedure <VAR>f</VAR> of one (complex) argument, its
+derivative (with respect to its argument) <VAR>df/dx</VAR>, its second
+derivative <VAR>ddf/dz^2</VAR>, initial complex value <VAR>z0</VAR>, and positive
+real number <VAR>prec</VAR>, returns a complex number <VAR>z</VAR> for which
+<CODE>magnitude</CODE>(<VAR>f</VAR>(<VAR>z</VAR>)) is less than <VAR>prec</VAR>; or returns
+<CODE>#f</CODE> if such a number can't be found.
+<P>
+
+If <VAR>prec</VAR> is instead a negative integer, <CODE>laguerre:find-root</CODE>
+returns the result of -<VAR>prec</VAR> iterations.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX888"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>laguerre:find-polynomial-root</B> <I>deg f df/dz ddf/dz^2 z0 prec</I>
+<DD>Given polynomial procedure <VAR>f</VAR> of integer degree <VAR>deg</VAR> of one
+argument, its derivative (with respect to its argument) <VAR>df/dx</VAR>, its
+second derivative <VAR>ddf/dz^2</VAR>, initial complex value <VAR>z0</VAR>, and
+positive real number <VAR>prec</VAR>, returns a complex number <VAR>z</VAR> for
+which <CODE>magnitude</CODE>(<VAR>f</VAR>(<VAR>z</VAR>)) is less than <VAR>prec</VAR>; or
+returns <CODE>#f</CODE> if such a number can't be found.
+<P>
+
+If <VAR>prec</VAR> is instead a negative integer,
+<CODE>laguerre:find-polynomial-root</CODE> returns the result of -<VAR>prec</VAR>
+iterations.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX889"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>secant:find-root</B> <I>f x0 x1 prec</I>
+<DD><A NAME="IDX890"></A>
+<DT><U>Function:</U> <B>secant:find-bracketed-root</B> <I>f x0 x1 prec</I>
+<DD>Given a real valued procedure <VAR>f</VAR> and two real valued starting
+points <VAR>x0</VAR> and <VAR>x1</VAR>, returns a real <VAR>x</VAR> for which
+<CODE>(abs (f x))</CODE> is less than <VAR>prec</VAR>; or returns
+<CODE>#f</CODE> if such a real can't be found.
+<P>
+
+If <VAR>x0</VAR> and <VAR>x1</VAR> are chosen such that they bracket a root, that is
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(or (&lt; (f x0) 0 (f x1))
+ (&lt; (f x1) 0 (f x0)))
+</pre></td></tr></table>then the root returned will be between <VAR>x0</VAR> and <VAR>x1</VAR>, and
+<VAR>f</VAR> will not be passed an argument outside of that interval.
+<P>
+
+<CODE>secant:find-bracketed-root</CODE> will return <CODE>#f</CODE> unless <VAR>x0</VAR>
+and <VAR>x1</VAR> bracket a root.
+</P>
+<P>
+
+The secant method is used until a bracketing interval is found, at which point
+a modified <I>regula falsi</I> method is used.
+</P>
+<P>
+
+If <VAR>prec</VAR> is instead a negative integer, <CODE>secant:find-root</CODE>
+returns the result of -<VAR>prec</VAR> iterations.
+</P>
+<P>
+
+If <VAR>prec</VAR> is a procedure it should accept 5 arguments: <VAR>x0</VAR>
+<VAR>f0</VAR> <VAR>x1</VAR> <VAR>f1</VAR> and <VAR>count</VAR>, where <VAR>f0</VAR> will be
+<CODE>(f x0)</CODE>, <VAR>f1</VAR> <CODE>(f x1)</CODE>, and <VAR>count</VAR> the number of
+iterations performed so far. <VAR>prec</VAR> should return non-false
+if the iteration should be stopped.
+</P>
+</DL>
+<P>
+
+<A NAME="Minimizing"></A>
+<HR SIZE="6">
+<A NAME="SEC135"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC134"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC136"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.11 Minimizing </H2>
+<!--docid::SEC135::-->
+<P>
+
+<CODE>(require 'minimize)</CODE>
+<A NAME="IDX891"></A>
+<A NAME="IDX892"></A>
+</P>
+<P>
+
+</P>
+<P>
+
+The Golden Section Search
+<A NAME="DOCF6" HREF="slib_fot.html#FOOT6">(6)</A>
+algorithm finds minima of functions which
+are expensive to compute or for which derivatives are not available.
+Although optimum for the general case, convergence is slow,
+requiring nearly 100 iterations for the example (x^3-2x-5).
+</P>
+<P>
+
+</P>
+<P>
+
+If the derivative is available, Newton-Raphson is probably a better
+choice. If the function is inexpensive to compute, consider
+approximating the derivative.
+</P>
+<P>
+
+<A NAME="IDX893"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>golden-section-search</B> <I>f x0 x1 prec</I>
+<DD><P>
+
+<VAR>x_0</VAR> are <VAR>x_1</VAR> real numbers. The (single argument)
+procedure <VAR>f</VAR> is unimodal over the open interval (<VAR>x_0</VAR>,
+<VAR>x_1</VAR>). That is, there is exactly one point in the interval for
+which the derivative of <VAR>f</VAR> is zero.
+</P>
+<P>
+
+<CODE>golden-section-search</CODE> returns a pair (<VAR>x</VAR> . <VAR>f</VAR>(<VAR>x</VAR>)) where <VAR>f</VAR>(<VAR>x</VAR>)
+is the minimum. The <VAR>prec</VAR> parameter is the stop criterion. If
+<VAR>prec</VAR> is a positive number, then the iteration continues until
+<VAR>x</VAR> is within <VAR>prec</VAR> from the true value. If <VAR>prec</VAR> is
+a negative integer, then the procedure will iterate <VAR>-prec</VAR>
+times or until convergence. If <VAR>prec</VAR> is a procedure of seven
+arguments, <VAR>x0</VAR>, <VAR>x1</VAR>, <VAR>a</VAR>, <VAR>b</VAR>, <VAR>fa</VAR>, <VAR>fb</VAR>,
+and <VAR>count</VAR>, then the iterations will stop when the procedure
+returns <CODE>#t</CODE>.
+</P>
+<P>
+
+Analytically, the minimum of x^3-2x-5 is 0.816497.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define func (lambda (x) (+ (* x (+ (* x x) -2)) -5)))
+(golden-section-search func 0 1 (/ 10000))
+ ==&gt; (816.4883855245578e-3 . -6.0886621077391165)
+(golden-section-search func 0 1 -5)
+ ==&gt; (819.6601125010515e-3 . -6.088637561916407)
+(golden-section-search func 0 1
+ (lambda (a b c d e f g ) (= g 500)))
+ ==&gt; (816.4965933140557e-3 . -6.088662107903635)
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Commutative Rings"></A>
+<HR SIZE="6">
+<A NAME="SEC136"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC135"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC137"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.12 Commutative Rings </H2>
+<!--docid::SEC136::-->
+<P>
+
+Scheme provides a consistent and capable set of numeric functions.
+Inexacts implement a field; integers a commutative ring (and Euclidean
+domain). This package allows one to use basic Scheme numeric functions
+with symbols and non-numeric elements of commutative rings.
+</P>
+<P>
+
+<CODE>(require 'commutative-ring)</CODE>
+<A NAME="IDX894"></A>
+<A NAME="IDX895"></A>
+</P>
+<P>
+
+The <EM>commutative-ring</EM> package makes the procedures <CODE>+</CODE>,
+<CODE>-</CODE>, <CODE>*</CODE>, <CODE>/</CODE>, and <CODE>^</CODE> <EM>careful</EM> in the sense
+<A NAME="IDX896"></A>
+that any non-numeric arguments they do not reduce appear in the
+expression output. In order to see what working with this package is
+like, self-set all the single letter identifiers (to their corresponding
+symbols).
+<A NAME="IDX897"></A>
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define a 'a)
+<small>...</small>
+(define z 'z)
+</pre></td></tr></table><P>
+
+Or just <CODE>(require 'self-set)</CODE>. Now try some sample expressions:
+<A NAME="IDX898"></A>
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(+ (+ a b) (- a b)) => (* a 2)
+(* (+ a b) (+ a b)) => (^ (+ a b) 2)
+(* (+ a b) (- a b)) => (* (+ a b) (- a b))
+(* (- a b) (- a b)) => (^ (- a b) 2)
+(* (- a b) (+ a b)) => (* (+ a b) (- a b))
+(/ (+ a b) (+ c d)) => (/ (+ a b) (+ c d))
+(^ (+ a b) 3) => (^ (+ a b) 3)
+(^ (+ a 2) 3) => (^ (+ 2 a) 3)
+</pre></td></tr></table><P>
+
+Associative rules have been applied and repeated addition and
+multiplication converted to multiplication and exponentiation.
+</P>
+<P>
+
+We can enable distributive rules, thus expanding to sum of products
+form:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! *ruleset* (combined-rulesets distribute* distribute/))
+
+(* (+ a b) (+ a b)) => (+ (* 2 a b) (^ a 2) (^ b 2))
+(* (+ a b) (- a b)) => (- (^ a 2) (^ b 2))
+(* (- a b) (- a b)) => (- (+ (^ a 2) (^ b 2)) (* 2 a b))
+(* (- a b) (+ a b)) => (- (^ a 2) (^ b 2))
+(/ (+ a b) (+ c d)) => (+ (/ a (+ c d)) (/ b (+ c d)))
+(/ (+ a b) (- c d)) => (+ (/ a (- c d)) (/ b (- c d)))
+(/ (- a b) (- c d)) => (- (/ a (- c d)) (/ b (- c d)))
+(/ (- a b) (+ c d)) => (- (/ a (+ c d)) (/ b (+ c d)))
+(^ (+ a b) 3) => (+ (* 3 a (^ b 2)) (* 3 b (^ a 2)) (^ a 3) (^ b 3))
+(^ (+ a 2) 3) => (+ 8 (* a 12) (* (^ a 2) 6) (^ a 3))
+</pre></td></tr></table><P>
+
+Use of this package is not restricted to simple arithmetic expressions:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'determinant)
+
+(determinant '((a b c) (d e f) (g h i))) =>
+(- (+ (* a e i) (* b f g) (* c d h)) (* a f h) (* b d i) (* c e g))
+</pre></td></tr></table><P>
+
+Currently, only <CODE>+</CODE>, <CODE>-</CODE>, <CODE>*</CODE>, <CODE>/</CODE>, and <CODE>^</CODE>
+support non-numeric elements. Expressions with <CODE>-</CODE> are converted
+to equivalent expressions without <CODE>-</CODE>, so behavior for <CODE>-</CODE> is
+not defined separately. <CODE>/</CODE> expressions are handled similarly.
+</P>
+<P>
+
+This list might be extended to include <CODE>quotient</CODE>, <CODE>modulo</CODE>,
+<CODE>remainder</CODE>, <CODE>lcm</CODE>, and <CODE>gcd</CODE>; but these work only for
+the more restrictive Euclidean (Unique Factorization) Domain.
+<A NAME="IDX899"></A>
+<A NAME="IDX900"></A>
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC137"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC136"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC138"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.13 Rules and Rulesets </H2>
+<!--docid::SEC137::-->
+<P>
+
+The <EM>commutative-ring</EM> package allows control of ring properties
+through the use of <EM>rulesets</EM>.
+</P>
+<P>
+
+<A NAME="IDX901"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*ruleset*</B>
+<DD>Contains the set of rules currently in effect. Rules defined by
+<CODE>cring:define-rule</CODE> are stored within the value of *ruleset* at the
+time <CODE>cring:define-rule</CODE> is called. If <VAR>*ruleset*</VAR> is
+<CODE>#f</CODE>, then no rules apply.
+</DL>
+<P>
+
+<A NAME="IDX902"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-ruleset</B> <I>rule1 <small>...</small></I>
+<DD><A NAME="IDX903"></A>
+<DT><U>Function:</U> <B>make-ruleset</B> <I>name rule1 <small>...</small></I>
+<DD>Returns a new ruleset containing the rules formed by applying
+<CODE>cring:define-rule</CODE> to each 4-element list argument <VAR>rule</VAR>. If
+the first argument to <CODE>make-ruleset</CODE> is a symbol, then the database
+table created for the new ruleset will be named <VAR>name</VAR>. Calling
+<CODE>make-ruleset</CODE> with no rule arguments creates an empty ruleset.
+</DL>
+<P>
+
+<A NAME="IDX904"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>combined-rulesets</B> <I>ruleset1 <small>...</small></I>
+<DD><A NAME="IDX905"></A>
+<DT><U>Function:</U> <B>combined-rulesets</B> <I>name ruleset1 <small>...</small></I>
+<DD>Returns a new ruleset containing the rules contained in each ruleset
+argument <VAR>ruleset</VAR>. If the first argument to
+<CODE>combined-ruleset</CODE> is a symbol, then the database table created for
+the new ruleset will be named <VAR>name</VAR>. Calling
+<CODE>combined-ruleset</CODE> with no ruleset arguments creates an empty
+ruleset.
+</DL>
+<P>
+
+Two rulesets are defined by this package.
+</P>
+<P>
+
+<A NAME="IDX906"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>distribute*</B>
+<DD>Contains the ruleset to distribute multiplication over addition and
+subtraction.
+</DL>
+<P>
+
+<A NAME="IDX907"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>distribute/</B>
+<DD>Contains the ruleset to distribute division over addition and
+subtraction.
+<P>
+
+Take care when using both <VAR>distribute*</VAR> and <VAR>distribute/</VAR>
+simultaneously. It is possible to put <CODE>/</CODE> into an infinite loop.
+</P>
+</DL>
+<P>
+
+You can specify how sum and product expressions containing non-numeric
+elements simplify by specifying the rules for <CODE>+</CODE> or <CODE>*</CODE> for
+cases where expressions involving objects reduce to numbers or to
+expressions involving different non-numeric elements.
+</P>
+<P>
+
+<A NAME="IDX908"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>cring:define-rule</B> <I>op sub-op1 sub-op2 reduction</I>
+<DD>Defines a rule for the case when the operation represented by symbol
+<VAR>op</VAR> is applied to lists whose <CODE>car</CODE>s are <VAR>sub-op1</VAR> and
+<VAR>sub-op2</VAR>, respectively. The argument <VAR>reduction</VAR> is a
+procedure accepting 2 arguments which will be lists whose <CODE>car</CODE>s
+are <VAR>sub-op1</VAR> and <VAR>sub-op2</VAR>.
+<P>
+
+<A NAME="IDX909"></A>
+<DT><U>Function:</U> <B>cring:define-rule</B> <I>op sub-op1 'identity reduction</I>
+<DD>Defines a rule for the case when the operation represented by symbol
+<VAR>op</VAR> is applied to a list whose <CODE>car</CODE> is <VAR>sub-op1</VAR>, and
+some other argument. <VAR>Reduction</VAR> will be called with the list whose
+<CODE>car</CODE> is <VAR>sub-op1</VAR> and some other argument.
+</P>
+<P>
+
+If <VAR>reduction</VAR> returns <CODE>#f</CODE>, the reduction has failed and other
+reductions will be tried. If <VAR>reduction</VAR> returns a non-false value,
+that value will replace the two arguments in arithmetic (<CODE>+</CODE>,
+<CODE>-</CODE>, and <CODE>*</CODE>) calculations involving non-numeric elements.
+</P>
+<P>
+
+The operations <CODE>+</CODE> and <CODE>*</CODE> are assumed commutative; hence both
+orders of arguments to <VAR>reduction</VAR> will be tried if necessary.
+</P>
+<P>
+
+The following rule is the definition for distributing <CODE>*</CODE> over
+<CODE>+</CODE>.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(cring:define-rule
+ '* '+ 'identity
+ (lambda (exp1 exp2)
+ (apply + (map (lambda (trm) (* trm exp2)) (cdr exp1))))))
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC138"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC137"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC139"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.14 How to Create a Commutative Ring </H2>
+<!--docid::SEC138::-->
+<P>
+
+The first step in creating your commutative ring is to write procedures
+to create elements of the ring. A non-numeric element of the ring must
+be represented as a list whose first element is a symbol or string.
+This first element identifies the type of the object. A convenient and
+clear convention is to make the type-identifying element be the same
+symbol whose top-level value is the procedure to create it.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (n . list1)
+ (cond ((and (= 2 (length list1))
+ (eq? (car list1) (cadr list1)))
+ 0)
+ ((not (term&lt; (first list1) (last1 list1)))
+ (apply n (reverse list1)))
+ (else (cons 'n list1))))
+
+(define (s x y) (n x y))
+
+(define (m . list1)
+ (cond ((neq? (first list1) (term_min list1))
+ (apply m (cyclicrotate list1)))
+ ((term&lt; (last1 list1) (cadr list1))
+ (apply m (reverse (cyclicrotate list1))))
+ (else (cons 'm list1))))
+</pre></td></tr></table><P>
+
+Define a procedure to multiply 2 non-numeric elements of the ring.
+Other multiplicatons are handled automatically. Objects for which rules
+have <EM>not</EM> been defined are not changed.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (n*n ni nj)
+ (let ((list1 (cdr ni)) (list2 (cdr nj)))
+ (cond ((null? (intersection list1 list2)) #f)
+ ((and (eq? (last1 list1) (first list2))
+ (neq? (first list1) (last1 list2)))
+ (apply n (splice list1 list2)))
+ ((and (eq? (first list1) (first list2))
+ (neq? (last1 list1) (last1 list2)))
+ (apply n (splice (reverse list1) list2)))
+ ((and (eq? (last1 list1) (last1 list2))
+ (neq? (first list1) (first list2)))
+ (apply n (splice list1 (reverse list2))))
+ ((and (eq? (last1 list1) (first list2))
+ (eq? (first list1) (last1 list2)))
+ (apply m (cyclicsplice list1 list2)))
+ ((and (eq? (first list1) (first list2))
+ (eq? (last1 list1) (last1 list2)))
+ (apply m (cyclicsplice (reverse list1) list2)))
+ (else #f))))
+</pre></td></tr></table><P>
+
+Test the procedures to see if they work.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>;;; where cyclicrotate(list) is cyclic rotation of the list one step
+;;; by putting the first element at the end
+(define (cyclicrotate list1)
+ (append (rest list1) (list (first list1))))
+;;; and where term_min(list) is the element of the list which is
+;;; first in the term ordering.
+(define (term_min list1)
+ (car (sort list1 term&lt;)))
+(define (term&lt; sym1 sym2)
+ (string&lt;? (symbol-&gt;string sym1) (symbol-&gt;string sym2)))
+(define first car)
+(define rest cdr)
+(define (last1 list1) (car (last-pair list1)))
+(define (neq? obj1 obj2) (not (eq? obj1 obj2)))
+;;; where splice is the concatenation of list1 and list2 except that their
+;;; common element is not repeated.
+(define (splice list1 list2)
+ (cond ((eq? (last1 list1) (first list2))
+ (append list1 (cdr list2)))
+ (else (slib:error 'splice list1 list2))))
+;;; where cyclicsplice is the result of leaving off the last element of
+;;; splice(list1,list2).
+(define (cyclicsplice list1 list2)
+ (cond ((and (eq? (last1 list1) (first list2))
+ (eq? (first list1) (last1 list2)))
+ (butlast (splice list1 list2) 1))
+ (else (slib:error 'cyclicsplice list1 list2))))
+
+(N*N (S a b) (S a b)) => (m a b)
+</pre></td></tr></table><P>
+
+Then register the rule for multiplying type N objects by type N objects.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(cring:define-rule '* 'N 'N N*N))
+</pre></td></tr></table><P>
+
+Now we are ready to compute!
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (t)
+ (define detM
+ (+ (* (S g b)
+ (+ (* (S f d)
+ (- (* (S a f) (S d g)) (* (S a g) (S d f))))
+ (* (S f f)
+ (- (* (S a g) (S d d)) (* (S a d) (S d g))))
+ (* (S f g)
+ (- (* (S a d) (S d f)) (* (S a f) (S d d))))))
+ (* (S g d)
+ (+ (* (S f b)
+ (- (* (S a g) (S d f)) (* (S a f) (S d g))))
+ (* (S f f)
+ (- (* (S a b) (S d g)) (* (S a g) (S d b))))
+ (* (S f g)
+ (- (* (S a f) (S d b)) (* (S a b) (S d f))))))
+ (* (S g f)
+ (+ (* (S f b)
+ (- (* (S a d) (S d g)) (* (S a g) (S d d))))
+ (* (S f d)
+ (- (* (S a g) (S d b)) (* (S a b) (S d g))))
+ (* (S f g)
+ (- (* (S a b) (S d d)) (* (S a d) (S d b))))))
+ (* (S g g)
+ (+ (* (S f b)
+ (- (* (S a f) (S d d)) (* (S a d) (S d f))))
+ (* (S f d)
+ (- (* (S a b) (S d f)) (* (S a f) (S d b))))
+ (* (S f f)
+ (- (* (S a d) (S d b)) (* (S a b) (S d d))))))))
+ (* (S b e) (S c a) (S e c)
+ detM
+ ))
+(pretty-print (t))
+-|
+(- (+ (m a c e b d f g)
+ (m a c e b d g f)
+ (m a c e b f d g)
+ (m a c e b f g d)
+ (m a c e b g d f)
+ (m a c e b g f d))
+ (* 2 (m a b e c) (m d f g))
+ (* (m a c e b d) (m f g))
+ (* (m a c e b f) (m d g))
+ (* (m a c e b g) (m d f)))
+</pre></td></tr></table><P>
+
+<A NAME="Matrix Algebra"></A>
+<HR SIZE="6">
+<A NAME="SEC139"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC138"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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> 5.15 Matrix Algebra </H2>
+<!--docid::SEC139::-->
+<P>
+
+<CODE>(require 'determinant)</CODE>
+<A NAME="IDX910"></A>
+</P>
+<P>
+
+A Matrix can be either a list of lists (rows) or an array.
+As with linear-algebra texts, this package uses 1-based coordinates.
+</P>
+<P>
+
+<A NAME="IDX911"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>matrix-&gt;lists</B> <I>matrix</I>
+<DD><P>
+
+Returns the list-of-lists form of <VAR>matrix</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX912"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>matrix-&gt;array</B> <I>matrix</I>
+<DD><P>
+
+Returns the (ones-based) array form of <VAR>matrix</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX913"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>determinant</B> <I>matrix</I>
+<DD><P>
+
+<VAR>matrix</VAR> must be a square matrix.
+<CODE>determinant</CODE> returns the determinant of <VAR>matrix</VAR>.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'determinant)
+(determinant '((1 2) (3 4))) => -2
+(determinant '((1 2 3) (4 5 6) (7 8 9))) => 0
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX914"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>transpose</B> <I>matrix</I>
+<DD><P>
+
+Returns a copy of <VAR>matrix</VAR> flipped over the diagonal containing the 1,1
+element.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX915"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>matrix:product</B> <I>m1 m2</I>
+<DD><P>
+
+Returns the product of matrices <VAR>m1</VAR> and <VAR>m2</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX916"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>matrix:inverse</B> <I>matrix</I>
+<DD><P>
+
+<VAR>matrix</VAR> must be a square matrix.
+If <VAR>matrix</VAR> is singlar, then <CODE>matrix:inverse</CODE> returns #f; otherwise <CODE>matrix:inverse</CODE> returns the
+<CODE>matrix:product</CODE> inverse of <VAR>matrix</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="Database Packages"></A>
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &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>
diff --git a/slib_6.html b/slib_6.html
new file mode 100644
index 0000000..804d4e9
--- /dev/null
+++ b/slib_6.html
@@ -0,0 +1,3658 @@
+<!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: Database Packages</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Database Packages">
+<META NAME="keywords" CONTENT="SLIB: Database 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="SEC140"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC139"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &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_7.html#SEC183"> &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> 6. Database Packages </H1>
+<!--docid::SEC140::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC141">6.1 Relational Database</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'relational-database</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC165">6.2 Relational Infrastructure</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'wt-tree</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Relational Database"></A>
+<HR SIZE="6">
+<A NAME="SEC141"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC142"> &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_6.html#SEC140"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1 Relational Database </H2>
+<!--docid::SEC141::-->
+<P>
+
+<CODE>(require 'relational-database)</CODE>
+<A NAME="IDX917"></A>
+</P>
+<P>
+
+This package implements a database system inspired by the Relational
+Model (<CITE>E. F. Codd, A Relational Model of Data for Large Shared
+Data Banks</CITE>). An SLIB relational database implementation can be created
+from any <A HREF="slib_6.html#SEC166">6.2.1 Base Table</A> implementation.
+</P>
+<P>
+
+Why relational database? For motivations and design issues see<BR>
+<A HREF="http://swissnet.ai.mit.edu/~jaffer/DBManifesto.html">http://swissnet.ai.mit.edu/~jaffer/DBManifesto.html</A>.
+</P>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'databases</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC147">6.1.2 Table Operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC154">6.1.3 Database Interpolation</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'database-interpolate</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC155">6.1.4 Embedded Commands</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'database-commands</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'within-database</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'database-browse</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Using Databases"></A>
+<HR SIZE="6">
+<A NAME="SEC142"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> &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_6.html#SEC141"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.1 Using Databases </H3>
+<!--docid::SEC142::-->
+<P>
+
+<CODE>(require 'databases)</CODE>
+<A NAME="IDX918"></A>
+</P>
+<P>
+
+This enhancement wraps a utility layer on <CODE>relational-database</CODE>
+which provides:
+</P>
+<P>
+
+<UL>
+<LI>
+Identification of open databases by filename.
+<LI>
+Automatic sharing of open (immutable) databases.
+<LI>
+Automatic loading of base-table package when creating a database.
+<LI>
+Detection and automatic loading of the appropriate base-table package
+when opening a database.
+<LI>
+Table and data definition from Scheme lists.
+</UL>
+<P>
+
+<A NAME="SEC143"></A>
+<H4> Database Sharing </H4>
+<!--docid::SEC143::-->
+<P>
+
+<EM>Auto-sharing</EM> refers to a call to the procedure
+<A NAME="IDX919"></A>
+<CODE>open-database</CODE> returning an already open database (procedure),
+rather than opening the database file a second time.
+</P>
+<P>
+
+<BLOCKQUOTE>
+<EM>Note:</EM> Databases returned by <CODE>open-database</CODE> do not include
+wrappers applied by packages like <A HREF="slib_6.html#SEC155">6.1.4 Embedded Commands</A>. But
+wrapped databases do work as arguments to these functions.
+</BLOCKQUOTE>
+<P>
+
+When a database is created, it is mutable by the creator and not
+auto-sharable. A database opened mutably is also not auto-sharable.
+But any number of readers can (open) share a non-mutable database file.
+</P>
+<P>
+
+This next set of procedures mirror the whole-database methods in
+<A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A>. Except for <CODE>create-database</CODE>, each
+procedure will accept either a filename or database procedure for its
+first argument.
+</P>
+<P>
+
+<A NAME="IDX920"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>create-database</B> <I>filename base-table-type</I>
+<DD><P>
+
+<VAR>filename</VAR> should be a string naming a file; or <CODE>#f</CODE>. <VAR>base-table-type</VAR> must be a
+symbol naming a feature which can be passed to <CODE>require</CODE>. <CODE>create-database</CODE>
+returns a new, open relational database (with base-table type <VAR>base-table-type</VAR>)
+associated with <VAR>filename</VAR>, or a new ephemeral database if <VAR>filename</VAR> is <CODE>#f</CODE>.
+</P>
+<P>
+
+<CODE>create-database</CODE> is the only run-time use of require in SLIB
+which crosses module boundaries. When <VAR>base-table-type</VAR> is <CODE>require</CODE>d by <CODE>create-database</CODE>; it
+adds an association of <VAR>base-table-type</VAR> with its <EM>relational-system</EM> procedure
+<A NAME="IDX921"></A>
+to <VAR>mdbm:*databases*</VAR>.
+</P>
+<P>
+
+alist-table is the default base-table type:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'databases)
+(define my-rdb (create-database &quot;my.db&quot; 'alist-table))
+</pre></td></tr></table></DL>
+Only <CODE>alist-table</CODE> and base-table modules which have been
+<CODE>require</CODE>d will dispatch correctly from the
+<CODE>open-database</CODE> procedures. Therefore, either pass two
+arguments to <CODE>open-database</CODE>, or require the base-table of your
+database file uses before calling <CODE>open-database</CODE> with one
+argument.
+<P>
+
+<A NAME="IDX922"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>open-database!</B> <I>rdb base-table-type</I>
+<DD><P>
+
+Returns <EM>mutable</EM> open relational database or #f.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX923"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>open-database</B> <I>rdb base-table-type</I>
+<DD><P>
+
+Returns an open relational database associated with <VAR>rdb</VAR>. The
+database will be opened with base-table type <VAR>base-table-type</VAR>).
+</P>
+<P>
+
+<A NAME="IDX924"></A>
+<DT><U>Function:</U> <B>open-database</B> <I>rdb</I>
+<DD>Returns an open relational database associated with <VAR>rdb</VAR>.
+<CODE>open-database</CODE> will attempt to deduce the correct base-table-type.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX925"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>write-database</B> <I>rdb filename</I>
+<DD><P>
+
+Writes the mutable relational-database <VAR>rdb</VAR> to <VAR>filename</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX926"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>sync-database</B> <I>rdb</I>
+<DD><P>
+
+Writes the mutable relational-database <VAR>rdb</VAR> to the filename it was
+opened with.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX927"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>solidify-database</B> <I>rdb</I>
+<DD><P>
+
+Syncs <VAR>rdb</VAR> and makes it immutable.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX928"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>close-database</B> <I>rdb</I>
+<DD><P>
+
+<VAR>rdb</VAR> will only be closed when the count of <CODE>open-database</CODE> - <CODE>close-database</CODE>
+calls for <VAR>rdb</VAR> (and its filename) is 0. <CODE>close-database</CODE> returns #t if successful;
+and #f otherwise.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX929"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>mdbm:report</B>
+<DD><P>
+
+Prints a table of open database files. The columns are the
+base-table type, number of opens, `<SAMP>!</SAMP>' for mutable, the
+filename, and the lock certificate (if locked).
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(mdbm:report)
+-|
+ alist-table 003 /usr/local/lib/slib/clrnamdb.scm
+ alist-table 001 ! sdram.db jaffer@aubrey.jaffer.3166:1038628199
+</pre></td></tr></table><P>
+
+<A NAME="SEC144"></A>
+<H4> Opening Tables </H4>
+<!--docid::SEC144::-->
+<P>
+
+<A NAME="IDX930"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>open-table</B> <I>rdb table-name</I>
+<DD><P>
+
+<VAR>rdb</VAR> must be a relational database and <VAR>table-name</VAR> a symbol.
+</P>
+<P>
+
+<CODE>open-table</CODE> returns a &quot;methods&quot; procedure for an existing relational table in
+<VAR>rdb</VAR> if it exists and can be opened for reading, otherwise returns
+<CODE>#f</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX931"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>open-table!</B> <I>rdb table-name</I>
+<DD><P>
+
+<VAR>rdb</VAR> must be a relational database and <VAR>table-name</VAR> a symbol.
+</P>
+<P>
+
+<CODE>open-table!</CODE> returns a &quot;methods&quot; procedure for an existing relational table in
+<VAR>rdb</VAR> if it exists and can be opened in mutable mode, otherwise returns
+<CODE>#f</CODE>.
+</P>
+</DL>
+<A NAME="SEC145"></A>
+<H4> Defining Tables </H4>
+<!--docid::SEC145::-->
+<P>
+
+<A NAME="IDX932"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>define-domains</B> <I>rdb row5 <small>...</small></I>
+<DD><P>
+
+Adds the domain rows <VAR>row5</VAR> <small>...</small> to the `<SAMP>*domains-data*</SAMP>' table
+in <VAR>rdb</VAR>. The format of the row is given in <A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A>.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define-domains rdb '(permittivity #f complex? c64 #f))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX933"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>add-domain</B> <I>rdb row5</I>
+<DD><P>
+
+Use <CODE>define-domains</CODE> instead.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX934"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>define-tables</B> <I>rdb spec-0 <small>...</small></I>
+<DD><P>
+
+Adds tables as specified in <VAR>spec-0</VAR> <small>...</small> to the open
+relational-database <VAR>rdb</VAR>. Each <VAR>spec</VAR> has the form:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(&lt;name&gt; &lt;descriptor-name&gt; &lt;descriptor-name&gt; &lt;rows&gt;)
+</pre></td></tr></table>or
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(&lt;name&gt; &lt;primary-key-fields&gt; &lt;other-fields&gt; &lt;rows&gt;)
+</pre></td></tr></table><P>
+
+where &lt;name&gt; is the table name, &lt;descriptor-name&gt; is the symbol
+name of a descriptor table, &lt;primary-key-fields&gt; and
+&lt;other-fields&gt; describe the primary keys and other fields
+respectively, and &lt;rows&gt; is a list of data rows to be added to the
+table.
+</P>
+<P>
+
+&lt;primary-key-fields&gt; and &lt;other-fields&gt; are lists of field
+descriptors of the form:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(&lt;column-name&gt; &lt;domain&gt;)
+</pre></td></tr></table>or
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(&lt;column-name&gt; &lt;domain&gt; &lt;column-integrity-rule&gt;)
+</pre></td></tr></table><P>
+
+where &lt;column-name&gt; is the column name, &lt;domain&gt; is the domain
+of the column, and &lt;column-integrity-rule&gt; is an expression whose
+value is a procedure of one argument (which returns <CODE>#f</CODE> to signal
+an error).
+</P>
+<P>
+
+If &lt;domain&gt; is not a defined domain name and it matches the name of
+this table or an already defined (in one of <VAR>spec-0</VAR> <small>...</small>) single
+key field table, a foreign-key domain will be created for it.
+</P>
+</DL>
+<A NAME="SEC146"></A>
+<H4> Listing Tables </H4>
+<!--docid::SEC146::-->
+<P>
+
+<A NAME="IDX935"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>list-table-definition</B> <I>rdb table-name</I>
+<DD><P>
+
+If symbol <VAR>table-name</VAR> exists in the open relational-database
+<VAR>rdb</VAR>, then returns a list of the table-name, its primary key names
+and domains, its other key names and domains, and the table's records
+(as lists). Otherwise, returns #f.
+</P>
+<P>
+
+The list returned by <CODE>list-table-definition</CODE>, when passed as an
+argument to <CODE>define-tables</CODE>, will recreate the table.
+</P>
+</DL>
+<P>
+
+<A NAME="Table Operations"></A>
+<HR SIZE="6">
+<A NAME="SEC147"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC142"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC148"> &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_6.html#SEC141"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.2 Table Operations </H3>
+<!--docid::SEC147::-->
+<P>
+
+These are the descriptions of the methods available from an open
+relational table. A method is retrieved from a table by calling
+the table with the symbol name of the operation. For example:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((plat 'get 'processor) 'djgpp) => i386
+</pre></td></tr></table><P>
+
+Some operations described below require primary key arguments. Primary
+keys arguments are denoted <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small>. It is an
+error to call an operation for a table which takes primary key arguments
+with the wrong number of primary keys for that table.
+</P>
+<P>
+
+<A NAME="IDX936"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>get</B> <I>column-name</I>
+<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which
+returns the value for the <VAR>column-name</VAR> column of the row associated
+with primary keys <VAR>key1</VAR>, <VAR>key2</VAR> <small>...</small> if that row exists in
+the table, or <CODE>#f</CODE> otherwise.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((plat 'get 'processor) 'djgpp) => i386
+((plat 'get 'processor) 'be-os) => #f
+</pre></td></tr></table></DL>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC151">6.1.2.4 Indexed Sequential Access Methods</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Single Row Operations"></A>
+<HR SIZE="6">
+<A NAME="SEC148"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC149"> &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_6.html#SEC147"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.2.1 Single Row Operations </H4>
+<!--docid::SEC148::-->
+<P>
+
+The term <EM>row</EM> used below refers to a Scheme list of values (one for
+each column) in the order specified in the descriptor (table) for this
+table. Missing values appear as <CODE>#f</CODE>. Primary keys must not
+be missing.
+</P>
+<P>
+
+<A NAME="IDX937"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:insert</B>
+<DD>Adds the row <VAR>row</VAR> to this table. If a row for the primary key(s)
+specified by <VAR>row</VAR> already exists in this table an error is
+signaled. The value returned is unspecified.
+</DL>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define telephone-table-desc
+ ((my-database 'create-table) 'telephone-table-desc))
+(define ndrp (telephone-table-desc 'row:insert))
+(ndrp '(1 #t name #f string))
+(ndrp '(2 #f telephone
+ (lambda (d)
+ (and (string? d) (&gt; (string-length d) 2)
+ (every
+ (lambda (c)
+ (memv c '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9
+ #\+ #\( #\ #\) #\-)))
+ (string-&gt;list d))))
+ string))
+</pre></td></tr></table><P>
+
+<A NAME="IDX938"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:update</B>
+<DD>Returns a procedure of one argument, <VAR>row</VAR>, which adds the row,
+<VAR>row</VAR>, to this table. If a row for the primary key(s) specified by
+<VAR>row</VAR> already exists in this table, it will be overwritten. The
+value returned is unspecified.
+</DL>
+<P>
+
+<A NAME="IDX939"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:retrieve</B>
+<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which
+returns the row associated with primary keys <VAR>key1</VAR>, <VAR>key2</VAR>
+<small>...</small> if it exists, or <CODE>#f</CODE> otherwise.
+</DL>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((plat 'row:retrieve) 'linux) => (linux i386 linux gcc)
+((plat 'row:retrieve) 'multics) => #f
+</pre></td></tr></table><P>
+
+<A NAME="IDX940"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:remove</B>
+<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which
+removes and returns the row associated with primary keys <VAR>key1</VAR>,
+<VAR>key2</VAR> <small>...</small> if it exists, or <CODE>#f</CODE> otherwise.
+</DL>
+<P>
+
+<A NAME="IDX941"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:delete</B>
+<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which
+deletes the row associated with primary keys <VAR>key1</VAR>, <VAR>key2</VAR>
+<small>...</small> if it exists. The value returned is unspecified.
+</DL>
+<P>
+
+<A NAME="Match-Keys"></A>
+<HR SIZE="6">
+<A NAME="SEC149"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC148"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC150"> &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_6.html#SEC147"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.2.2 Match-Keys </H4>
+<!--docid::SEC149::-->
+<P>
+
+<A NAME="IDX942"></A>
+The (optional) <VAR>match-key1</VAR> <small>...</small> arguments are used to restrict
+actions of a whole-table operation to a subset of that table. Those
+procedures (returned by methods) which accept match-key arguments will
+accept any number of match-key arguments between zero and the number of
+primary keys in the table. Any unspecified <VAR>match-key</VAR> arguments
+default to <CODE>#f</CODE>.
+</P>
+<P>
+
+The <VAR>match-key1</VAR> <small>...</small> restrict the actions of the table command
+to those records whose primary keys each satisfy the corresponding
+<VAR>match-key</VAR> argument. The arguments and their actions are:
+</P>
+<P>
+
+<BLOCKQUOTE>
+<DL COMPACT>
+<DT><CODE>#f</CODE>
+<DD>The false value matches any key in the corresponding position.
+<DT>an object of type procedure
+<DD>This procedure must take a single argument, the key in the corresponding
+position. Any key for which the procedure returns a non-false value is
+a match; Any key for which the procedure returns a <CODE>#f</CODE> is not.
+<DT>other values
+<DD>Any other value matches only those keys <CODE>equal?</CODE> to it.
+</DL>
+</BLOCKQUOTE>
+<P>
+
+<A NAME="IDX943"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>get*</B> <I>column-name</I>
+<DD>Returns a procedure of optional arguments <VAR>match-key1</VAR> <small>...</small> which
+returns a list of the values for the specified column for all rows in
+this table. The optional <VAR>match-key1</VAR> <small>...</small> arguments restrict
+actions to a subset of the table.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((plat 'get* 'processor)) =>
+(i386 i8086 i386 i8086 i386 i386 i8086 m68000
+ m68000 m68000 m68000 m68000 powerpc)
+
+((plat 'get* 'processor) #f) =>
+(i386 i8086 i386 i8086 i386 i386 i8086 m68000
+ m68000 m68000 m68000 m68000 powerpc)
+
+(define (a-key? key)
+ (char=? #\a (string-ref (symbol-&gt;string key) 0)))
+
+((plat 'get* 'processor) a-key?) =>
+(m68000 m68000 m68000 m68000 m68000 powerpc)
+
+((plat 'get* 'name) a-key?) =>
+(atari-st-turbo-c atari-st-gcc amiga-sas/c-5.10
+ amiga-aztec amiga-dice-c aix)
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Multi-Row Operations"></A>
+<HR SIZE="6">
+<A NAME="SEC150"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC149"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC151"> &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_6.html#SEC147"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.2.3 Multi-Row Operations </H4>
+<!--docid::SEC150::-->
+<P>
+
+<A NAME="IDX944"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:retrieve*</B>
+<DD>Returns a procedure of optional arguments <VAR>match-key1</VAR> <small>...</small>
+which returns a list of all rows in this table. The optional
+<VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a subset of the
+table. For details see See section <A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A>.
+</DL>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((plat 'row:retrieve*) a-key?) =>
+((atari-st-turbo-c m68000 atari turbo-c)
+ (atari-st-gcc m68000 atari gcc)
+ (amiga-sas/c-5.10 m68000 amiga sas/c)
+ (amiga-aztec m68000 amiga aztec)
+ (amiga-dice-c m68000 amiga dice-c)
+ (aix powerpc aix -))
+</pre></td></tr></table><P>
+
+<A NAME="IDX945"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:remove*</B>
+<DD>Returns a procedure of optional arguments <VAR>match-key1</VAR> <small>...</small> which
+removes and returns a list of all rows in this table. The optional
+<VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a subset of the
+table.
+</DL>
+<P>
+
+<A NAME="IDX946"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:delete*</B>
+<DD>Returns a procedure of optional arguments <VAR>match-key1</VAR> <small>...</small>
+which Deletes all rows from this table. The optional <VAR>match-key1</VAR>
+<small>...</small> arguments restrict deletions to a subset of the table. The
+value returned is unspecified. The descriptor table and catalog entry
+for this table are not affected.
+</DL>
+<P>
+
+<A NAME="IDX947"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>for-each-row</B>
+<DD>Returns a procedure of arguments <VAR>proc</VAR> <VAR>match-key1</VAR> <small>...</small>
+which calls <VAR>proc</VAR> with each <VAR>row</VAR> in this table. The
+optional <VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a
+subset of the table. For details see See section <A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A>.
+</DL>
+<P>
+
+Note that <CODE>row:insert*</CODE> and <CODE>row:update*</CODE> do <EM>not</EM> use
+match-keys.
+</P>
+<P>
+
+<A NAME="IDX948"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:insert*</B>
+<DD>Returns a procedure of one argument, <VAR>rows</VAR>, which adds each row in
+the list of rows, <VAR>rows</VAR>, to this table. If a row for the primary
+key specified by an element of <VAR>rows</VAR> already exists in this table,
+an error is signaled. The value returned is unspecified.
+</DL>
+<P>
+
+<A NAME="IDX949"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>row:update*</B>
+<DD>Returns a procedure of one argument, <VAR>rows</VAR>, which adds each row in
+the list of rows, <VAR>rows</VAR>, to this table. If a row for the primary
+key specified by an element of <VAR>rows</VAR> already exists in this table,
+it will be overwritten. The value returned is unspecified.
+</DL>
+<P>
+
+<A NAME="Indexed Sequential Access Methods"></A>
+<HR SIZE="6">
+<A NAME="SEC151"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC150"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC152"> &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_6.html#SEC147"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.2.4 Indexed Sequential Access Methods </H4>
+<!--docid::SEC151::-->
+<P>
+
+<A NAME="IDX950"></A>
+<EM>Indexed Sequential Access Methods</EM> are a way of arranging
+database information so that records can be accessed both by key and
+by key sequence (ordering). <EM>ISAM</EM> is not part of Codd's
+relational model. Hardcore relational programmers might use some
+least-upper-bound join for every row to get them into an order.
+</P>
+<P>
+
+Associative memory in B-Trees is an example of a database
+implementation which can support a native key ordering. SLIB's
+<CODE>alist-table</CODE> implementation uses <CODE>sort</CODE> to implement
+<CODE>for-each-row-in-order</CODE>, but does not support <CODE>isam-next</CODE>
+and <CODE>isam-prev</CODE>.
+</P>
+<P>
+
+The multi-primary-key ordering employed by these operations is the
+lexicographic collation of those primary-key fields in their given
+order. For example:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(12 a 34) &lt; (12 a 36) &lt; (12 b 1) &lt; (13 a 0)
+</pre></td></tr></table><P>
+
+<A NAME="Sequential Index Operations"></A>
+<HR SIZE="6">
+<A NAME="SEC152"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC151"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC153"> &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_6.html#SEC147"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.2.5 Sequential Index Operations </H4>
+<!--docid::SEC152::-->
+<P>
+
+The following procedures are individually optional depending on the
+base-table implememtation. If an operation is <EM>not</EM> supported,
+then calling the table with that operation symbol will return false.
+</P>
+<P>
+
+<A NAME="IDX951"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>for-each-row-in-order</B>
+<DD>Returns a procedure of arguments <VAR>proc</VAR> <VAR>match-key1</VAR> <small>...</small>
+which calls <VAR>proc</VAR> with each <VAR>row</VAR> in this table in the
+(implementation-dependent) natural, repeatable ordering for rows. The
+optional <VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a
+subset of the table. For details see See section <A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A>.
+</DL>
+<P>
+
+<A NAME="IDX952"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>isam-next</B>
+<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which
+returns the key-list identifying the lowest record higher than
+<VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which is stored in the relational-table;
+or false if no higher record is present.
+<P>
+
+<A NAME="IDX953"></A>
+<DT><U>Operation:</U> relational-table <B>isam-next</B> <I>column-name</I>
+<DD>The symbol <VAR>column-name</VAR> names a key field. In the list returned
+by <CODE>isam-next</CODE>, that field, or a field to its left, will be
+changed. This allows one to skip over less significant key fields.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX954"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>isam-prev</B>
+<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which
+returns the key-list identifying the highest record less than
+<VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which is stored in the relational-table;
+or false if no lower record is present.
+<P>
+
+<A NAME="IDX955"></A>
+<DT><U>Operation:</U> relational-table <B>isam-prev</B> <I>index</I>
+<DD>The symbol <VAR>column-name</VAR> names a key field. In the list returned
+by <CODE>isam-next</CODE>, that field, or a field to its left, will be
+changed. This allows one to skip over less significant key fields.
+</P>
+</DL>
+<P>
+
+For example, if a table has key fields:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(col1 col2)
+(9 5)
+(9 6)
+(9 7)
+(9 8)
+(12 5)
+(12 6)
+(12 7)
+</pre></td></tr></table><P>
+
+Then:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((table 'isam-next) '(9 5)) => (9 6)
+((table 'isam-next 'col2) '(9 5)) => (9 6)
+((table 'isam-next 'col1) '(9 5)) => (12 5)
+((table 'isam-prev) '(12 7)) => (12 6)
+((table 'isam-prev 'col2) '(12 7)) => (12 6)
+((table 'isam-prev 'col1) '(12 7)) => (9 8)
+</pre></td></tr></table><P>
+
+<A NAME="Table Administration"></A>
+<HR SIZE="6">
+<A NAME="SEC153"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC152"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC154"> &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_6.html#SEC147"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.2.6 Table Administration </H4>
+<!--docid::SEC153::-->
+<P>
+
+<A NAME="IDX956"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>column-names</B>
+<DD><A NAME="IDX957"></A>
+<DT><U>Operation:</U> relational-table <B>column-foreigns</B>
+<DD><A NAME="IDX958"></A>
+<DT><U>Operation:</U> relational-table <B>column-domains</B>
+<DD><A NAME="IDX959"></A>
+<DT><U>Operation:</U> relational-table <B>column-types</B>
+<DD>Return a list of the column names, foreign-key table names, domain
+names, or type names respectively for this table. These 4 methods are
+different from the others in that the list is returned, rather than a
+procedure to obtain the list.
+<P>
+
+<A NAME="IDX960"></A>
+<DT><U>Operation:</U> relational-table <B>primary-limit</B>
+<DD>Returns the number of primary keys fields in the relations in this
+table.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX961"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-table <B>close-table</B>
+<DD>Subsequent operations to this table will signal an error.
+</DL>
+<P>
+
+<A NAME="Database Interpolation"></A>
+<HR SIZE="6">
+<A NAME="SEC154"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC153"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> &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_6.html#SEC141"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.3 Database Interpolation </H3>
+<!--docid::SEC154::-->
+<P>
+
+<CODE>(require 'database-interpolate)</CODE>
+</P>
+<P>
+
+Indexed sequential access methods allow finding the keys (having
+associations) closest to a given value. This facilitates the
+interpolation of associations between those in the table.
+</P>
+<P>
+
+<A NAME="IDX962"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>interpolate-from-table</B> <I>table column</I>
+<DD><VAR>Table</VAR> should be a relational table with one numeric primary key
+field which supports the <CODE>isam-prev</CODE> and <CODE>isam-next</CODE>
+operations. <VAR>column</VAR> should be a symbol or exact positive integer
+designating a numerically valued column of <VAR>table</VAR>.
+<P>
+
+<CODE>interpolate-from-table</CODE> calculates and returns a value
+proportionally intermediate between its values in the next and
+previous key records contained in <VAR>table</VAR>. For keys larger than
+all the stored keys the value associated with the largest stored key
+is used. For keys smaller than all the stored keys the value
+associated with the smallest stored key is used.
+</P>
+</DL>
+<P>
+
+<A NAME="Embedded Commands"></A>
+<HR SIZE="6">
+<A NAME="SEC155"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC154"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC156"> &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_6.html#SEC141"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.4 Embedded Commands </H3>
+<!--docid::SEC155::-->
+<P>
+
+<CODE>(require 'database-commands)</CODE>
+</P>
+<P>
+
+This enhancement wraps a utility layer on <CODE>relational-database</CODE>
+which provides:
+</P>
+<P>
+
+<UL>
+<LI>
+Automatic execution of initialization commands stored in database.
+<LI>
+Transparent execution of database commands stored in <CODE>*commands*</CODE>
+table in database.
+</UL>
+<P>
+
+When an enhanced relational-database is called with a symbol which
+matches a <VAR>name</VAR> in the <CODE>*commands*</CODE> table, the associated
+procedure expression is evaluated and applied to the enhanced
+relational-database. A procedure should then be returned which the user
+can invoke on (optional) arguments.
+</P>
+<P>
+
+The command <CODE>*initialize*</CODE> is special. If present in the
+<CODE>*commands*</CODE> table, <CODE>open-database</CODE> or <CODE>open-database!</CODE>
+will return the value of the <CODE>*initialize*</CODE> command. Notice that
+arbitrary code can be run when the <CODE>*initialize*</CODE> procedure is
+automatically applied to the enhanced relational-database.
+</P>
+<P>
+
+Note also that if you wish to shadow or hide from the user
+relational-database methods described in <A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A>, this
+can be done by a dispatch in the closure returned by the
+<CODE>*initialize*</CODE> expression rather than by entries in the
+<CODE>*commands*</CODE> table if it is desired that the underlying methods
+remain accessible to code in the <CODE>*commands*</CODE> table.
+</P>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC158">6.1.4.3 Define-tables Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC159">6.1.4.4 The *commands* Table</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC160">6.1.4.5 Command Service</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Database Extension"></A>
+<HR SIZE="6">
+<A NAME="SEC156"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC157"> &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_6.html#SEC155"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.4.1 Database Extension </H4>
+<!--docid::SEC156::-->
+<P>
+
+<A NAME="IDX963"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>wrap-command-interface</B> <I>rdb</I>
+<DD>Returns relational database <VAR>rdb</VAR> wrapped with additional commands
+defined in its *commands* table.
+</DL>
+<P>
+
+<A NAME="IDX964"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>add-command-tables</B> <I>rdb</I>
+<DD>The relational database <VAR>rdb</VAR> must be mutable.
+<VAR>add-command-tables</VAR> adds a *command* table to <VAR>rdb</VAR>; then
+returns <CODE>(wrap-command-interface <VAR>rdb</VAR>)</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX965"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>define-*commands*</B> <I>rdb spec-0 <small>...</small></I>
+<DD><P>
+
+Adds commands to the <CODE>*commands*</CODE> table as specified in
+<VAR>spec-0</VAR> <small>...</small> to the open relational-database <VAR>rdb</VAR>. Each
+<VAR>spec</VAR> has the form:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((&lt;name&gt; &lt;rdb&gt;) &quot;comment&quot; &lt;expression1&gt; &lt;expression2&gt; <small>...</small>)
+</pre></td></tr></table>or
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((&lt;name&gt; &lt;rdb&gt;) &lt;expression1&gt; &lt;expression2&gt; <small>...</small>)
+</pre></td></tr></table><P>
+
+where &lt;name&gt; is the command name, &lt;rdb&gt; is a formal passed the
+calling relational database, &quot;comment&quot; describes the
+command, and &lt;expression1&gt;, &lt;expression1&gt;, <small>...</small> are the
+body of the procedure.
+</P>
+<P>
+
+<CODE>define-*commands*</CODE> adds to the <CODE>*commands*</CODE> table a command
+&lt;name&gt;:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(lambda (&lt;name&gt; &lt;rdb&gt;) &lt;expression1&gt; &lt;expression2&gt; <small>...</small>)
+</pre></td></tr></table><P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX966"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>open-command-database</B> <I>filename</I>
+<DD><A NAME="IDX967"></A>
+<DT><U>Function:</U> <B>open-command-database</B> <I>filename base-table-type</I>
+<DD>Returns an open enhanced relational database associated with
+<VAR>filename</VAR>. The database will be opened with base-table type
+<VAR>base-table-type</VAR>) if supplied. If <VAR>base-table-type</VAR> is not
+supplied, <CODE>open-command-database</CODE> will attempt to deduce the correct
+base-table-type. If the database can not be opened or if it lacks the
+<CODE>*commands*</CODE> table, <CODE>#f</CODE> is returned.
+<P>
+
+<A NAME="IDX968"></A>
+<DT><U>Function:</U> <B>open-command-database!</B> <I>filename</I>
+<DD><A NAME="IDX969"></A>
+<DT><U>Function:</U> <B>open-command-database!</B> <I>filename base-table-type</I>
+<DD>Returns <EM>mutable</EM> open enhanced relational database <small>...</small>
+</P>
+<P>
+
+<A NAME="IDX970"></A>
+<DT><U>Function:</U> <B>open-command-database</B> <I>database</I>
+<DD>Returns <VAR>database</VAR> if it is an immutable relational database; #f
+otherwise.
+</P>
+<P>
+
+<A NAME="IDX971"></A>
+<DT><U>Function:</U> <B>open-command-database!</B> <I>database</I>
+<DD>Returns <VAR>database</VAR> if it is a mutable relational database; #f
+otherwise.
+</P>
+</DL>
+<P>
+
+<A NAME="Command Intrinsics"></A>
+<HR SIZE="6">
+<A NAME="SEC157"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC156"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC158"> &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_6.html#SEC155"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.4.2 Command Intrinsics </H4>
+<!--docid::SEC157::-->
+<P>
+
+Some commands are defined in all extended relational-databases. The are
+called just like <A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A>.
+</P>
+<P>
+
+<A NAME="IDX972"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>add-domain</B> <I>domain-row</I>
+<DD>Adds <VAR>domain-row</VAR> to the <EM>domains</EM> table if there is no row in
+the domains table associated with key <CODE>(car <VAR>domain-row</VAR>)</CODE> and
+returns <CODE>#t</CODE>. Otherwise returns <CODE>#f</CODE>.
+<P>
+
+For the fields and layout of the domain table, See section <A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A>. Currently, these fields are
+<UL>
+<LI>
+domain-name
+<LI>
+foreign-table
+<LI>
+domain-integrity-rule
+<LI>
+type-id
+<LI>
+type-param
+</UL>
+<P>
+
+The following example adds 3 domains to the `<SAMP>build</SAMP>' database.
+`<SAMP>Optstring</SAMP>' is either a string or <CODE>#f</CODE>. <CODE>filename</CODE> is a
+string and <CODE>build-whats</CODE> is a symbol.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(for-each (build 'add-domain)
+ '((optstring #f
+ (lambda (x) (or (not x) (string? x)))
+ string
+ #f)
+ (filename #f #f string #f)
+ (build-whats #f #f symbol #f)))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX973"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>delete-domain</B> <I>domain-name</I>
+<DD>Removes and returns the <VAR>domain-name</VAR> row from the <EM>domains</EM>
+table.
+</DL>
+<P>
+
+<A NAME="IDX974"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>domain-checker</B> <I>domain</I>
+<DD>Returns a procedure to check an argument for conformance to domain
+<VAR>domain</VAR>.
+</DL>
+<P>
+
+<A NAME="Define-tables Example"></A>
+<HR SIZE="6">
+<A NAME="SEC158"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC157"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC159"> &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_6.html#SEC155"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.4.3 Define-tables Example </H4>
+<!--docid::SEC158::-->
+<P>
+
+The following example shows a new database with the name of
+`<TT>foo.db</TT>' being created with tables describing processor families
+and processor/os/compiler combinations. The database is then
+solidified; saved and changed to immutable.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'databases)
+<A NAME="IDX975"></A>(define my-rdb (create-database &quot;foo.db&quot; 'alist-table))
+(define-tables my-rdb
+ '(processor-family
+ ((family atom))
+ ((also-ran processor-family))
+ ((m68000 #f)
+ (m68030 m68000)
+ (i386 i8086)
+ (i8086 #f)
+ (powerpc #f)))
+
+ '(platform
+ ((name symbol))
+ ((processor processor-family)
+ (os symbol)
+ (compiler symbol))
+ ((aix powerpc aix -)
+ (amiga-dice-c m68000 amiga dice-c)
+ (amiga-aztec m68000 amiga aztec)
+ (amiga-sas/c-5.10 m68000 amiga sas/c)
+ (atari-st-gcc m68000 atari gcc)
+ (atari-st-turbo-c m68000 atari turbo-c)
+ (borland-c-3.1 i8086 ms-dos borland-c)
+ (djgpp i386 ms-dos gcc)
+ (linux i386 linux gcc)
+ (microsoft-c i8086 ms-dos microsoft-c)
+ (os/2-emx i386 os/2 gcc)
+ (turbo-c-2 i8086 ms-dos turbo-c)
+ (watcom-9.0 i386 ms-dos watcom))))
+
+(solidify-database my-rdb)
+</pre></td></tr></table><P>
+
+<A NAME="The *commands* Table"></A>
+<HR SIZE="6">
+<A NAME="SEC159"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC158"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC160"> &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_6.html#SEC155"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.4.4 The *commands* Table </H4>
+<!--docid::SEC159::-->
+<P>
+
+The table <CODE>*commands*</CODE> in an <EM>enhanced</EM> relational-database has
+the fields (with domains):
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>PRI name symbol
+ parameters parameter-list
+ procedure expression
+ documentation string
+</pre></td></tr></table><P>
+
+The <CODE>parameters</CODE> field is a foreign key (domain
+<CODE>parameter-list</CODE>) of the <CODE>*catalog-data*</CODE> table and should
+have the value of a table described by <CODE>*parameter-columns*</CODE>. This
+<CODE>parameter-list</CODE> table describes the arguments suitable for passing
+to the associated command. The intent of this table is to be of a form
+such that different user-interfaces (for instance, pull-down menus or
+plain-text queries) can operate from the same table. A
+<CODE>parameter-list</CODE> table has the following fields:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>PRI index ordinal
+ name symbol
+ arity parameter-arity
+ domain domain
+ defaulter expression
+ expander expression
+ documentation string
+</pre></td></tr></table><P>
+
+The <CODE>arity</CODE> field can take the values:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>single</CODE>
+<DD>Requires a single parameter of the specified domain.
+<DT><CODE>optional</CODE>
+<DD>A single parameter of the specified domain or zero parameters is
+acceptable.
+<DT><CODE>boolean</CODE>
+<DD>A single boolean parameter or zero parameters (in which case <CODE>#f</CODE>
+is substituted) is acceptable.
+<DT><CODE>nary</CODE>
+<DD>Any number of parameters of the specified domain are acceptable. The
+argument passed to the command function is always a list of the
+parameters.
+<DT><CODE>nary1</CODE>
+<DD>One or more of parameters of the specified domain are acceptable. The
+argument passed to the command function is always a list of the
+parameters.
+</DL>
+<P>
+
+The <CODE>domain</CODE> field specifies the domain which a parameter or
+parameters in the <CODE>index</CODE>th field must satisfy.
+</P>
+<P>
+
+The <CODE>defaulter</CODE> field is an expression whose value is either
+<CODE>#f</CODE> or a procedure of one argument (the parameter-list) which
+returns a <EM>list</EM> of the default value or values as appropriate.
+Note that since the <CODE>defaulter</CODE> procedure is called every time a
+default parameter is needed for this column, <EM>sticky</EM> defaults can
+be implemented using shared state with the domain-integrity-rule.
+</P>
+<P>
+
+<A NAME="Command Service"></A>
+<HR SIZE="6">
+<A NAME="SEC160"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC159"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC161"> &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_6.html#SEC155"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.4.5 Command Service </H4>
+<!--docid::SEC160::-->
+<P>
+
+<A NAME="IDX976"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-command-server</B> <I>rdb table-name</I>
+<DD>Returns a procedure of 2 arguments, a (symbol) command and a call-back
+procedure. When this returned procedure is called, it looks up
+<VAR>command</VAR> in table <VAR>table-name</VAR> and calls the call-back
+procedure with arguments:
+<DL COMPACT>
+<DT><VAR>command</VAR>
+<DD>The <VAR>command</VAR>
+<DT><VAR>command-value</VAR>
+<DD>The result of evaluating the expression in the <VAR>procedure</VAR> field of
+<VAR>table-name</VAR> and calling it with <VAR>rdb</VAR>.
+<DT><VAR>parameter-name</VAR>
+<DD>A list of the <EM>official</EM> name of each parameter. Corresponds to the
+<CODE>name</CODE> field of the <VAR>command</VAR>'s parameter-table.
+<DT><VAR>positions</VAR>
+<DD>A list of the positive integer index of each parameter. Corresponds to
+the <CODE>index</CODE> field of the <VAR>command</VAR>'s parameter-table.
+<DT><VAR>arities</VAR>
+<DD>A list of the arities of each parameter. Corresponds to the
+<CODE>arity</CODE> field of the <VAR>command</VAR>'s parameter-table. For a
+description of <CODE>arity</CODE> see table above.
+<DT><VAR>types</VAR>
+<DD>A list of the type name of each parameter. Correspnds to the
+<CODE>type-id</CODE> field of the contents of the <CODE>domain</CODE> of the
+<VAR>command</VAR>'s parameter-table.
+<DT><VAR>defaulters</VAR>
+<DD>A list of the defaulters for each parameter. Corresponds to
+the <CODE>defaulters</CODE> field of the <VAR>command</VAR>'s parameter-table.
+<DT><VAR>domain-integrity-rules</VAR>
+<DD>A list of procedures (one for each parameter) which tests whether a
+value for a parameter is acceptable for that parameter. The procedure
+should be called with each datum in the list for <CODE>nary</CODE> arity
+parameters.
+<DT><VAR>aliases</VAR>
+<DD>A list of lists of <CODE>(alias parameter-name)</CODE>. There can be
+more than one alias per <VAR>parameter-name</VAR>.
+</DL>
+</DL>
+<P>
+
+For information about parameters, See section <A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A>.
+</P>
+<P>
+
+<A NAME="Command Example"></A>
+<HR SIZE="6">
+<A NAME="SEC161"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC160"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC162"> &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_6.html#SEC155"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.4.6 Command Example </H4>
+<!--docid::SEC161::-->
+<P>
+
+Here is an example of setting up a command with arguments and parsing
+those arguments from a <CODE>getopt</CODE> style argument list
+(see section <A HREF="slib_4.html#SEC62">4.4.1 Getopt</A>).
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'database-commands)
+<A NAME="IDX977"></A>(require 'databases)
+<A NAME="IDX978"></A>(require 'getopt-parameters)
+<A NAME="IDX979"></A>(require 'parameters)
+<A NAME="IDX980"></A>(require 'getopt)
+<A NAME="IDX981"></A>(require 'fluid-let)
+(require 'printf)
+
+(define my-rdb (add-command-tables (create-database #f 'alist-table)))
+
+(define-tables my-rdb
+ '(foo-params
+ *parameter-columns*
+ *parameter-columns*
+ ((1 single-string single string
+ (lambda (pl) '(&quot;str&quot;)) #f &quot;single string&quot;)
+ (2 nary-symbols nary symbol
+ (lambda (pl) '()) #f &quot;zero or more symbols&quot;)
+ (3 nary1-symbols nary1 symbol
+ (lambda (pl) '(symb)) #f &quot;one or more symbols&quot;)
+ (4 optional-number optional ordinal
+ (lambda (pl) '()) #f &quot;zero or one number&quot;)
+ (5 flag boolean boolean
+ (lambda (pl) '(#f)) #f &quot;a boolean flag&quot;)))
+ '(foo-pnames
+ ((name string))
+ ((parameter-index ordinal))
+ ((&quot;s&quot; 1)
+ (&quot;single-string&quot; 1)
+ (&quot;n&quot; 2)
+ (&quot;nary-symbols&quot; 2)
+ (&quot;N&quot; 3)
+ (&quot;nary1-symbols&quot; 3)
+ (&quot;o&quot; 4)
+ (&quot;optional-number&quot; 4)
+ (&quot;f&quot; 5)
+ (&quot;flag&quot; 5)))
+ '(my-commands
+ ((name symbol))
+ ((parameters parameter-list)
+ (parameter-names parameter-name-translation)
+ (procedure expression)
+ (documentation string))
+ ((foo
+ foo-params
+ foo-pnames
+ (lambda (rdb) (lambda args (print args)))
+ &quot;test command arguments&quot;))))
+
+(define (dbutil:serve-command-line rdb command-table command argv)
+ (set! *argv* (if (vector? argv) (vector-&gt;list argv) argv))
+ ((make-command-server rdb command-table)
+ command
+ (lambda (comname comval options positions
+ arities types defaulters dirs aliases)
+ (apply comval (getopt-&gt;arglist options positions
+ arities types defaulters dirs aliases)))))
+
+(define (cmd . opts)
+ (fluid-let ((*optind* 1))
+ (printf &quot;%-34s => &quot;
+ (call-with-output-string
+ (lambda (pt) (write (cons 'cmd opts) pt))))
+ (set! opts (cons &quot;cmd&quot; opts))
+ (force-output)
+ (dbutil:serve-command-line
+ my-rdb 'my-commands 'foo (length opts) opts)))
+
+(cmd) => (&quot;str&quot; () (symb) () #f)
+(cmd &quot;-f&quot;) => (&quot;str&quot; () (symb) () #t)
+(cmd &quot;--flag&quot;) => (&quot;str&quot; () (symb) () #t)
+(cmd &quot;-o177&quot;) => (&quot;str&quot; () (symb) (177) #f)
+(cmd &quot;-o&quot; &quot;177&quot;) => (&quot;str&quot; () (symb) (177) #f)
+(cmd &quot;--optional&quot; &quot;621&quot;) => (&quot;str&quot; () (symb) (621) #f)
+(cmd &quot;--optional=621&quot;) => (&quot;str&quot; () (symb) (621) #f)
+(cmd &quot;-s&quot; &quot;speciality&quot;) => (&quot;speciality&quot; () (symb) () #f)
+(cmd &quot;-sspeciality&quot;) => (&quot;speciality&quot; () (symb) () #f)
+(cmd &quot;--single&quot; &quot;serendipity&quot;) => (&quot;serendipity&quot; () (symb) () #f)
+(cmd &quot;--single=serendipity&quot;) => (&quot;serendipity&quot; () (symb) () #f)
+(cmd &quot;-n&quot; &quot;gravity&quot; &quot;piety&quot;) => (&quot;str&quot; () (piety gravity) () #f)
+(cmd &quot;-ngravity&quot; &quot;piety&quot;) => (&quot;str&quot; () (piety gravity) () #f)
+(cmd &quot;--nary&quot; &quot;chastity&quot;) => (&quot;str&quot; () (chastity) () #f)
+(cmd &quot;--nary=chastity&quot; &quot;&quot;) => (&quot;str&quot; () ( chastity) () #f)
+(cmd &quot;-N&quot; &quot;calamity&quot;) => (&quot;str&quot; () (calamity) () #f)
+(cmd &quot;-Ncalamity&quot;) => (&quot;str&quot; () (calamity) () #f)
+(cmd &quot;--nary1&quot; &quot;surety&quot;) => (&quot;str&quot; () (surety) () #f)
+(cmd &quot;--nary1=surety&quot;) => (&quot;str&quot; () (surety) () #f)
+(cmd &quot;-N&quot; &quot;levity&quot; &quot;fealty&quot;) => (&quot;str&quot; () (fealty levity) () #f)
+(cmd &quot;-Nlevity&quot; &quot;fealty&quot;) => (&quot;str&quot; () (fealty levity) () #f)
+(cmd &quot;--nary1&quot; &quot;surety&quot; &quot;brevity&quot;) => (&quot;str&quot; () (brevity surety) () #f)
+(cmd &quot;--nary1=surety&quot; &quot;brevity&quot;) => (&quot;str&quot; () (brevity surety) () #f)
+(cmd &quot;-?&quot;)
+-|
+Usage: cmd [OPTION ARGUMENT ...] ...
+
+ -f, --flag
+ -o, --optional[=]&lt;number&gt;
+ -n, --nary[=]&lt;symbols&gt; ...
+ -N, --nary1[=]&lt;symbols&gt; ...
+ -s, --single[=]&lt;string&gt;
+
+ERROR: getopt-&gt;parameter-list &quot;unrecognized option&quot; &quot;-?&quot;
+</pre></td></tr></table><P>
+
+<A NAME="Database Macros"></A>
+<HR SIZE="6">
+<A NAME="SEC162"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC161"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC163"> &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_6.html#SEC141"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.5 Database Macros </H3>
+<!--docid::SEC162::-->
+<P>
+
+<CODE>(require 'within-database)</CODE>
+</P>
+<P>
+
+The object-oriented programming interface to SLIB relational databases
+has failed to support clear, understandable, and modular code-writing
+for database applications.
+</P>
+<P>
+
+This seems to be a failure of the object-oriented paradigm where the
+type of an object is not manifest (or even traceable) in source code.
+</P>
+<P>
+
+<CODE>within-database</CODE>, along with the `<SAMP>databases</SAMP>' package,
+reorganizes high-level database functions toward a more declarative
+style. Using this package, one can tag database table and command
+declarations for emacs:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>etags -lscheme -r'/ *(define-\(command\|table\) (\([^; \t]+\)/\2/' \
+ source1.scm ...
+</pre></td></tr></table><P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC163">6.1.5.1 Within-database Example</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="IDX982"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>within-database</B> <I>database statement-1 <small>...</small></I>
+<DD><P>
+
+<CODE>within-database</CODE> creates a lexical scope in which the commands
+<CODE>define-table</CODE> and <CODE>define-command</CODE> create tables and
+<CODE>*commands*</CODE>-table entries respectively in open relational
+database <VAR>database</VAR>.
+</P>
+<P>
+
+<CODE>within-database</CODE> Returns <VAR>database</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX983"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>define-command</B> <I>(&lt;name&gt; &lt;rdb&gt;) &quot;comment&quot; &lt;expression1&gt; &lt;expression2&gt; <small>...</small></I>
+<DD><A NAME="IDX984"></A>
+<DT><U>Syntax:</U> <B>define-command</B> <I>(&lt;name&gt; &lt;rdb&gt;) &lt;expression1&gt; &lt;expression2&gt; <small>...</small></I>
+<DD><P>
+
+Adds to the <CODE>*commands*</CODE> table a command
+&lt;name&gt;:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(lambda (&lt;name&gt; &lt;rdb&gt;) &lt;expression1&gt; &lt;expression2&gt; <small>...</small>)
+</pre></td></tr></table><P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX985"></A>
+</P>
+<DL>
+<DT><U>Syntax:</U> <B>define-table</B> <I>&lt;name&gt; &lt;descriptor-name&gt; &lt;descriptor-name&gt; &lt;rows&gt;</I>
+<DD><A NAME="IDX986"></A>
+<DT><U>Syntax:</U> <B>define-table</B> <I>&lt;name&gt; &lt;primary-key-fields&gt; &lt;other-fields&gt; &lt;rows&gt;</I>
+<DD><P>
+
+where &lt;name&gt; is the table name, &lt;descriptor-name&gt; is the symbol
+name of a descriptor table, &lt;primary-key-fields&gt; and
+&lt;other-fields&gt; describe the primary keys and other fields
+respectively, and &lt;rows&gt; is a list of data rows to be added to the
+table.
+</P>
+<P>
+
+&lt;primary-key-fields&gt; and &lt;other-fields&gt; are lists of field
+descriptors of the form:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(&lt;column-name&gt; &lt;domain&gt;)
+</pre></td></tr></table>or
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(&lt;column-name&gt; &lt;domain&gt; &lt;column-integrity-rule&gt;)
+</pre></td></tr></table><P>
+
+where &lt;column-name&gt; is the column name, &lt;domain&gt; is the domain
+of the column, and &lt;column-integrity-rule&gt; is an expression whose
+value is a procedure of one argument (which returns <CODE>#f</CODE> to signal
+an error).
+</P>
+<P>
+
+If &lt;domain&gt; is not a defined domain name and it matches the name of
+this table or an already defined (in one of <VAR>spec-0</VAR> <small>...</small>) single
+key field table, a foreign-key domain will be created for it.
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="Within-database Example"></A>
+<HR SIZE="6">
+<A NAME="SEC163"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC162"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC164"> &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_6.html#SEC162"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.5.1 Within-database Example </H4>
+<!--docid::SEC163::-->
+<P>
+
+Here is an example of <CODE>within-database</CODE> macros:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'within-database)
+
+(define my-rdb
+ (add-command-tables
+ (create-database &quot;foo.db&quot; 'alist-table)))
+
+(within-database my-rdb
+ (define-command (*initialize* rdb)
+ &quot;Print Welcome&quot;
+ (display &quot;Welcome&quot;)
+ (newline)
+ rdb)
+ (define-command (without-documentation rdb)
+ (display &quot;without-documentation called&quot;)
+ (newline))
+ (define-table (processor-family
+ ((family atom))
+ ((also-ran processor-family)))
+ (m68000 #f)
+ (m68030 m68000)
+ (i386 i8086)
+ (i8086 #f)
+ (powerpc #f))
+ (define-table (platform
+ ((name symbol))
+ ((processor processor-family)
+ (os symbol)
+ (compiler symbol)))
+ (aix powerpc aix -)
+ ;; ...
+ (amiga-aztec m68000 amiga aztec)
+ (amiga-sas/c-5.10 m68000 amiga sas/c)
+ (atari-st-gcc m68000 atari gcc)
+ ;; ...
+ (watcom-9.0 i386 ms-dos watcom))
+ (define-command (get-processor rdb)
+ &quot;Get processor for given platform.&quot;
+ (((rdb 'open-table) 'platform #f) 'get 'processor)))
+
+(close-database my-rdb)
+
+(set! my-rdb (open-command-database! &quot;foo.db&quot;))
+-|
+Welcome
+
+(my-rdb 'without-documentation)
+-|
+without-documentation called
+
+((my-rdb 'get-processor) 'amiga-sas/c-5.10)
+=> m68000
+
+(close-database my-rdb)
+</pre></td></tr></table><P>
+
+<A NAME="Database Browser"></A>
+<HR SIZE="6">
+<A NAME="SEC164"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC163"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC165"> &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_6.html#SEC141"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.1.6 Database Browser </H3>
+<!--docid::SEC164::-->
+<P>
+
+(require 'database-browse)
+</P>
+<P>
+
+<A NAME="IDX987"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>browse</B> <I>database</I>
+<DD><P>
+
+Prints the names of all the tables in <VAR>database</VAR> and sets browse's
+default to <VAR>database</VAR>.
+</P>
+<P>
+
+<A NAME="IDX988"></A>
+<DT><U>Procedure:</U> <B>browse</B>
+<DD></P>
+<P>
+
+Prints the names of all the tables in the default database.
+</P>
+<P>
+
+<A NAME="IDX989"></A>
+<DT><U>Procedure:</U> <B>browse</B> <I>table-name</I>
+<DD></P>
+<P>
+
+For each record of the table named by the symbol <VAR>table-name</VAR>,
+prints a line composed of all the field values.
+</P>
+<P>
+
+<A NAME="IDX990"></A>
+<DT><U>Procedure:</U> <B>browse</B> <I>pathname</I>
+<DD></P>
+<P>
+
+Opens the database named by the string <VAR>pathname</VAR>, prints the names
+of all its tables, and sets browse's default to the database.
+</P>
+<P>
+
+<A NAME="IDX991"></A>
+<DT><U>Procedure:</U> <B>browse</B> <I>database table-name</I>
+<DD></P>
+<P>
+
+Sets browse's default to <VAR>database</VAR> and prints the records of the
+table named by the symbol <VAR>table-name</VAR>.
+</P>
+<P>
+
+<A NAME="IDX992"></A>
+<DT><U>Procedure:</U> <B>browse</B> <I>pathname table-name</I>
+<DD></P>
+<P>
+
+Opens the database named by the string <VAR>pathname</VAR> and sets browse's
+default to it; <CODE>browse</CODE> prints the records of the table named by
+the symbol <VAR>table-name</VAR>.
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="Relational Infrastructure"></A>
+<HR SIZE="6">
+<A NAME="SEC165"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC164"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> &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_6.html#SEC140"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2 Relational Infrastructure </H2>
+<!--docid::SEC165::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Base Table"></A>
+<HR SIZE="6">
+<A NAME="SEC166"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC165"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC167"> &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_6.html#SEC165"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.1 Base Table </H3>
+<!--docid::SEC166::-->
+<P>
+
+<A NAME="IDX993"></A>
+A <EM>base-table</EM> is the primitive database layer upon which SLIB
+relational databases are built. At the minimum, it must support the
+types integer, symbol, string, and boolean. The base-table may restrict
+the size of integers, symbols, and strings it supports.
+</P>
+<P>
+
+A base table implementation is available as the value of the identifier
+naming it (eg. <VAR>alist-table</VAR>) after requiring the symbol of that
+name.
+</P>
+<P>
+
+<A NAME="IDX994"></A>
+</P>
+<DL>
+<DT><U>Feature:</U> <B>alist-table</B>
+<DD><CODE>(require 'alist-table)</CODE>
+<A NAME="IDX995"></A>
+<P>
+
+Association-list base tables support all Scheme types and are suitable
+for small databases. In order to be retrieved after being written to a
+file, the data stored should include only objects which are readable and
+writeable in the Scheme implementation.
+</P>
+<P>
+
+The <EM>alist-table</EM> base-table implementation is included in the
+SLIB distribution.
+</P>
+</DL>
+<P>
+
+<EM>WB</EM> is a B-tree database package with SCM interfaces. Being
+disk-based, WB databases readily store and access hundreds of
+megabytes of data. WB comes with two base-table embeddings.
+</P>
+<P>
+
+<A NAME="IDX996"></A>
+</P>
+<DL>
+<DT><U>Feature:</U> <B>wb-table</B>
+<DD><CODE>(require 'wb-table)</CODE>
+<A NAME="IDX997"></A>
+<P>
+
+<A NAME="IDX998"></A>
+<CODE>wb-table</CODE> supports scheme expressions for keys and values whose
+text representations are less than 255 characters in length.
+See section `wb-table' in <CITE>WB</CITE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX999"></A>
+</P>
+<DL>
+<DT><U>Feature:</U> <B>rwb-isam</B>
+<DD><CODE>(require 'rwb-isam)</CODE>
+<A NAME="IDX1000"></A>
+<P>
+
+<EM>rwb-isam</EM> is a sophisticated base-table implementation built on
+WB and SCM which uses binary numerical formats for key and non-key
+fields. It supports IEEE floating-point and fixed-precision integer
+keys with the correct numerical collation order.
+</P>
+</DL>
+<P>
+
+This rest of this section documents the interface for a base table
+implementation from which the <A HREF="slib_6.html#SEC141">6.1 Relational Database</A> package
+constructs a Relational system. It will be of interest primarily to
+those wishing to port or write new base-table implementations.
+</P>
+<P>
+
+<A NAME="IDX1001"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*base-table-implementations*</B>
+<DD>To support automatic dispatch for <CODE>open-database</CODE>, each base-table
+module adds an association to <VAR>*base-table-implementations*</VAR> when
+loaded. This association is the list of the base-table symbol and the
+value returned by <CODE>(make-relational-system <VAR>base-table</VAR>)</CODE>.
+</DL>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC169">6.2.1.3 Base Field Types</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="The Base"></A>
+<HR SIZE="6">
+<A NAME="SEC167"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC168"> &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_6.html#SEC166"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.1.1 The Base </H4>
+<!--docid::SEC167::-->
+<P>
+
+All of these functions are accessed through a single procedure by
+calling that procedure with the symbol name of the operation. A
+procedure will be returned if that operation is supported and <CODE>#f</CODE>
+otherwise. For example:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'alist-table)
+<A NAME="IDX1002"></A><A NAME="IDX1003"></A>(define my-base (alist-table 'make-base))
+my-base => *a procedure*
+(define foo (alist-table 'foo))
+foo => #f
+</pre></td></tr></table><P>
+
+<A NAME="IDX1004"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-base</B> <I>filename key-dimension column-types</I>
+<DD>Returns a new, open, low-level database (collection of tables)
+associated with <VAR>filename</VAR>. This returned database has an empty
+table associated with <VAR>catalog-id</VAR>. The positive integer
+<VAR>key-dimension</VAR> is the number of keys composed to make a
+<VAR>primary-key</VAR> for the catalog table. The list of symbols
+<VAR>column-types</VAR> describes the types of each column for that table.
+If the database cannot be created as specified, <CODE>#f</CODE> is returned.
+<P>
+
+Calling the <CODE>close-base</CODE> method on this database and possibly other
+operations will cause <VAR>filename</VAR> to be written to. If
+<VAR>filename</VAR> is <CODE>#f</CODE> a temporary, non-disk based database will be
+created if such can be supported by the base table implelentation.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1005"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>open-base</B> <I>filename mutable</I>
+<DD>Returns an open low-level database associated with <VAR>filename</VAR>. If
+<VAR>mutable</VAR> is <CODE>#t</CODE>, this database will have methods capable of
+effecting change to the database. If <VAR>mutable</VAR> is <CODE>#f</CODE>, only
+methods for inquiring the database will be available. If the database
+cannot be opened as specified <CODE>#f</CODE> is returned.
+<P>
+
+Calling the <CODE>close-base</CODE> (and possibly other) method on a
+<VAR>mutable</VAR> database will cause <VAR>filename</VAR> to be written to.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1006"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>write-base</B> <I>lldb filename</I>
+<DD>Causes the low-level database <VAR>lldb</VAR> to be written to
+<VAR>filename</VAR>. If the write is successful, also causes <VAR>lldb</VAR> to
+henceforth be associated with <VAR>filename</VAR>. Calling the
+<CODE>close-database</CODE> (and possibly other) method on <VAR>lldb</VAR> may
+cause <VAR>filename</VAR> to be written to. If <VAR>filename</VAR> is <CODE>#f</CODE>
+this database will be changed to a temporary, non-disk based database if
+such can be supported by the underlying base table implelentation. If
+the operations completed successfully, <CODE>#t</CODE> is returned.
+Otherwise, <CODE>#f</CODE> is returned.
+</DL>
+<P>
+
+<A NAME="IDX1007"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>sync-base</B> <I>lldb</I>
+<DD>Causes the file associated with the low-level database <VAR>lldb</VAR> to be
+updated to reflect its current state. If the associated filename is
+<CODE>#f</CODE>, no action is taken and <CODE>#f</CODE> is returned. If this
+operation completes successfully, <CODE>#t</CODE> is returned. Otherwise,
+<CODE>#f</CODE> is returned.
+</DL>
+<P>
+
+<A NAME="IDX1008"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>close-base</B> <I>lldb</I>
+<DD>Causes the low-level database <VAR>lldb</VAR> to be written to its associated
+file (if any). If the write is successful, subsequent operations to
+<VAR>lldb</VAR> will signal an error. If the operations complete
+successfully, <CODE>#t</CODE> is returned. Otherwise, <CODE>#f</CODE> is returned.
+</DL>
+<P>
+
+<A NAME="Base Tables"></A>
+<HR SIZE="6">
+<A NAME="SEC168"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC167"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC169"> &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_6.html#SEC166"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.1.2 Base Tables </H4>
+<!--docid::SEC168::-->
+<P>
+
+<A NAME="IDX1009"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-table</B> <I>lldb key-dimension column-types</I>
+<DD>Returns the ordinal <VAR>base-id</VAR> for a new base table, otherwise
+returns <CODE>#f</CODE>. The base table can then be opened using
+<CODE>(open-table <VAR>lldb</VAR> <VAR>base-id</VAR>)</CODE>. The positive integer
+<VAR>key-dimension</VAR> is the number of keys composed to make a
+<VAR>primary-key</VAR> for this table. The list of symbols
+<VAR>column-types</VAR> describes the types of each column.
+</DL>
+<P>
+
+<A NAME="IDX1010"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>open-table</B> <I>lldb base-id key-dimension column-types</I>
+<DD>Returns a <VAR>handle</VAR> for an existing base table in the low-level
+database <VAR>lldb</VAR> if that table exists and can be opened in the mode
+indicated by <VAR>mutable</VAR>, otherwise returns <CODE>#f</CODE>.
+<P>
+
+As with <CODE>make-table</CODE>, the positive integer <VAR>key-dimension</VAR> is
+the number of keys composed to make a <VAR>primary-key</VAR> for this table.
+The list of symbols <VAR>column-types</VAR> describes the types of each
+column.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1011"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>kill-table</B> <I>lldb base-id key-dimension column-types</I>
+<DD>Returns <CODE>#t</CODE> if the base table associated with <VAR>base-id</VAR> was
+removed from the low level database <VAR>lldb</VAR>, and <CODE>#f</CODE> otherwise.
+</DL>
+<P>
+
+<A NAME="IDX1012"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>catalog-id</B>
+<DD>A constant <VAR>base-id</VAR> ordinal suitable for passing as a parameter to
+<CODE>open-table</CODE>. <VAR>catalog-id</VAR> will be used as the base table for
+the system catalog.
+</DL>
+<P>
+
+<A NAME="Base Field Types"></A>
+<HR SIZE="6">
+<A NAME="SEC169"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC168"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC170"> &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_6.html#SEC166"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.1.3 Base Field Types </H4>
+<!--docid::SEC169::-->
+<P>
+
+<A NAME="IDX1013"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>supported-type?</B> <I>symbol</I>
+<DD>Returns <CODE>#t</CODE> if <VAR>symbol</VAR> names a type allowed as a column
+value by the implementation, and <CODE>#f</CODE> otherwise. At a minimum,
+an implementation must support the types <CODE>integer</CODE>,
+<CODE>ordinal</CODE>, <CODE>symbol</CODE>, <CODE>string</CODE>, and <CODE>boolean</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX1014"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>supported-key-type?</B> <I>symbol</I>
+<DD>Returns <CODE>#t</CODE> if <VAR>symbol</VAR> names a type allowed as a key value
+by the implementation, and <CODE>#f</CODE> otherwise. At a minimum, an
+implementation must support the types <CODE>ordinal</CODE>, and
+<CODE>symbol</CODE>.
+</DL>
+<P>
+
+An <EM>ordinal</EM> is an exact positive integer. The other types are
+standard Scheme.
+</P>
+<P>
+
+<A NAME="Composite Keys"></A>
+<HR SIZE="6">
+<A NAME="SEC170"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC169"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC171"> &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_6.html#SEC166"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.1.4 Composite Keys </H4>
+<!--docid::SEC170::-->
+<P>
+
+<A NAME="IDX1015"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-keyifier-1</B> <I>type</I>
+<DD>Returns a procedure which accepts a single argument which must be of
+type <VAR>type</VAR>. This returned procedure returns an object suitable for
+being a <VAR>key</VAR> argument in the functions whose descriptions follow.
+<P>
+
+Any 2 arguments of the supported type passed to the returned function
+which are not <CODE>equal?</CODE> must result in returned values which are not
+<CODE>equal?</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1016"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-list-keyifier</B> <I>key-dimension types</I>
+<DD>The list of symbols <VAR>types</VAR> must have at least <VAR>key-dimension</VAR>
+elements. Returns a procedure which accepts a list of length
+<VAR>key-dimension</VAR> and whose types must corresopond to the types named
+by <VAR>types</VAR>. This returned procedure combines the elements of its
+list argument into an object suitable for being a <VAR>key</VAR> argument in
+the functions whose descriptions follow.
+<P>
+
+Any 2 lists of supported types (which must at least include symbols and
+non-negative integers) passed to the returned function which are not
+<CODE>equal?</CODE> must result in returned values which are not
+<CODE>equal?</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1017"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-key-extractor</B> <I>key-dimension types column-number</I>
+<DD>Returns a procedure which accepts objects produced by application of the
+result of <CODE>(make-list-keyifier <VAR>key-dimension</VAR> <VAR>types</VAR>)</CODE>.
+This procedure returns a <VAR>key</VAR> which is <CODE>equal?</CODE> to the
+<VAR>column-number</VAR>th element of the list which was passed to create
+<VAR>composite-key</VAR>. The list <VAR>types</VAR> must have at least
+<VAR>key-dimension</VAR> elements.
+</DL>
+<P>
+
+<A NAME="IDX1018"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-key-&gt;list</B> <I>key-dimension types</I>
+<DD>Returns a procedure which accepts objects produced by application of
+the result of <CODE>(make-list-keyifier <VAR>key-dimension</VAR>
+<VAR>types</VAR>)</CODE>. This procedure returns a list of <VAR>key</VAR>s which are
+elementwise <CODE>equal?</CODE> to the list which was passed to create
+<VAR>composite-key</VAR>.
+</DL>
+<P>
+
+<A NAME="Base Record Operations"></A>
+<HR SIZE="6">
+<A NAME="SEC171"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC170"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC172"> &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_6.html#SEC166"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.1.5 Base Record Operations </H4>
+<!--docid::SEC171::-->
+<P>
+
+In the following functions, the <VAR>key</VAR> argument can always be assumed
+to be the value returned by a call to a <EM>keyify</EM> routine.
+</P>
+<P>
+
+<A NAME="IDX1019"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>present?</B> <I>handle key</I>
+<DD>Returns a non-<CODE>#f</CODE> value if there is a row associated with
+<VAR>key</VAR> in the table opened in <VAR>handle</VAR> and <CODE>#f</CODE> otherwise.
+</DL>
+<P>
+
+<A NAME="IDX1020"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-getter</B> <I>key-dimension types</I>
+<DD>Returns a procedure which takes arguments <VAR>handle</VAR> and <VAR>key</VAR>.
+This procedure returns a list of the non-primary values of the relation
+(in the base table opened in <VAR>handle</VAR>) whose primary key is
+<VAR>key</VAR> if it exists, and <CODE>#f</CODE> otherwise.
+</DL>
+<P>
+
+<CODE>make-getter-1</CODE> is a new operation. The relational-database
+module works with older base-table implementations by using
+<CODE>make-getter</CODE>.
+</P>
+<P>
+
+<A NAME="IDX1021"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-getter-1</B> <I>key-dimension types index</I>
+<DD>Returns a procedure which takes arguments <VAR>handle</VAR> and <VAR>key</VAR>.
+This procedure returns the value of the <VAR>index</VAR>th field (in the
+base table opened in <VAR>handle</VAR>) whose primary key is <VAR>key</VAR> if
+it exists, and <CODE>#f</CODE> otherwise.
+<P>
+
+<VAR>index</VAR> must be larger than <VAR>key-dimension</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1022"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-putter</B> <I>key-dimension types</I>
+<DD>Returns a procedure which takes arguments <VAR>handle</VAR> and <VAR>key</VAR> and
+<VAR>value-list</VAR>. This procedure associates the primary key <VAR>key</VAR>
+with the values in <VAR>value-list</VAR> (in the base table opened in
+<VAR>handle</VAR>) and returns an unspecified value.
+</DL>
+<P>
+
+<A NAME="IDX1023"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>delete</B> <I>handle key</I>
+<DD>Removes the row associated with <VAR>key</VAR> from the table opened in
+<VAR>handle</VAR>. An unspecified value is returned.
+</DL>
+<P>
+
+<A NAME="Match Keys"></A>
+<HR SIZE="6">
+<A NAME="SEC172"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC171"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC173"> &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_6.html#SEC166"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.1.6 Match Keys </H4>
+<!--docid::SEC172::-->
+<P>
+
+<A NAME="IDX1024"></A>
+<A NAME="IDX1025"></A>
+<A NAME="IDX1026"></A>
+A <VAR>match-keys</VAR> argument is a list of length equal to
+the number of primary keys. The <VAR>match-keys</VAR> restrict the actions
+of the table command to those records whose primary keys all satisfy the
+corresponding element of the <VAR>match-keys</VAR> list. The elements and
+their actions are:
+</P>
+<P>
+
+<BLOCKQUOTE>
+<DL COMPACT>
+<DT><CODE>#f</CODE>
+<DD>The false value matches any key in the corresponding position.
+<DT>an object of type procedure
+<DD>This procedure must take a single argument, the key in the corresponding
+position. Any key for which the procedure returns a non-false value is
+a match; Any key for which the procedure returns a <CODE>#f</CODE> is not.
+<DT>other values
+<DD>Any other value matches only those keys <CODE>equal?</CODE> to it.
+</DL>
+</BLOCKQUOTE>
+<P>
+
+<A NAME="Aggregate Base Operations"></A>
+<HR SIZE="6">
+<A NAME="SEC173"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC172"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC174"> &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_6.html#SEC166"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.1.7 Aggregate Base Operations </H4>
+<!--docid::SEC173::-->
+<P>
+
+The <VAR>key-dimension</VAR> and <VAR>column-types</VAR> arguments are needed to
+decode the composite-keys for matching with <VAR>match-keys</VAR>.
+</P>
+<P>
+
+<A NAME="IDX1027"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>delete*</B> <I>handle key-dimension column-types match-keys</I>
+<DD>Removes all rows which satisfy <VAR>match-keys</VAR> from the table opened in
+<VAR>handle</VAR>. An unspecified value is returned.
+</DL>
+<P>
+
+<A NAME="IDX1028"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>for-each-key</B> <I>handle procedure key-dimension column-types match-keys</I>
+<DD>Calls <VAR>procedure</VAR> once with each <VAR>key</VAR> in the table opened in
+<VAR>handle</VAR> which satisfy <VAR>match-keys</VAR> in an unspecified order.
+An unspecified value is returned.
+</DL>
+<P>
+
+<A NAME="IDX1029"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>map-key</B> <I>handle procedure key-dimension column-types match-keys</I>
+<DD>Returns a list of the values returned by calling <VAR>procedure</VAR> once
+with each <VAR>key</VAR> in the table opened in <VAR>handle</VAR> which satisfy
+<VAR>match-keys</VAR> in an unspecified order.
+</DL>
+<P>
+
+<A NAME="Base ISAM Operations"></A>
+<HR SIZE="6">
+<A NAME="SEC174"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC173"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC175"> &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_6.html#SEC166"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.1.8 Base ISAM Operations </H4>
+<!--docid::SEC174::-->
+<P>
+
+These operations are optional for a Base-Table implementation.
+</P>
+<P>
+
+<A NAME="IDX1030"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>ordered-for-each-key</B> <I>handle procedure key-dimension column-types match-keys</I>
+<DD>Calls <VAR>procedure</VAR> once with each <VAR>key</VAR> in the table opened in
+<VAR>handle</VAR> which satisfy <VAR>match-keys</VAR> in the natural order for
+the types of the primary key fields of that table. An unspecified value
+is returned.
+</DL>
+<P>
+
+<A NAME="IDX1031"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-nexter</B> <I>handle key-dimension column-types index</I>
+<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which
+returns the key-list identifying the lowest record higher than
+<VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which is stored in the base-table and
+which differs in column <VAR>index</VAR> or a lower indexed key; or false
+if no higher record is present.
+</DL>
+<P>
+
+<A NAME="IDX1032"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> base-table <B>make-prever</B> <I>handle key-dimension column-types index</I>
+<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which
+returns the key-list identifying the highest record less than
+<VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which is stored in the base-table and
+which differs in column <VAR>index</VAR> or a lower indexed key; or false
+if no higher record is present.
+</DL>
+<P>
+
+<A NAME="Catalog Representation"></A>
+<HR SIZE="6">
+<A NAME="SEC175"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC174"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC176"> &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_6.html#SEC165"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.2 Catalog Representation </H3>
+<!--docid::SEC175::-->
+<P>
+
+Each database (in an implementation) has a <EM>system catalog</EM> which
+describes all the user accessible tables in that database (including
+itself).
+</P>
+<P>
+
+The system catalog base table has the following fields. <CODE>PRI</CODE>
+indicates a primary key for that table.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>PRI table-name
+ column-limit the highest column number
+ coltab-name descriptor table name
+ bastab-id data base table identifier
+ user-integrity-rule
+ view-procedure A scheme thunk which, when called,
+ produces a handle for the view. coltab
+ and bastab are specified if and only if
+ view-procedure is not.
+</pre></td></tr></table><P>
+
+Descriptors for base tables (not views) are tables (pointed to by
+system catalog). Descriptor (base) tables have the fields:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>PRI column-number sequential integers from 1
+ primary-key? boolean TRUE for primary key components
+ column-name
+ column-integrity-rule
+ domain-name
+</pre></td></tr></table><P>
+
+A <EM>primary key</EM> is any column marked as <CODE>primary-key?</CODE> in the
+corresponding descriptor table. All the <CODE>primary-key?</CODE> columns
+must have lower column numbers than any non-<CODE>primary-key?</CODE> columns.
+Every table must have at least one primary key. Primary keys must be
+sufficient to distinguish all rows from each other in the table. All of
+the system defined tables have a single primary key.
+</P>
+<P>
+
+A <EM>domain</EM> is a category describing the allowable values to occur in
+a column. It is described by a (base) table with the fields:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>PRI domain-name
+ foreign-table
+ domain-integrity-rule
+ type-id
+ type-param
+</pre></td></tr></table><P>
+
+The <EM>type-id</EM> field value is a symbol. This symbol may be used by
+the underlying base table implementation in storing that field.
+</P>
+<P>
+
+If the <CODE>foreign-table</CODE> field is non-<CODE>#f</CODE> then that field names
+a table from the catalog. The values for that domain must match a
+primary key of the table referenced by the <VAR>type-param</VAR> (or
+<CODE>#f</CODE>, if allowed). This package currently does not support
+composite foreign-keys.
+</P>
+<P>
+
+The types for which support is planned are:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre> atom
+ symbol
+ string [&lt;length&gt;]
+ number [&lt;base&gt;]
+ money &lt;currency&gt;
+ date-time
+ boolean
+
+ foreign-key &lt;table-name&gt;
+ expression
+ virtual &lt;expression&gt;
+</pre></td></tr></table><P>
+
+<A NAME="Relational Database Objects"></A>
+<HR SIZE="6">
+<A NAME="SEC176"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC175"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC177"> &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_6.html#SEC165"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.3 Relational Database Objects </H3>
+<!--docid::SEC176::-->
+<P>
+
+This object-oriented interface is deprecated for typical database
+applications; <A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A> provides an application programmer
+interface which is easier to understand and use.
+</P>
+<P>
+
+<A NAME="IDX1033"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-relational-system</B> <I>base-table-implementation</I>
+<DD><P>
+
+Returns a procedure implementing a relational database using the
+<VAR>base-table-implementation</VAR>.
+</P>
+<P>
+
+All of the operations of a base table implementation are accessed
+through a procedure defined by <CODE>require</CODE>ing that implementation.
+Similarly, all of the operations of the relational database
+implementation are accessed through the procedure returned by
+<CODE>make-relational-system</CODE>. For instance, a new relational database
+could be created from the procedure returned by
+<CODE>make-relational-system</CODE> by:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'alist-table)
+<A NAME="IDX1034"></A>(define relational-alist-system
+ (make-relational-system alist-table))
+(define create-alist-database
+ (relational-alist-system 'create-database))
+(define my-database
+ (create-alist-database &quot;mydata.db&quot;))
+</pre></td></tr></table></DL>
+<P>
+
+What follows are the descriptions of the methods available from
+relational system returned by a call to <CODE>make-relational-system</CODE>.
+</P>
+<P>
+
+<A NAME="IDX1035"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-system <B>create-database</B> <I>filename</I>
+<DD><P>
+
+Returns an open, nearly empty relational database associated with
+<VAR>filename</VAR>. The only tables defined are the system catalog and
+domain table. Calling the <CODE>close-database</CODE> method on this database
+and possibly other operations will cause <VAR>filename</VAR> to be written
+to. If <VAR>filename</VAR> is <CODE>#f</CODE> a temporary, non-disk based database
+will be created if such can be supported by the underlying base table
+implelentation. If the database cannot be created as specified
+<CODE>#f</CODE> is returned. For the fields and layout of descriptor tables,
+<A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A>
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1036"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-system <B>open-database</B> <I>filename mutable?</I>
+<DD><P>
+
+Returns an open relational database associated with <VAR>filename</VAR>. If
+<VAR>mutable?</VAR> is <CODE>#t</CODE>, this database will have methods capable of
+effecting change to the database. If <VAR>mutable?</VAR> is <CODE>#f</CODE>, only
+methods for inquiring the database will be available. Calling the
+<CODE>close-database</CODE> (and possibly other) method on a <VAR>mutable?</VAR>
+database will cause <VAR>filename</VAR> to be written to. If the database
+cannot be opened as specified <CODE>#f</CODE> is returned.
+</P>
+</DL>
+<P>
+
+<A NAME="Database Operations"></A>
+<HR SIZE="6">
+<A NAME="SEC177"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC176"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC178"> &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_6.html#SEC165"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.2.4 Database Operations </H3>
+<!--docid::SEC177::-->
+<P>
+
+This object-oriented interface is deprecated for typical database
+applications; <A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A> provides an application programmer
+interface which is easier to understand and use.
+</P>
+<P>
+
+These are the descriptions of the methods available from an open
+relational database. A method is retrieved from a database by calling
+the database with the symbol name of the operation. For example:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define my-database
+ (create-alist-database &quot;mydata.db&quot;))
+(define telephone-table-desc
+ ((my-database 'create-table) 'telephone-table-desc))
+</pre></td></tr></table><P>
+
+<A NAME="IDX1037"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>close-database</B>
+<DD>Causes the relational database to be written to its associated file (if
+any). If the write is successful, subsequent operations to this
+database will signal an error. If the operations completed
+successfully, <CODE>#t</CODE> is returned. Otherwise, <CODE>#f</CODE> is returned.
+</DL>
+<P>
+
+<A NAME="IDX1038"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>write-database</B> <I>filename</I>
+<DD>Causes the relational database to be written to <VAR>filename</VAR>. If the
+write is successful, also causes the database to henceforth be
+associated with <VAR>filename</VAR>. Calling the <CODE>close-database</CODE> (and
+possibly other) method on this database will cause <VAR>filename</VAR> to be
+written to. If <VAR>filename</VAR> is <CODE>#f</CODE> this database will be
+changed to a temporary, non-disk based database if such can be supported
+by the underlying base table implelentation. If the operations
+completed successfully, <CODE>#t</CODE> is returned. Otherwise, <CODE>#f</CODE> is
+returned.
+</DL>
+<P>
+
+<A NAME="IDX1039"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>sync-database</B>
+<DD>Causes any pending updates to the database file to be written out. If
+the operations completed successfully, <CODE>#t</CODE> is returned.
+Otherwise, <CODE>#f</CODE> is returned.
+</DL>
+<P>
+
+<A NAME="IDX1040"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>solidify-database</B>
+<DD>Causes any pending updates to the database file to be written out. If
+the writes completed successfully, then the database is changed to be
+immutable and <CODE>#t</CODE> is returned. Otherwise, <CODE>#f</CODE> is returned.
+</DL>
+<P>
+
+<A NAME="IDX1041"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>table-exists?</B> <I>table-name</I>
+<DD>Returns <CODE>#t</CODE> if <VAR>table-name</VAR> exists in the system catalog,
+otherwise returns <CODE>#f</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX1042"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>open-table</B> <I>table-name mutable?</I>
+<DD>Returns a <EM>methods</EM> procedure for an existing relational table in
+this database if it exists and can be opened in the mode indicated by
+<VAR>mutable?</VAR>, otherwise returns <CODE>#f</CODE>.
+</DL>
+<P>
+
+These methods will be present only in mutable databases.
+</P>
+<P>
+
+<A NAME="IDX1043"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>delete-table</B> <I>table-name</I>
+<DD>Removes and returns the <VAR>table-name</VAR> row from the system catalog if
+the table or view associated with <VAR>table-name</VAR> gets removed from the
+database, and <CODE>#f</CODE> otherwise.
+</DL>
+<P>
+
+<A NAME="IDX1044"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>create-table</B> <I>table-desc-name</I>
+<DD>Returns a methods procedure for a new (open) relational table for
+describing the columns of a new base table in this database, otherwise
+returns <CODE>#f</CODE>. For the fields and layout of descriptor tables,
+See section <A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A>.
+<P>
+
+<A NAME="IDX1045"></A>
+<DT><U>Operation:</U> relational-database <B>create-table</B> <I>table-name table-desc-name</I>
+<DD>Returns a methods procedure for a new (open) relational table with
+columns as described by <VAR>table-desc-name</VAR>, otherwise returns
+<CODE>#f</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1046"></A>
+</P>
+<DL>
+<DT><U>Operation:</U> relational-database <B>create-view</B> <I>??</I>
+<DD><A NAME="IDX1047"></A>
+<DT><U>Operation:</U> relational-database <B>project-table</B> <I>??</I>
+<DD><A NAME="IDX1048"></A>
+<DT><U>Operation:</U> relational-database <B>restrict-table</B> <I>??</I>
+<DD><A NAME="IDX1049"></A>
+<DT><U>Operation:</U> relational-database <B>cart-prod-tables</B> <I>??</I>
+<DD>Not yet implemented.
+</DL>
+<P>
+
+<A NAME="Weight-Balanced Trees"></A>
+<HR SIZE="6">
+<A NAME="SEC178"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC177"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC179"> &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_6.html#SEC140"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.3 Weight-Balanced Trees </H2>
+<!--docid::SEC178::-->
+<P>
+
+<CODE>(require 'wt-tree)</CODE>
+<A NAME="IDX1050"></A>
+</P>
+<P>
+
+<A NAME="IDX1051"></A>
+<A NAME="IDX1052"></A>
+<A NAME="IDX1053"></A>
+<A NAME="IDX1054"></A>
+Balanced binary trees are a useful data structure for maintaining large
+sets of ordered objects or sets of associations whose keys are ordered.
+MIT Scheme has an comprehensive implementation of weight-balanced binary
+trees which has several advantages over the other data structures for
+large aggregates:
+</P>
+<P>
+
+<UL>
+<LI>
+In addition to the usual element-level operations like insertion,
+deletion and lookup, there is a full complement of collection-level
+operations, like set intersection, set union and subset test, all of
+which are implemented with good orders of growth in time and space.
+This makes weight balanced trees ideal for rapid prototyping of
+functionally derived specifications.
+<P>
+
+</P>
+<LI>
+An element in a tree may be indexed by its position under the ordering
+of the keys, and the ordinal position of an element may be determined,
+both with reasonable efficiency.
+<P>
+
+</P>
+<LI>
+Operations to find and remove minimum element make weight balanced trees
+simple to use for priority queues.
+<P>
+
+</P>
+<LI>
+The implementation is <EM>functional</EM> rather than <EM>imperative</EM>.
+This means that operations like `inserting' an association in a tree do
+not destroy the old tree, in much the same way that <CODE>(+ 1 x)</CODE>
+modifies neither the constant 1 nor the value bound to <CODE>x</CODE>. The
+trees are referentially transparent thus the programmer need not worry
+about copying the trees. Referential transparency allows space
+efficiency to be achieved by sharing subtrees.
+<P>
+
+</UL>
+<P>
+
+These features make weight-balanced trees suitable for a wide range of
+applications, especially those that
+require large numbers of sets or discrete maps. Applications that have
+a few global databases and/or concentrate on element-level operations like
+insertion and lookup are probably better off using hash-tables or
+red-black trees.
+</P>
+<P>
+
+The <EM>size</EM> of a tree is the number of associations that it
+contains. Weight balanced binary trees are balanced to keep the sizes
+of the subtrees of each node within a constant factor of each other.
+This ensures logarithmic times for single-path operations (like lookup
+and insertion). A weight balanced tree takes space that is proportional
+to the number of associations in the tree. For the current
+implementation, the constant of proportionality is six words per
+association.
+</P>
+<P>
+
+<A NAME="IDX1055"></A>
+<A NAME="IDX1056"></A>
+<A NAME="IDX1057"></A>
+<A NAME="IDX1058"></A>
+Weight balanced trees can be used as an implementation for either
+discrete sets or discrete maps (associations). Sets are implemented by
+ignoring the datum that is associated with the key. Under this scheme
+if an associations exists in the tree this indicates that the key of the
+association is a member of the set. Typically a value such as
+<CODE>()</CODE>, <CODE>#t</CODE> or <CODE>#f</CODE> is associated with the key.
+</P>
+<P>
+
+Many operations can be viewed as computing a result that, depending on
+whether the tree arguments are thought of as sets or maps, is known by
+two different names. An example is <CODE>wt-tree/member?</CODE>, which, when
+regarding the tree argument as a set, computes the set membership
+operation, but, when regarding the tree as a discrete map,
+<CODE>wt-tree/member?</CODE> is the predicate testing if the map is defined at
+an element in its domain. Most names in this package have been chosen
+based on interpreting the trees as sets, hence the name
+<CODE>wt-tree/member?</CODE> rather than <CODE>wt-tree/defined-at?</CODE>.
+</P>
+<P>
+
+<A NAME="IDX1059"></A>
+<A NAME="IDX1060"></A>
+The weight balanced tree implementation is a run-time-loadable option.
+To use weight balanced trees, execute
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(load-option 'wt-tree)
+</pre></td></tr></table><A NAME="IDX1061"></A>
+<P>
+
+once before calling any of the procedures defined here.
+</P>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Construction of Weight-Balanced Trees"></A>
+<HR SIZE="6">
+<A NAME="SEC179"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC178"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC180"> &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_6.html#SEC178"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.3.1 Construction of Weight-Balanced Trees </H3>
+<!--docid::SEC179::-->
+<P>
+
+Binary trees require there to be a total order on the keys used to
+arrange the elements in the tree. Weight balanced trees are organized
+by <EM>types</EM>, where the type is an object encapsulating the ordering
+relation. Creating a tree is a two-stage process. First a tree type
+must be created from the predicate which gives the ordering. The tree
+type is then used for making trees, either empty or singleton trees or
+trees from other aggregate structures like association lists. Once
+created, a tree `knows' its type and the type is used to test
+compatibility between trees in operations taking two trees. Usually a
+small number of tree types are created at the beginning of a program and
+used many times throughout the program's execution.
+</P>
+<P>
+
+<A NAME="IDX1062"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>make-wt-tree-type</B> <I>key&lt;?</I>
+<DD>This procedure creates and returns a new tree type based on the ordering
+predicate <VAR>key&lt;?</VAR>.
+<VAR>Key&lt;?</VAR> must be a total ordering, having the property that for all
+key values <CODE>a</CODE>, <CODE>b</CODE> and <CODE>c</CODE>:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(key&lt;? a a) => #f
+(and (key&lt;? a b) (key&lt;? b a)) => #f
+(if (and (key&lt;? a b) (key&lt;? b c))
+ (key&lt;? a c)
+ #t) => #t
+</pre></td></tr></table><P>
+
+Two key values are assumed to be equal if neither is less than the other
+by <VAR>key&lt;?</VAR>.
+</P>
+<P>
+
+Each call to <CODE>make-wt-tree-type</CODE> returns a distinct value, and
+trees are only compatible if their tree types are <CODE>eq?</CODE>. A
+consequence is that trees that are intended to be used in binary tree
+operations must all be created with a tree type originating from the
+same call to <CODE>make-wt-tree-type</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1063"></A>
+</P>
+<DL>
+<DT><U>variable+:</U> <B>number-wt-type</B>
+<DD>A standard tree type for trees with numeric keys. <CODE>Number-wt-type</CODE>
+could have been defined by
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define number-wt-type (make-wt-tree-type &lt;))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX1064"></A>
+</P>
+<DL>
+<DT><U>variable+:</U> <B>string-wt-type</B>
+<DD>A standard tree type for trees with string keys. <CODE>String-wt-type</CODE>
+could have been defined by
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define string-wt-type (make-wt-tree-type string&lt;?))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX1065"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>make-wt-tree</B> <I>wt-tree-type</I>
+<DD>This procedure creates and returns a newly allocated weight balanced
+tree. The tree is empty, i.e. it contains no associations.
+<VAR>Wt-tree-type</VAR> is a weight balanced tree type obtained by calling
+<CODE>make-wt-tree-type</CODE>; the returned tree has this type.
+</DL>
+<P>
+
+<A NAME="IDX1066"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>singleton-wt-tree</B> <I>wt-tree-type key datum</I>
+<DD>This procedure creates and returns a newly allocated weight balanced
+tree. The tree contains a single association, that of <VAR>datum</VAR> with
+<VAR>key</VAR>. <VAR>Wt-tree-type</VAR> is a weight balanced tree type obtained
+by calling <CODE>make-wt-tree-type</CODE>; the returned tree has this type.
+</DL>
+<P>
+
+<A NAME="IDX1067"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>alist-&gt;wt-tree</B> <I>tree-type alist</I>
+<DD>Returns a newly allocated weight-balanced tree that contains the same
+associations as <VAR>alist</VAR>. This procedure is equivalent to:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(lambda (type alist)
+ (let ((tree (make-wt-tree type)))
+ (for-each (lambda (association)
+ (wt-tree/add! tree
+ (car association)
+ (cdr association)))
+ alist)
+ tree))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Basic Operations on Weight-Balanced Trees"></A>
+<HR SIZE="6">
+<A NAME="SEC180"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC179"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC181"> &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_6.html#SEC178"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.3.2 Basic Operations on Weight-Balanced Trees </H3>
+<!--docid::SEC180::-->
+<P>
+
+This section describes the basic tree operations on weight balanced
+trees. These operations are the usual tree operations for insertion,
+deletion and lookup, some predicates and a procedure for determining the
+number of associations in a tree.
+</P>
+<P>
+
+<A NAME="IDX1068"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/empty?</B> <I>wt-tree</I>
+<DD>Returns <CODE>#t</CODE> if <VAR>wt-tree</VAR> contains no associations, otherwise
+returns <CODE>#f</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX1069"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/size</B> <I>wt-tree</I>
+<DD>Returns the number of associations in <VAR>wt-tree</VAR>, an exact
+non-negative integer. This operation takes constant time.
+</DL>
+<P>
+
+<A NAME="IDX1070"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/add</B> <I>wt-tree key datum</I>
+<DD>Returns a new tree containing all the associations in <VAR>wt-tree</VAR> and
+the association of <VAR>datum</VAR> with <VAR>key</VAR>. If <VAR>wt-tree</VAR> already
+had an association for <VAR>key</VAR>, the new association overrides the old.
+The average and worst-case times required by this operation are
+proportional to the logarithm of the number of associations in
+<VAR>wt-tree</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX1071"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/add!</B> <I>wt-tree key datum</I>
+<DD>Associates <VAR>datum</VAR> with <VAR>key</VAR> in <VAR>wt-tree</VAR> and returns an
+unspecified value. If <VAR>wt-tree</VAR> already has an association for
+<VAR>key</VAR>, that association is replaced. The average and worst-case
+times required by this operation are proportional to the logarithm of
+the number of associations in <VAR>wt-tree</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX1072"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/member?</B> <I>key wt-tree</I>
+<DD>Returns <CODE>#t</CODE> if <VAR>wt-tree</VAR> contains an association for
+<VAR>key</VAR>, otherwise returns <CODE>#f</CODE>. The average and worst-case
+times required by this operation are proportional to the logarithm of
+the number of associations in <VAR>wt-tree</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX1073"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/lookup</B> <I>wt-tree key default</I>
+<DD>Returns the datum associated with <VAR>key</VAR> in <VAR>wt-tree</VAR>. If
+<VAR>wt-tree</VAR> doesn't contain an association for <VAR>key</VAR>,
+<VAR>default</VAR> is returned. The average and worst-case times required by
+this operation are proportional to the logarithm of the number of
+associations in <VAR>wt-tree</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX1074"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/delete</B> <I>wt-tree key</I>
+<DD>Returns a new tree containing all the associations in <VAR>wt-tree</VAR>,
+except that if <VAR>wt-tree</VAR> contains an association for <VAR>key</VAR>, it
+is removed from the result. The average and worst-case times required
+by this operation are proportional to the logarithm of the number of
+associations in <VAR>wt-tree</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX1075"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/delete!</B> <I>wt-tree key</I>
+<DD>If <VAR>wt-tree</VAR> contains an association for <VAR>key</VAR> the association
+is removed. Returns an unspecified value. The average and worst-case
+times required by this operation are proportional to the logarithm of
+the number of associations in <VAR>wt-tree</VAR>.
+</DL>
+<P>
+
+<A NAME="Advanced Operations on Weight-Balanced Trees"></A>
+<HR SIZE="6">
+<A NAME="SEC181"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC180"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC182"> &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_6.html#SEC178"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.3.3 Advanced Operations on Weight-Balanced Trees </H3>
+<!--docid::SEC181::-->
+<P>
+
+In the following the <EM>size</EM> of a tree is the number of associations
+that the tree contains, and a <EM>smaller</EM> tree contains fewer
+associations.
+</P>
+<P>
+
+<A NAME="IDX1076"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/split&lt;</B> <I>wt-tree bound</I>
+<DD>Returns a new tree containing all and only the associations in
+<VAR>wt-tree</VAR> which have a key that is less than <VAR>bound</VAR> in the
+ordering relation of the tree type of <VAR>wt-tree</VAR>. The average and
+worst-case times required by this operation are proportional to the
+logarithm of the size of <VAR>wt-tree</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX1077"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/split&gt;</B> <I>wt-tree bound</I>
+<DD>Returns a new tree containing all and only the associations in
+<VAR>wt-tree</VAR> which have a key that is greater than <VAR>bound</VAR> in the
+ordering relation of the tree type of <VAR>wt-tree</VAR>. The average and
+worst-case times required by this operation are proportional to the
+logarithm of size of <VAR>wt-tree</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX1078"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/union</B> <I>wt-tree-1 wt-tree-2</I>
+<DD>Returns a new tree containing all the associations from both trees.
+This operation is asymmetric: when both trees have an association for
+the same key, the returned tree associates the datum from <VAR>wt-tree-2</VAR>
+with the key. Thus if the trees are viewed as discrete maps then
+<CODE>wt-tree/union</CODE> computes the map override of <VAR>wt-tree-1</VAR> by
+<VAR>wt-tree-2</VAR>. If the trees are viewed as sets the result is the set
+union of the arguments.
+The worst-case time required by this operation
+is proportional to the sum of the sizes of both trees.
+If the minimum key of one tree is greater than the maximum key of
+the other tree then the time required is at worst proportional to
+the logarithm of the size of the larger tree.
+</DL>
+<P>
+
+<A NAME="IDX1079"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/intersection</B> <I>wt-tree-1 wt-tree-2</I>
+<DD>Returns a new tree containing all and only those associations from
+<VAR>wt-tree-1</VAR> which have keys appearing as the key of an association
+in <VAR>wt-tree-2</VAR>. Thus the associated data in the result are those
+from <VAR>wt-tree-1</VAR>. If the trees are being used as sets the result is
+the set intersection of the arguments. As a discrete map operation,
+<CODE>wt-tree/intersection</CODE> computes the domain restriction of
+<VAR>wt-tree-1</VAR> to (the domain of) <VAR>wt-tree-2</VAR>.
+The time required by this operation is never worse that proportional to
+the sum of the sizes of the trees.
+</DL>
+<P>
+
+<A NAME="IDX1080"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/difference</B> <I>wt-tree-1 wt-tree-2</I>
+<DD>Returns a new tree containing all and only those associations from
+<VAR>wt-tree-1</VAR> which have keys that <EM>do not</EM> appear as the key of
+an association in <VAR>wt-tree-2</VAR>. If the trees are viewed as sets the
+result is the asymmetric set difference of the arguments. As a discrete
+map operation, it computes the domain restriction of <VAR>wt-tree-1</VAR> to
+the complement of (the domain of) <VAR>wt-tree-2</VAR>.
+The time required by this operation is never worse that proportional to
+the sum of the sizes of the trees.
+</DL>
+<P>
+
+<A NAME="IDX1081"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/subset?</B> <I>wt-tree-1 wt-tree-2</I>
+<DD>Returns <CODE>#t</CODE> iff the key of each association in <VAR>wt-tree-1</VAR> is
+the key of some association in <VAR>wt-tree-2</VAR>, otherwise returns <CODE>#f</CODE>.
+Viewed as a set operation, <CODE>wt-tree/subset?</CODE> is the improper subset
+predicate.
+A proper subset predicate can be constructed:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (proper-subset? s1 s2)
+ (and (wt-tree/subset? s1 s2)
+ (&lt; (wt-tree/size s1) (wt-tree/size s2))))
+</pre></td></tr></table><P>
+
+As a discrete map operation, <CODE>wt-tree/subset?</CODE> is the subset
+test on the domain(s) of the map(s). In the worst-case the time
+required by this operation is proportional to the size of
+<VAR>wt-tree-1</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1082"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/set-equal?</B> <I>wt-tree-1 wt-tree-2</I>
+<DD>Returns <CODE>#t</CODE> iff for every association in <VAR>wt-tree-1</VAR> there is
+an association in <VAR>wt-tree-2</VAR> that has the same key, and <EM>vice
+versa</EM>.
+<P>
+
+Viewing the arguments as sets <CODE>wt-tree/set-equal?</CODE> is the set
+equality predicate. As a map operation it determines if two maps are
+defined on the same domain.
+</P>
+<P>
+
+This procedure is equivalent to
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(lambda (wt-tree-1 wt-tree-2)
+ (and (wt-tree/subset? wt-tree-1 wt-tree-2
+ (wt-tree/subset? wt-tree-2 wt-tree-1)))
+</pre></td></tr></table><P>
+
+In the worst-case the time required by this operation is proportional to
+the size of the smaller tree.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1083"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/fold</B> <I>combiner initial wt-tree</I>
+<DD>This procedure reduces <VAR>wt-tree</VAR> by combining all the associations,
+using an reverse in-order traversal, so the associations are visited in
+reverse order. <VAR>Combiner</VAR> is a procedure of three arguments: a key,
+a datum and the accumulated result so far. Provided <VAR>combiner</VAR>
+takes time bounded by a constant, <CODE>wt-tree/fold</CODE> takes time
+proportional to the size of <VAR>wt-tree</VAR>.
+<P>
+
+A sorted association list can be derived simply:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(wt-tree/fold (lambda (key datum list)
+ (cons (cons key datum) list))
+ '()
+ <VAR>wt-tree</VAR>))
+</pre></td></tr></table><P>
+
+The data in the associations can be summed like this:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(wt-tree/fold (lambda (key datum sum) (+ sum datum))
+ 0
+ <VAR>wt-tree</VAR>)
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX1084"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/for-each</B> <I>action wt-tree</I>
+<DD>This procedure traverses the tree in-order, applying <VAR>action</VAR> to
+each association.
+The associations are processed in increasing order of their keys.
+<VAR>Action</VAR> is a procedure of two arguments which take the key and
+datum respectively of the association.
+Provided <VAR>action</VAR> takes time bounded by a constant,
+<CODE>wt-tree/for-each</CODE> takes time proportional to in the size of
+<VAR>wt-tree</VAR>.
+The example prints the tree:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(wt-tree/for-each (lambda (key value)
+ (display (list key value)))
+ <VAR>wt-tree</VAR>))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Indexing Operations on Weight-Balanced Trees"></A>
+<HR SIZE="6">
+<A NAME="SEC182"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC181"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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_6.html#SEC178"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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> 6.3.4 Indexing Operations on Weight-Balanced Trees </H3>
+<!--docid::SEC182::-->
+<P>
+
+Weight balanced trees support operations that view the tree as sorted
+sequence of associations. Elements of the sequence can be accessed by
+position, and the position of an element in the sequence can be
+determined, both in logarthmic time.
+</P>
+<P>
+
+<A NAME="IDX1085"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/index</B> <I>wt-tree index</I>
+<DD><A NAME="IDX1086"></A>
+<DT><U>procedure+:</U> <B>wt-tree/index-datum</B> <I>wt-tree index</I>
+<DD><A NAME="IDX1087"></A>
+<DT><U>procedure+:</U> <B>wt-tree/index-pair</B> <I>wt-tree index</I>
+<DD>Returns the 0-based <VAR>index</VAR>th association of <VAR>wt-tree</VAR> in the
+sorted sequence under the tree's ordering relation on the keys.
+<CODE>wt-tree/index</CODE> returns the <VAR>index</VAR>th key,
+<CODE>wt-tree/index-datum</CODE> returns the datum associated with the
+<VAR>index</VAR>th key and <CODE>wt-tree/index-pair</CODE> returns a new pair
+<CODE>(<VAR>key</VAR> . <VAR>datum</VAR>)</CODE> which is the <CODE>cons</CODE> of the
+<VAR>index</VAR>th key and its datum. The average and worst-case times
+required by this operation are proportional to the logarithm of the
+number of associations in the tree.
+<P>
+
+These operations signal an error if the tree is empty, if
+<VAR>index</VAR><CODE>&lt;0</CODE>, or if <VAR>index</VAR> is greater than or equal to the
+number of associations in the tree.
+</P>
+<P>
+
+Indexing can be used to find the median and maximum keys in the tree as
+follows:
+</P>
+</DL>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>median: (wt-tree/index <VAR>wt-tree</VAR> (quotient (wt-tree/size <VAR>wt-tree</VAR>) 2))
+
+maximum: (wt-tree/index <VAR>wt-tree</VAR> (-1+ (wt-tree/size <VAR>wt-tree</VAR>)))
+</pre></td></tr></table><P>
+
+<A NAME="IDX1088"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/rank</B> <I>wt-tree key</I>
+<DD>Determines the 0-based position of <VAR>key</VAR> in the sorted sequence of
+the keys under the tree's ordering relation, or <CODE>#f</CODE> if the tree
+has no association with for <VAR>key</VAR>. This procedure returns either an
+exact non-negative integer or <CODE>#f</CODE>. The average and worst-case
+times required by this operation are proportional to the logarithm of
+the number of associations in the tree.
+</DL>
+<P>
+
+<A NAME="IDX1089"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/min</B> <I>wt-tree</I>
+<DD><A NAME="IDX1090"></A>
+<DT><U>procedure+:</U> <B>wt-tree/min-datum</B> <I>wt-tree</I>
+<DD><A NAME="IDX1091"></A>
+<DT><U>procedure+:</U> <B>wt-tree/min-pair</B> <I>wt-tree</I>
+<DD>Returns the association of <VAR>wt-tree</VAR> that has the least key under
+the tree's ordering relation. <CODE>wt-tree/min</CODE> returns the least key,
+<CODE>wt-tree/min-datum</CODE> returns the datum associated with the least key
+and <CODE>wt-tree/min-pair</CODE> returns a new pair <CODE>(key . datum)</CODE>
+which is the <CODE>cons</CODE> of the minimum key and its datum. The average
+and worst-case times required by this operation are proportional to the
+logarithm of the number of associations in the tree.
+<P>
+
+These operations signal an error if the tree is empty.
+They could be written
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define (wt-tree/min tree) (wt-tree/index tree 0))
+(define (wt-tree/min-datum tree) (wt-tree/index-datum tree 0))
+(define (wt-tree/min-pair tree) (wt-tree/index-pair tree 0))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX1092"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/delete-min</B> <I>wt-tree</I>
+<DD>Returns a new tree containing all of the associations in <VAR>wt-tree</VAR>
+except the association with the least key under the <VAR>wt-tree</VAR>'s
+ordering relation. An error is signalled if the tree is empty. The
+average and worst-case times required by this operation are proportional
+to the logarithm of the number of associations in the tree. This
+operation is equivalent to
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(wt-tree/delete <VAR>wt-tree</VAR> (wt-tree/min <VAR>wt-tree</VAR>))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX1093"></A>
+</P>
+<DL>
+<DT><U>procedure+:</U> <B>wt-tree/delete-min!</B> <I>wt-tree</I>
+<DD>Removes the association with the least key under the <VAR>wt-tree</VAR>'s
+ordering relation. An error is signalled if the tree is empty. The
+average and worst-case times required by this operation are proportional
+to the logarithm of the number of associations in the tree. This
+operation is equivalent to
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(wt-tree/delete! <VAR>wt-tree</VAR> (wt-tree/min <VAR>wt-tree</VAR>))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Other Packages"></A>
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> &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>
diff --git a/slib_7.html b/slib_7.html
new file mode 100644
index 0000000..932a042
--- /dev/null
+++ b/slib_7.html
@@ -0,0 +1,8218 @@
+<!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>
diff --git a/slib_8.html b/slib_8.html
new file mode 100644
index 0000000..cddb1d5
--- /dev/null
+++ b/slib_8.html
@@ -0,0 +1,767 @@
+<!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: About SLIB</TITLE>
+
+<META NAME="description" CONTENT="SLIB: About SLIB">
+<META NAME="keywords" CONTENT="SLIB: About SLIB">
+<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="SEC277"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC276"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC278"> &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.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> &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> 8. About SLIB </H1>
+<!--docid::SEC277::-->
+<P>
+
+More people than I can name have contributed to SLIB. Thanks to all of
+you!
+</P>
+<P>
+
+<BLOCKQUOTE>
+SLIB 3a1, released January 2005.<BR>
+Aubrey Jaffer &lt;agj @ alum.mit.edu&gt;<BR>
+<I>Hyperactive Software</I> -- The Maniac Inside!<BR>
+<A HREF="http://swissnet.ai.mit.edu/~jaffer/SLIB.html">http://swissnet.ai.mit.edu/~jaffer/SLIB.html</A>
+</BLOCKQUOTE>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC278">8.1 Installation</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to install SLIB on your system.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC284">8.2 Porting</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">SLIB to new platforms.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC285">8.3 Coding Guidelines</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">How to write modules for SLIB.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC287">8.4 Copyrights</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Intellectual propery issues.</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC291">8.5 About this manual</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Installation"></A>
+<HR SIZE="6">
+<A NAME="SEC278"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC279"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC284"> &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> 8.1 Installation </H2>
+<!--docid::SEC278::-->
+<P>
+
+&lt;A NAME=&quot;Installation&quot;&gt;
+&lt;/A&gt;
+</P>
+<P>
+
+<A NAME="IDX1639"></A>
+<A NAME="IDX1640"></A>
+There are four parts to installation:
+</P>
+<P>
+
+<UL>
+<LI>
+Unpack the SLIB distribution.
+<LI>
+Configure the Scheme implementation(s) to locate the SLIB directory.
+<LI>
+Arrange for Scheme implementation to load its SLIB initialization file.
+<LI>
+Build the SLIB catalog for the Scheme implementation.
+</UL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC279"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC278"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC280"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.1.1 Unpacking the SLIB Distribution </H3>
+<!--docid::SEC279::-->
+<P>
+
+If the SLIB distribution is a Linux RPM, it will create the SLIB
+directory `<TT>/usr/share/slib</TT>'.
+</P>
+<P>
+
+If the SLIB distribution is a ZIP file, unzip the distribution to create
+the SLIB directory. Locate this `<TT>slib</TT>' directory either in your
+home directory (if only you will use this SLIB installation); or put it
+in a location where libraries reside on your system. On unix systems
+this might be `<TT>/usr/share/slib</TT>', `<TT>/usr/local/lib/slib</TT>', or
+`<TT>/usr/lib/slib</TT>'. If you know where SLIB should go on other
+platforms, please inform agj @ alum.mit.edu.
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC280"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC279"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC281"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.1.2 Configure Scheme Implementation to Locate SLIB </H3>
+<!--docid::SEC280::-->
+<P>
+
+If the Scheme implementation supports <CODE>getenv</CODE>, then the value of
+the shell environment variable <VAR>SCHEME_LIBRARY_PATH</VAR> will be used
+for <CODE>(library-vicinity)</CODE> if it is defined. Currently, Chez, Elk,
+MITScheme, scheme-&gt;c, VSCM, and SCM support <CODE>getenv</CODE>. Scheme48
+supports <CODE>getenv</CODE> but does not use it for determining
+<CODE>library-vicinity</CODE>. (That is done from the Makefile.)
+</P>
+<P>
+
+The <CODE>(library-vicinity)</CODE> can also be specified from the SLIB
+initialization file or by implementation-specific means.
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC281"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC280"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC282"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.1.3 Loading SLIB Initialization File </H3>
+<!--docid::SEC281::-->
+<P>
+
+Check the manifest in `<TT>README</TT>' to find a configuration file for
+your Scheme implementation. Initialization files for most IEEE P1178
+compliant Scheme Implementations are included with this distribution.
+</P>
+<P>
+
+You should check the definitions of <CODE>software-type</CODE>,
+<CODE>scheme-implementation-version</CODE>,
+<CODE>implementation-vicinity</CODE>,
+and <CODE>library-vicinity</CODE> in the initialization file. There are
+comments in the file for how to configure it.
+</P>
+<P>
+
+Once this is done, modify the startup file for your Scheme
+implementation to <CODE>load</CODE> this initialization file.
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC282"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC281"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC283"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.1.4 Build New SLIB Catalog for Implementation </H3>
+<!--docid::SEC282::-->
+<P>
+
+When SLIB is first used from an implementation, a file named
+`<TT>slibcat</TT>' is written to the <CODE>implementation-vicinity</CODE> for that
+implementation. Because users may lack permission to write in
+<CODE>implementation-vicinity</CODE>, it is good practice to build the new
+catalog when installing SLIB.
+</P>
+<P>
+
+To build (or rebuild) the catalog, start the Scheme implementation (with
+SLIB), then:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'new-catalog)
+</pre></td></tr></table><P>
+
+The catalog also supports color-name dictionaries. With an
+SLIB-installed scheme implementation, type:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'color-names)
+(make-slib-color-name-db)
+(require 'new-catalog)
+(slib:exit)
+</pre></td></tr></table><P>
+
+<HR SIZE="6">
+<A NAME="SEC283"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC282"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC284"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.1.5 Implementation-specific Instructions </H3>
+<!--docid::SEC283::-->
+<P>
+
+Multiple implementations of Scheme can all use the same SLIB directory.
+Simply configure each implementation's initialization file as outlined
+above.
+</P>
+<P>
+
+<A NAME="IDX1641"></A>
+</P>
+<DL>
+<DT><U>Implementation:</U> <B>SCM</B>
+<DD>The SCM implementation does not require any initialization file as SLIB
+support is already built into SCM. See the documentation with SCM for
+installation instructions.
+</DL>
+<P>
+
+<A NAME="IDX1642"></A>
+</P>
+<DL>
+<DT><U>Implementation:</U> <B>VSCM</B>
+<DD><TABLE><tr><td>&nbsp;</td><td class=display><pre style="font-family: serif">From: Matthias Blume &lt;blume @ cs.Princeton.EDU&gt;
+Date: Tue, 1 Mar 1994 11:42:31 -0500
+</pre></td></tr></table><P>
+
+Disclaimer: The code below is only a quick hack. If I find some time to
+spare I might get around to make some more things work.
+</P>
+<P>
+
+You have to provide `<TT>vscm.init</TT>' as an explicit command line
+argument. Since this is not very nice I would recommend the following
+installation procedure:
+</P>
+<P>
+
+<OL>
+<LI>
+run scheme
+<LI>
+<CODE>(load &quot;vscm.init&quot;)</CODE>
+<LI>
+<CODE>(slib:dump &quot;dumpfile&quot;)</CODE>
+<LI>
+mv dumpfile place-where-vscm-standard-bootfile-resides
+e.g. mv dumpfile /usr/local/vscm/lib/scheme-boot
+(In this case vscm should have been compiled with flag
+-DDEFAULT_BOOTFILE='&quot;/usr/local/vscm/lib/scheme-boot&quot;'. See Makefile
+(definition of DDP) for details.)
+</OL>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1643"></A>
+</P>
+<DL>
+<DT><U>Implementation:</U> <B>Scheme48</B>
+<DD>To make a Scheme48 image for an installation under <CODE>&lt;prefix&gt;</CODE>,
+<P>
+
+<OL>
+<LI>
+<CODE>cd</CODE> to the SLIB directory
+<LI>
+type <CODE>make prefix=&lt;prefix&gt; slib48</CODE>.
+<LI>
+To install the image, type <CODE>make prefix=&lt;prefix&gt; install48</CODE>. This
+will also create a shell script with the name <CODE>slib48</CODE> which will
+invoke the saved image.
+</OL>
+</DL>
+<P>
+
+<A NAME="IDX1644"></A>
+</P>
+<DL>
+<DT><U>Implementation:</U> <B>PLT Scheme</B>
+<DD><A NAME="IDX1645"></A>
+<DT><U>Implementation:</U> <B>DrScheme</B>
+<DD><A NAME="IDX1646"></A>
+<DT><U>Implementation:</U> <B>MzScheme</B>
+<DD><P>
+
+The `<TT>init.ss</TT>' file in the _slibinit_ collection is an SLIB
+initialization file.
+</P>
+<P>
+
+To use SLIB in MzScheme, set the <VAR>SCHEME_LIBRARY_PATH</VAR> environment
+variable to the installed SLIB location; then invoke MzScheme thus:
+</P>
+<P>
+
+<CODE>mzscheme -f ${SCHEME_LIBRARY_PATH}DrScheme.init</CODE>
+</P>
+</DL>
+<P>
+
+<A NAME="IDX1647"></A>
+</P>
+<DL>
+<DT><U>Implementation:</U> <B>MIT Scheme</B>
+<DD><CODE>scheme -load ${SCHEME_LIBRARY_PATH}mitscheme.init</CODE>
+</DL>
+<P>
+
+<A NAME="IDX1648"></A>
+</P>
+<DL>
+<DT><U>Implementation:</U> <B>Guile</B>
+<DD><CODE>guile -l ${SCHEME_LIBRARY_PATH}guile.init</CODE>
+</DL>
+<P>
+
+<A NAME="Porting"></A>
+<HR SIZE="6">
+<A NAME="SEC284"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC283"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC285"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC285"> &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> 8.2 Porting </H2>
+<!--docid::SEC284::-->
+<P>
+
+If there is no initialization file for your Scheme implementation, you
+will have to create one. Your Scheme implementation must be largely
+compliant with
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><CITE>IEEE Std 1178-1990</CITE>,
+<CITE>Revised^4 Report on the Algorithmic Language Scheme</CITE>, or
+<CITE>Revised^5 Report on the Algorithmic Language Scheme</CITE>
+</pre></td></tr></table>in order to support SLIB. <A NAME="DOCF7" HREF="slib_fot.html#FOOT7">(7)</A>
+<P>
+
+`<TT>Template.scm</TT>' is an example configuration file. The comments
+inside will direct you on how to customize it to reflect your system.
+Give your new initialization file the implementation's name with
+`<TT>.init</TT>' appended. For instance, if you were porting
+<CODE>foo-scheme</CODE> then the initialization file might be called
+`<TT>foo.init</TT>'.
+</P>
+<P>
+
+Your customized version should then be loaded as part of your scheme
+implementation's initialization. It will load `<TT>require.scm</TT>' from
+the library; this will allow the use of <CODE>provide</CODE>,
+<CODE>provided?</CODE>, and <CODE>require</CODE> along with the <EM>vicinity</EM>
+functions (these functions are documented in the sections
+<A HREF="slib_1.html#SEC2">1.1 Feature</A> and <A HREF="slib_1.html#SEC3">1.2 Require</A>). The rest of the library will then
+be accessible in a system independent fashion.
+</P>
+<P>
+
+Please mail new working configuration files to <CODE>agj @ alum.mit.edu</CODE>
+so that they can be included in the SLIB distribution.
+</P>
+<P>
+
+<A NAME="Coding Guidelines"></A>
+<HR SIZE="6">
+<A NAME="SEC285"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC284"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC286"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC287"> &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> 8.3 Coding Guidelines </H2>
+<!--docid::SEC285::-->
+<P>
+
+All library packages are written in IEEE P1178 Scheme and assume that a
+configuration file and `<TT>require.scm</TT>' package have already been
+loaded. Other versions of Scheme can be supported in library packages
+as well by using, for example, <CODE>(provided? 'r3rs)</CODE> or
+<CODE>(require 'r3rs)</CODE> (see section <A HREF="slib_1.html#SEC3">1.2 Require</A>).
+<A NAME="IDX1649"></A>
+</P>
+<P>
+
+If a procedure defined in a module is called by other procedures in
+that module, then those procedures should instead call an alias
+defined in that module:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define module-name:foo foo)
+</pre></td></tr></table><P>
+
+The module name and `<SAMP>:</SAMP>' should prefix that symbol for the
+internal name. Do not export internal aliases.
+</P>
+<P>
+
+A procedure is exported from a module by putting Schmooz-style
+comments (see section <A HREF="slib_4.html#SEC87">4.14 Schmooz</A>) or `<SAMP>;@</SAMP>' at the beginning of the line
+immediately preceding the definition (<CODE>define</CODE>,
+<CODE>define-syntax</CODE>, or <CODE>defmacro</CODE>). Modules, exports and other
+relevant issues are discussed in <A HREF="slib_1.html#SEC7">1.6 Compiling Scheme</A>.
+</P>
+<P>
+
+Code submitted for inclusion in SLIB should not duplicate (more than
+one) routines already in SLIB files. Use <CODE>require</CODE> to force
+those library routines to be used by your package.
+</P>
+<P>
+
+Documentation should be provided in Emacs Texinfo format if possible,
+but documentation must be provided.
+</P>
+<P>
+
+Your package will be released sooner with SLIB if you send me a file
+which tests your code. Please run this test <EM>before</EM> you send me
+the code!
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC286"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC285"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC287"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.3.1 Modifications </H3>
+<!--docid::SEC286::-->
+<P>
+
+Please document your changes. A line or two for `<TT>ChangeLog</TT>' is
+sufficient for simple fixes or extensions. Look at the format of
+`<TT>ChangeLog</TT>' to see what information is desired. Please send me
+<CODE>diff</CODE> files from the latest SLIB distribution (remember to send
+<CODE>diff</CODE>s of `<TT>slib.texi</TT>' and `<TT>ChangeLog</TT>'). This makes for
+less email traffic and makes it easier for me to integrate when more
+than one person is changing a file (this happens a lot with
+`<TT>slib.texi</TT>' and `<SAMP>*.init</SAMP>' files).
+</P>
+<P>
+
+If someone else wrote a package you want to significantly modify, please
+try to contact the author, who may be working on a new version. This
+will insure against wasting effort on obsolete versions.
+</P>
+<P>
+
+Please <EM>do not</EM> reformat the source code with your favorite
+beautifier, make 10 fixes, and send me the resulting source code. I do
+not have the time to fish through 10000 diffs to find your 10 real fixes.
+</P>
+<P>
+
+<A NAME="Copyrights"></A>
+<HR SIZE="6">
+<A NAME="SEC287"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC286"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC288"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC291"> &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> 8.4 Copyrights </H2>
+<!--docid::SEC287::-->
+<P>
+
+&lt;A NAME=&quot;Copyrights&quot;&gt;
+&lt;/A&gt;
+</P>
+<P>
+
+This section has instructions for SLIB authors regarding copyrights.
+<A NAME="IDX1650"></A>
+</P>
+<P>
+
+Each package in SLIB must either be in the public domain, or come with a
+statement of terms permitting users to copy, redistribute and modify it.
+The comments at the beginning of `<TT>require.scm</TT>' and
+`<TT>macwork.scm</TT>' illustrate copyright and appropriate terms.
+</P>
+<P>
+
+If your code or changes amount to less than about 10 lines, you do not
+need to add your copyright or send a disclaimer.
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC288"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC287"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC289"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.4.1 Putting code into the Public Domain </H3>
+<!--docid::SEC288::-->
+<P>
+
+In order to put code in the public domain you should sign a copyright
+disclaimer and send it to the SLIB maintainer. Contact
+agj @ alum.mit.edu for the address to mail the disclaimer to.
+</P>
+<P>
+
+<BLOCKQUOTE>
+I, <VAR>&lt;my-name&gt;</VAR>, hereby affirm that I have placed the software
+package <VAR>&lt;name&gt;</VAR> in the public domain.
+<P>
+
+I affirm that I am the sole author and sole copyright holder for the
+software package, that I have the right to place this software package
+in the public domain, and that I will do nothing to undermine this
+status in the future.
+<PRE> <VAR>signature and date</VAR>
+</PRE>
+</BLOCKQUOTE>
+<P>
+
+This wording assumes that you are the sole author. If you are not the
+sole author, the wording needs to be different. If you don't want to
+be bothered with sending a letter every time you release or modify a
+module, make your letter say that it also applies to your future
+revisions of that module.
+</P>
+<P>
+
+Make sure no employer has any claim to the copyright on the work you
+are submitting. If there is any doubt, create a copyright disclaimer
+and have your employer sign it. Mail the signed disclaimer to the
+SLIB maintainer. Contact agj @ alum.mit.edu for the address to mail
+the disclaimer to. An example disclaimer follows.
+</P>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC289"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC288"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC290"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.4.2 Explicit copying terms </H3>
+<!--docid::SEC289::-->
+<P>
+
+If you submit more than about 10 lines of code which you are not
+placing into the Public Domain (by sending me a disclaimer) you need
+to:
+</P>
+<P>
+
+<UL>
+<LI>
+Arrange that your name appears in a copyright line for the appropriate
+year. Multiple copyright lines are acceptable.
+<LI>
+With your copyright line, specify any terms you require to be
+different from those already in the file.
+<LI>
+Make sure no employer has any claim to the copyright on the work you
+are submitting. If there is any doubt, create a copyright disclaimer
+and have your employer sign it. Mail the signed disclaim to the SLIB
+maintainer. Contact agj @ alum.mit.edu for the address to mail the
+disclaimer to.
+</UL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC290"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC289"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC291"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.4.3 Example: Company Copyright Disclaimer </H3>
+<!--docid::SEC290::-->
+<P>
+
+This disclaimer should be signed by a vice president or general
+manager of the company. If you can't get at them, anyone else
+authorized to license out software produced there will do. Here is a
+sample wording:
+</P>
+<P>
+
+<BLOCKQUOTE>
+<VAR>&lt;employer&gt;</VAR> Corporation hereby disclaims all copyright
+interest in the program <VAR>&lt;program&gt;</VAR> written by <VAR>&lt;name&gt;</VAR>.
+<P>
+
+<VAR>&lt;employer&gt;</VAR> Corporation affirms that it has no other intellectual
+property interest that would undermine this release, and will do
+nothing to undermine it in the future.
+</P>
+<P>
+
+<PRE><VAR>&lt;signature and date&gt;</VAR>,
+<VAR>&lt;name&gt;</VAR>, <VAR>&lt;title&gt;</VAR>, <VAR>&lt;employer&gt;</VAR> Corporation
+</PRE>
+</BLOCKQUOTE>
+<P>
+
+<A NAME="About this manual"></A>
+<HR SIZE="6">
+<A NAME="SEC291"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC290"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> 8.5 About this manual </H2>
+<!--docid::SEC291::-->
+<P>
+
+<UL>
+<LI>
+Entries that are labeled as Functions are called for their return
+values. Entries that are labeled as Procedures are called primarily for
+their side effects.
+<P>
+
+</P>
+<LI>
+Examples in this text were produced using the <CODE>scm</CODE> Scheme
+implementation.
+<P>
+
+</P>
+<LI>
+At the beginning of each section, there is a line that looks like
+<A NAME="IDX1651"></A>
+<CODE>(require 'feature)</CODE>. Include this line in your code prior to
+using the package.
+</UL>
+<P>
+
+<A NAME="Index"></A>
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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>
diff --git a/slib_9.html b/slib_9.html
new file mode 100644
index 0000000..6744430
--- /dev/null
+++ b/slib_9.html
@@ -0,0 +1,340 @@
+<!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: Index</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Index">
+<META NAME="keywords" CONTENT="SLIB: Index">
+<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="SEC292"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC291"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_12.html"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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> Procedure and Macro Index </H1>
+<!--docid::SEC292::-->
+<P>
+
+This is an alphabetical list of all the procedures and macros in SLIB.
+</P>
+<P>
+
+</P>
+<table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><P></P>
+<TABLE border=0>
+<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_-"></A>-</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1457"><CODE>-</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1440"><CODE>-1+</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_/"></A>/</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1456"><CODE>/</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_1"></A>1</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1439"><CODE>1+</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_&lt;"></A>&lt;</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1442"><CODE>&lt;=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1441"><CODE>&lt;?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_="></A>=</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX504"><CODE>=</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1443"><CODE>=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_&gt;"></A>&gt;</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1445"><CODE>&gt;=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1444"><CODE>&gt;?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_A"></A>A</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX399"><CODE>absolute-path?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX397"><CODE>absolute-uri?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1100"><CODE>ac32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1101"><CODE>ac32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1098"><CODE>ac64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1099"><CODE>ac64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX964"><CODE>add-command-tables</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX933"><CODE>add-domain</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC145">Defining Tables</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX972"><CODE>add-domain on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1414"><CODE>add-process!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX167"><CODE>add-setter</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1290"><CODE>adjoin</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX251"><CODE>adjoin-parameters!</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1067"><CODE>alist-&gt;wt-tree</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1147"><CODE>alist-associator</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1150"><CODE>alist-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1146"><CODE>alist-inquirer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1149"><CODE>alist-map</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1148"><CODE>alist-remover</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1003"><CODE>alist-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1549"><CODE>and-let*</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC260">7.4.13.2 SRFI-2</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1321"><CODE>and?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1541"><CODE>any</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1229"><CODE>any?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1438"><CODE>append!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1523"><CODE>append-reverse</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1524"><CODE>append-reverse!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1459"><CODE>apply</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC242">7.4.7 Multi-argument Apply</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1104"><CODE>ar32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1105"><CODE>ar32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1102"><CODE>ar64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1103"><CODE>ar64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1134"><CODE>array-align</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1142"><CODE>array-copy!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1127"><CODE>array-dimensions</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1139"><CODE>array-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1128"><CODE>array-in-bounds?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1141"><CODE>array-index-map!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1140"><CODE>array-indexes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1138"><CODE>array-map</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1137"><CODE>array-map!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1125"><CODE>array-rank</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1129"><CODE>array-ref</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1130"><CODE>array-set!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1126"><CODE>array-shape</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1135"><CODE>array-trim</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1096"><CODE>array=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1095"><CODE>array?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1110"><CODE>as16</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1111"><CODE>as16</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1108"><CODE>as32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1109"><CODE>as32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1106"><CODE>as64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1107"><CODE>as64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1112"><CODE>as8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1113"><CODE>as8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX453"><CODE>asctime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX490"><CODE>ash</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1546"><CODE>assoc</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC258">Association lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1547"><CODE>assoc</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC258">Association lists</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1122"><CODE>at1</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1123"><CODE>at1</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1323"><CODE>atom?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1118"><CODE>au16</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1119"><CODE>au16</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1116"><CODE>au32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1117"><CODE>au32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1114"><CODE>au64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1115"><CODE>au64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1120"><CODE>au8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1121"><CODE>au8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+<TR><TH><A NAME="fn_B"></A>B</TH><TD></TD><TD></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX274"><CODE>batch:call-with-output-script</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX275"><CODE>batch:command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX279"><CODE>batch:comment</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX281"><CODE>batch:delete-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX272"><CODE>batch:initialize!</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX280"><CODE>batch:lines-&gt;file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX282"><CODE>batch:rename-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX278"><CODE>batch:run-script</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX277"><CODE>batch:try-chopped-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX276"><CODE>batch:try-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX488"><CODE>bit-field</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX494"><CODE>bit-reverse</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX482"><CODE>bitwise-if</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX500"><CODE>bitwise:delaminate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX499"><CODE>bitwise:laminate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX787"><CODE>blackbody-spectrum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX788"><CODE>blackbody-spectrum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX498"><CODE>booleans-&gt;integer</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1577"><CODE>break</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1578"><CODE>break</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1569"><CODE>break-all</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1581"><CODE>breakf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1582"><CODE>breakf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1574"><CODE>breakpoint</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX987"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX988"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX989"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX990"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX991"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX992"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX100"><CODE>browse-url</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1313"><CODE>butlast</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1315"><CODE>butnthcdr</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1154"><CODE>byte-ref</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1155"><CODE>byte-set!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1159"><CODE>bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1187"><CODE>bytes-&gt;ieee-double</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1186"><CODE>bytes-&gt;ieee-float</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1184"><CODE>bytes-&gt;integer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1160"><CODE>bytes-&gt;list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1163"><CODE>bytes-copy</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1158"><CODE>bytes-length</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1165"><CODE>bytes-reverse</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1164"><CODE>bytes-reverse!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR>
+<TR><TD COLSPAN=3> <HR></TD></TR>
+</TABLE><P></P><table><tr><th valign=top>Jump to: &nbsp; </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&lt;" style="text-decoration:none"><b><</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_&gt;" style="text-decoration:none"><b>></b></A>
+ &nbsp;
+<BR>
+<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A>
+ &nbsp;
+<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A>
+ &nbsp;
+<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A>
+ &nbsp;
+<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A>
+ &nbsp;
+<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A>
+ &nbsp;
+<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A>
+ &nbsp;
+<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A>
+ &nbsp;
+<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A>
+ &nbsp;
+<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A>
+ &nbsp;
+<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A>
+ &nbsp;
+</td></tr></table><HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[ &gt;&gt; ]</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>
diff --git a/slib_abt.html b/slib_abt.html
new file mode 100644
index 0000000..3e4da88
--- /dev/null
+++ b/slib_abt.html
@@ -0,0 +1,205 @@
+<!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: About this document</TITLE>
+
+<META NAME="description" CONTENT="SLIB: About this document">
+<META NAME="keywords" CONTENT="SLIB: About this document">
+<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="SEC_About"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><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>About this document</H1>
+This document was generated
+by
+using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A>
+<P></P>
+The buttons in the navigation panels have the following meaning:
+<P></P>
+<table border = "1">
+<TR>
+<TH> Button </TH>
+<TH> Name </TH>
+<TH> Go to </TH>
+<TH> From 1.2.3 go to</TH>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt; ] </TD>
+<TD ALIGN="CENTER">
+Back
+</TD>
+<TD>
+previous section in reading order
+</TD>
+<TD>
+1.2.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt; ] </TD>
+<TD ALIGN="CENTER">
+Forward
+</TD>
+<TD>
+next section in reading order
+</TD>
+<TD>
+1.2.4
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &lt;&lt; ] </TD>
+<TD ALIGN="CENTER">
+FastBack
+</TD>
+<TD>
+beginning of this chapter or previous chapter
+</TD>
+<TD>
+1
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ Up ] </TD>
+<TD ALIGN="CENTER">
+Up
+</TD>
+<TD>
+up section
+</TD>
+<TD>
+1.2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ &gt;&gt; ] </TD>
+<TD ALIGN="CENTER">
+FastForward
+</TD>
+<TD>
+next chapter
+</TD>
+<TD>
+2
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Top] </TD>
+<TD ALIGN="CENTER">
+Top
+</TD>
+<TD>
+cover (top) of document
+</TD>
+<TD>
+ &nbsp;
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Contents] </TD>
+<TD ALIGN="CENTER">
+Contents
+</TD>
+<TD>
+table of contents
+</TD>
+<TD>
+ &nbsp;
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [Index] </TD>
+<TD ALIGN="CENTER">
+Index
+</TD>
+<TD>
+concept index
+</TD>
+<TD>
+ &nbsp;
+</TD>
+</TR>
+<TR>
+<TD ALIGN="CENTER">
+ [ ? ] </TD>
+<TD ALIGN="CENTER">
+About
+</TD>
+<TD>
+this page
+</TD>
+<TD>
+ &nbsp;
+</TD>
+</TR>
+</TABLE>
+ <P>
+ where the <STRONG> Example </STRONG> assumes that the current position
+ is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of
+ the following structure:</P>
+ <UL>
+ <LI> 1. Section One
+ <UL>
+ <LI>1.1 Subsection One-One
+ <UL>
+ <LI>...</LI>
+ </UL>
+ <LI>1.2 Subsection One-Two
+ <UL>
+ <LI>1.2.1 Subsubsection One-Two-One</LI>
+ <LI>1.2.2 Subsubsection One-Two-Two</LI>
+ <LI>1.2.3 Subsubsection One-Two-Three &nbsp; &nbsp;
+ <STRONG>&lt;== Current Position </STRONG></LI>
+ <LI>1.2.4 Subsubsection One-Two-Four</LI>
+ </UL>
+ </LI>
+ <LI>1.3 Subsection One-Three
+ <UL>
+ <LI>...</LI>
+ </UL>
+ </LI>
+ <LI>1.4 Subsection One-Four</LI>
+ </UL>
+ </LI>
+ </UL>
+
+<HR SIZE=1>
+<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>
diff --git a/slib_fot.html b/slib_fot.html
new file mode 100644
index 0000000..9d20d03
--- /dev/null
+++ b/slib_fot.html
@@ -0,0 +1,92 @@
+<!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: Footnotes</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Footnotes">
+<META NAME="keywords" CONTENT="SLIB: Footnotes">
+<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="slib_fot.html"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><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>Footnotes</H1>
+<H3><A NAME="FOOT1" HREF="slib_1.html#DOCF1">(1)</A></H3>
+<P>There are some functions with internal <CODE>require</CODE> calls
+to delay loading modules until they are needed. While this reduces
+startup latency for interpreters, it can produce headaches for
+compilers.
+<H3><A NAME="FOOT2" HREF="slib_1.html#DOCF2">(2)</A></H3>
+<P>Although it will
+work on large info files, feeding it an excerpt is much faster; and
+has less chance of being confused by unusual text in the info file.
+This command excerpts the SLIB index into `<TT>slib-index.info</TT>':
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>info -f slib2d6.info -n &quot;Index&quot; -o slib-index.info
+</pre></td></tr></table>
+<H3><A NAME="FOOT3" HREF="slib_4.html#DOCF3">(3)</A></H3>
+<P>How do I know this?
+I parsed 250kbyte of random input (an e-mail file) with a non-trivial
+grammar utilizing all constructs.
+<H3><A NAME="FOOT4" HREF="slib_5.html#DOCF4">(4)</A></H3>
+<P>Readers may recognize these color string formats from Xlib.
+X11's color management system was doomed by its fiction that CRT
+monitors' (and X11 default) color-spaces were linear RGBi. Unable to
+shed this legacy, the only practical way to view pictures on X is to
+ignore its color management system and use an sRGB monitor. In this
+implementation the device-independent RGB709 and sRGB spaces replace the
+device-dependent RGBi and RGB spaces of Xlib.
+<H3><A NAME="FOOT5" HREF="slib_5.html#DOCF5">(5)</A></H3>
+<P>
+A comprehensive encoding of transforms between CIEXYZ and device color
+spaces is the International Color Consortium profile format,
+ICC.1:1998-09:
+<P>
+
+<BLOCKQUOTE>
+The intent of this format is to provide a cross-platform device profile
+format. Such device profiles can be used to translate color data
+created on one device into another device's native color space.
+</BLOCKQUOTE>
+
+<H3><A NAME="FOOT6" HREF="slib_5.html#DOCF6">(6)</A></H3>
+<P>David Kahaner, Cleve Moler, and Stephen Nash
+<CITE>Numerical Methods and Software</CITE>
+Prentice-Hall, 1989, ISBN 0-13-627258-4
+<H3><A NAME="FOOT7" HREF="slib_8.html#DOCF7">(7)</A></H3>
+<P>If you are porting a
+<CITE>Revised^3 Report on the Algorithmic Language Scheme</CITE>
+implementation, then you will need to finish writing `<TT>sc4sc3.scm</TT>'
+and <CODE>load</CODE> it from your initialization file.
+<HR SIZE=1>
+<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>
diff --git a/slib_ovr.html b/slib_ovr.html
new file mode 100644
index 0000000..0d45685
--- /dev/null
+++ b/slib_ovr.html
@@ -0,0 +1,69 @@
+<!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: Short Table of Contents</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Short Table of Contents">
+<META NAME="keywords" CONTENT="SLIB: Short Table of Contents">
+<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="SEC_OVERVIEW"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><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>Short Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="slib_1.html#SEC1">1. The Library System</A>
+<BR>
+<A NAME="TOC13" HREF="slib_2.html#SEC13">2. Universal SLIB Procedures</A>
+<BR>
+<A NAME="TOC21" HREF="slib_3.html#SEC21">3. Scheme Syntax Extension Packages</A>
+<BR>
+<A NAME="TOC45" HREF="slib_4.html#SEC45">4. Textual Conversion Packages</A>
+<BR>
+<A NAME="TOC88" HREF="slib_5.html#SEC88">5. Mathematical Packages</A>
+<BR>
+<A NAME="TOC140" HREF="slib_6.html#SEC140">6. Database Packages</A>
+<BR>
+<A NAME="TOC183" HREF="slib_7.html#SEC183">7. Other Packages</A>
+<BR>
+<A NAME="TOC277" HREF="slib_8.html#SEC277">8. About SLIB</A>
+<BR>
+<A NAME="TOC292" HREF="slib_9.html#SEC292">Procedure and Macro Index</A>
+<BR>
+<A NAME="TOC293" HREF="slib_10.html#SEC293">Variable Index</A>
+<BR>
+<A NAME="TOC294" HREF="slib_11.html#SEC294">Concept and Feature Index</A>
+<BR>
+
+</BLOCKQUOTE>
+<HR SIZE=1>
+<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>
diff --git a/slib_toc.html b/slib_toc.html
new file mode 100644
index 0000000..4ad33c7
--- /dev/null
+++ b/slib_toc.html
@@ -0,0 +1,676 @@
+<!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: Table of Contents</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Table of Contents">
+<META NAME="keywords" CONTENT="SLIB: Table of Contents">
+<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="SEC_Contents"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><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>Table of Contents</H1>
+<BLOCKQUOTE>
+<A NAME="TOC1" HREF="slib_1.html#SEC1">1. The Library System</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC2" HREF="slib_1.html#SEC2">1.1 Feature</A>
+<BR>
+<A NAME="TOC3" HREF="slib_1.html#SEC3">1.2 Require</A>
+<BR>
+<A NAME="TOC4" HREF="slib_1.html#SEC4">1.3 Library Catalogs</A>
+<BR>
+<A NAME="TOC5" HREF="slib_1.html#SEC5">1.4 Catalog Creation</A>
+<BR>
+<A NAME="TOC6" HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A>
+<BR>
+<A NAME="TOC7" HREF="slib_1.html#SEC7">1.6 Compiling Scheme</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC8" HREF="slib_1.html#SEC8">1.6.1 Module Conventions</A>
+<BR>
+<A NAME="TOC9" HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A>
+<BR>
+<A NAME="TOC10" HREF="slib_1.html#SEC10">1.6.3 Module Semantics</A>
+<BR>
+<A NAME="TOC11" HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A>
+<BR>
+<A NAME="TOC12" HREF="slib_1.html#SEC12">1.6.5 Module Analysis</A>
+<BR>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<A NAME="TOC13" HREF="slib_2.html#SEC13">2. Universal SLIB Procedures</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC14" HREF="slib_2.html#SEC14">2.1 Vicinity</A>
+<BR>
+<A NAME="TOC15" HREF="slib_2.html#SEC15">2.2 Configuration</A>
+<BR>
+<A NAME="TOC16" HREF="slib_2.html#SEC16">2.3 Input/Output</A>
+<BR>
+<A NAME="TOC17" HREF="slib_2.html#SEC17">2.4 System</A>
+<BR>
+<A NAME="TOC18" HREF="slib_2.html#SEC18">2.5 Miscellany</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC19" HREF="slib_2.html#SEC19">2.5.1 Mutual Exclusion</A>
+<BR>
+<A NAME="TOC20" HREF="slib_2.html#SEC20">2.5.2 Legacy</A>
+<BR>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<A NAME="TOC21" HREF="slib_3.html#SEC21">3. Scheme Syntax Extension Packages</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC22" HREF="slib_3.html#SEC22">3.1 Defmacro</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC23" HREF="slib_3.html#SEC23">3.1.1 Defmacroexpand</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC24" HREF="slib_3.html#SEC24">3.2 R4RS Macros</A>
+<BR>
+<A NAME="TOC25" HREF="slib_3.html#SEC25">3.3 Macro by Example</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC26" HREF="slib_3.html#SEC26">3.3.1 Caveat</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC27" HREF="slib_3.html#SEC27">3.4 Macros That Work</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC28" HREF="slib_3.html#SEC28">3.4.1 Definitions</A>
+<BR>
+<A NAME="TOC29" HREF="slib_3.html#SEC29">3.4.2 Restrictions</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC30" HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC31" HREF="slib_3.html#SEC31">3.5.1 Syntactic Closure Macro Facility</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC32" HREF="slib_3.html#SEC32">3.5.1.1 Terminology</A>
+<BR>
+<A NAME="TOC33" HREF="slib_3.html#SEC33">3.5.1.2 Transformer Definition</A>
+<BR>
+<A NAME="TOC34" HREF="slib_3.html#SEC34">3.5.1.3 Identifiers</A>
+<BR>
+<A NAME="TOC35" HREF="slib_3.html#SEC35">3.5.1.4 Acknowledgements</A>
+<BR>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<A NAME="TOC36" HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC37" HREF="slib_3.html#SEC37">3.6.1 Notes</A>
+<BR>
+<A NAME="TOC38" HREF="slib_3.html#SEC38">3.6.2 Note from SLIB maintainer</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC39" HREF="slib_3.html#SEC39">3.7 Fluid-Let</A>
+<BR>
+<A NAME="TOC40" HREF="slib_3.html#SEC40">3.8 Yasos</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC41" HREF="slib_3.html#SEC41">3.8.1 Terms</A>
+<BR>
+<A NAME="TOC42" HREF="slib_3.html#SEC42">3.8.2 Interface</A>
+<BR>
+<A NAME="TOC43" HREF="slib_3.html#SEC43">3.8.3 Setters</A>
+<BR>
+<A NAME="TOC44" HREF="slib_3.html#SEC44">3.8.4 Examples</A>
+<BR>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<A NAME="TOC45" HREF="slib_4.html#SEC45">4. Textual Conversion Packages</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC46" HREF="slib_4.html#SEC46">4.1 Precedence Parsing</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC47" HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A>
+<BR>
+<A NAME="TOC48" HREF="slib_4.html#SEC48">4.1.2 Rule Types</A>
+<BR>
+<A NAME="TOC49" HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A>
+<BR>
+<A NAME="TOC50" HREF="slib_4.html#SEC50">4.1.4 Token definition</A>
+<BR>
+<A NAME="TOC51" HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A>
+<BR>
+<A NAME="TOC52" HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC53" HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A>
+<BR>
+<A NAME="TOC54" HREF="slib_4.html#SEC54">4.3 Standard Formatted I/O</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC55" HREF="slib_4.html#SEC55">4.3.1 stdio</A>
+<BR>
+<A NAME="TOC56" HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC57" HREF="slib_4.html#SEC57">4.3.2.1 Exact Conversions</A>
+<BR>
+<A NAME="TOC58" HREF="slib_4.html#SEC58">4.3.2.2 Inexact Conversions</A>
+<BR>
+<A NAME="TOC59" HREF="slib_4.html#SEC59">4.3.2.3 Other Conversions</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC60" HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC61" HREF="slib_4.html#SEC61">4.4 Program and Arguments</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC62" HREF="slib_4.html#SEC62">4.4.1 Getopt</A>
+<BR>
+<A NAME="TOC63" HREF="slib_4.html#SEC63">4.4.2 Getopt---</A>
+<BR>
+<A NAME="TOC64" HREF="slib_4.html#SEC64">4.4.3 Command Line</A>
+<BR>
+<A NAME="TOC65" HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A>
+<BR>
+<A NAME="TOC66" HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A>
+<BR>
+<A NAME="TOC67" HREF="slib_4.html#SEC67">4.4.6 Filenames</A>
+<BR>
+<A NAME="TOC68" HREF="slib_4.html#SEC68">4.4.7 Batch</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC69" HREF="slib_4.html#SEC69">4.5 HTML</A>
+<BR>
+<A NAME="TOC70" HREF="slib_4.html#SEC70">4.6 HTML Forms</A>
+<BR>
+<A NAME="TOC71" HREF="slib_4.html#SEC71">4.7 HTML Tables</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC72" HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A>
+<BR>
+<A NAME="TOC73" HREF="slib_4.html#SEC73">4.7.2 HTML databases</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC74" HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A>
+<BR>
+<A NAME="TOC75" HREF="slib_4.html#SEC75">4.9 Parsing HTML</A>
+<BR>
+<A NAME="TOC76" HREF="slib_4.html#SEC76">4.10 URI</A>
+<BR>
+<A NAME="TOC78" HREF="slib_4.html#SEC78">4.11 Printing Scheme</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC79" HREF="slib_4.html#SEC79">4.11.1 Generic-Write</A>
+<BR>
+<A NAME="TOC80" HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A>
+<BR>
+<A NAME="TOC81" HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC82" HREF="slib_4.html#SEC82">4.12 Time and Date</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC83" HREF="slib_4.html#SEC83">4.12.1 Time Zone</A>
+<BR>
+<A NAME="TOC84" HREF="slib_4.html#SEC84">4.12.2 Posix Time</A>
+<BR>
+<A NAME="TOC85" HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC86" HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A>
+<BR>
+<A NAME="TOC87" HREF="slib_4.html#SEC87">4.14 Schmooz</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC88" HREF="slib_5.html#SEC88">5. Mathematical Packages</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC89" HREF="slib_5.html#SEC89">5.1 Bit-Twiddling</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC90" HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A>
+<BR>
+<A NAME="TOC91" HREF="slib_5.html#SEC91">5.1.2 Bit Within Word</A>
+<BR>
+<A NAME="TOC92" HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A>
+<BR>
+<A NAME="TOC93" HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A>
+<BR>
+<A NAME="TOC94" HREF="slib_5.html#SEC94">5.1.5 Gray code</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC95" HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A>
+<BR>
+<A NAME="TOC96" HREF="slib_5.html#SEC96">5.3 Prime Numbers</A>
+<BR>
+<A NAME="TOC97" HREF="slib_5.html#SEC97">5.4 Random Numbers</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC98" HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A>
+<BR>
+<A NAME="TOC99" HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC100" HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A>
+<BR>
+<A NAME="TOC101" HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A>
+<BR>
+<A NAME="TOC102" HREF="slib_5.html#SEC102">5.7 Graphing</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC103" HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A>
+<BR>
+<A NAME="TOC104" HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC105" HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A>
+<BR>
+<A NAME="TOC106" HREF="slib_5.html#SEC106">5.7.2.2 Drawing the Graph</A>
+<BR>
+<A NAME="TOC107" HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A>
+<BR>
+<A NAME="TOC108" HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A>
+<BR>
+<A NAME="TOC109" HREF="slib_5.html#SEC109">5.7.2.5 Legending</A>
+<BR>
+<A NAME="TOC110" HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A>
+<BR>
+<A NAME="TOC111" HREF="slib_5.html#SEC111">5.7.2.7 Example Graph</A>
+<BR>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<A NAME="TOC112" HREF="slib_5.html#SEC112">5.8 Solid Modeling</A>
+<BR>
+<A NAME="TOC118" HREF="slib_5.html#SEC118">5.9 Color</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC119" HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC120" HREF="slib_5.html#SEC120">5.9.1.1 External Representation</A>
+<BR>
+<A NAME="TOC121" HREF="slib_5.html#SEC121">5.9.1.2 White</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC122" HREF="slib_5.html#SEC122">5.9.2 Color Spaces</A>
+<BR>
+<A NAME="TOC127" HREF="slib_5.html#SEC127">5.9.3 Spectra</A>
+<BR>
+<A NAME="TOC128" HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A>
+<BR>
+<A NAME="TOC129" HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A>
+<BR>
+<A NAME="TOC130" HREF="slib_5.html#SEC130">5.9.6 Color Names</A>
+<BR>
+<A NAME="TOC133" HREF="slib_5.html#SEC133">5.9.7 Daylight</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC134" HREF="slib_5.html#SEC134">5.10 Root Finding</A>
+<BR>
+<A NAME="TOC135" HREF="slib_5.html#SEC135">5.11 Minimizing</A>
+<BR>
+<A NAME="TOC136" HREF="slib_5.html#SEC136">5.12 Commutative Rings</A>
+<BR>
+<A NAME="TOC137" HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A>
+<BR>
+<A NAME="TOC138" HREF="slib_5.html#SEC138">5.14 How to Create a Commutative Ring</A>
+<BR>
+<A NAME="TOC139" HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC140" HREF="slib_6.html#SEC140">6. Database Packages</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC141" HREF="slib_6.html#SEC141">6.1 Relational Database</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC142" HREF="slib_6.html#SEC142">6.1.1 Using Databases</A>
+<BR>
+<A NAME="TOC147" HREF="slib_6.html#SEC147">6.1.2 Table Operations</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC148" HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A>
+<BR>
+<A NAME="TOC149" HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A>
+<BR>
+<A NAME="TOC150" HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A>
+<BR>
+<A NAME="TOC151" HREF="slib_6.html#SEC151">6.1.2.4 Indexed Sequential Access Methods</A>
+<BR>
+<A NAME="TOC152" HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A>
+<BR>
+<A NAME="TOC153" HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC154" HREF="slib_6.html#SEC154">6.1.3 Database Interpolation</A>
+<BR>
+<A NAME="TOC155" HREF="slib_6.html#SEC155">6.1.4 Embedded Commands</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC156" HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A>
+<BR>
+<A NAME="TOC157" HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A>
+<BR>
+<A NAME="TOC158" HREF="slib_6.html#SEC158">6.1.4.3 Define-tables Example</A>
+<BR>
+<A NAME="TOC159" HREF="slib_6.html#SEC159">6.1.4.4 The *commands* Table</A>
+<BR>
+<A NAME="TOC160" HREF="slib_6.html#SEC160">6.1.4.5 Command Service</A>
+<BR>
+<A NAME="TOC161" HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC162" HREF="slib_6.html#SEC162">6.1.5 Database Macros</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC163" HREF="slib_6.html#SEC163">6.1.5.1 Within-database Example</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC164" HREF="slib_6.html#SEC164">6.1.6 Database Browser</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC165" HREF="slib_6.html#SEC165">6.2 Relational Infrastructure</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC166" HREF="slib_6.html#SEC166">6.2.1 Base Table</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC167" HREF="slib_6.html#SEC167">6.2.1.1 The Base</A>
+<BR>
+<A NAME="TOC168" HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A>
+<BR>
+<A NAME="TOC169" HREF="slib_6.html#SEC169">6.2.1.3 Base Field Types</A>
+<BR>
+<A NAME="TOC170" HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A>
+<BR>
+<A NAME="TOC171" HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A>
+<BR>
+<A NAME="TOC172" HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A>
+<BR>
+<A NAME="TOC173" HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A>
+<BR>
+<A NAME="TOC174" HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC175" HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A>
+<BR>
+<A NAME="TOC176" HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A>
+<BR>
+<A NAME="TOC177" HREF="slib_6.html#SEC177">6.2.4 Database Operations</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC178" HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC179" HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A>
+<BR>
+<A NAME="TOC180" HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A>
+<BR>
+<A NAME="TOC181" HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A>
+<BR>
+<A NAME="TOC182" HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A>
+<BR>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<A NAME="TOC183" HREF="slib_7.html#SEC183">7. Other Packages</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC184" HREF="slib_7.html#SEC184">7.1 Data Structures</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC185" HREF="slib_7.html#SEC185">7.1.1 Arrays</A>
+<BR>
+<A NAME="TOC186" HREF="slib_7.html#SEC186">7.1.2 Subarrays</A>
+<BR>
+<A NAME="TOC187" HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A>
+<BR>
+<A NAME="TOC188" HREF="slib_7.html#SEC188">7.1.4 Association Lists</A>
+<BR>
+<A NAME="TOC189" HREF="slib_7.html#SEC189">7.1.5 Byte</A>
+<BR>
+<A NAME="TOC190" HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A>
+<BR>
+<A NAME="TOC192" HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A>
+<BR>
+<A NAME="TOC193" HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A>
+<BR>
+<A NAME="TOC194" HREF="slib_7.html#SEC194">7.1.9 Collections</A>
+<BR>
+<A NAME="TOC195" HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A>
+<BR>
+<A NAME="TOC196" HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A>
+<BR>
+<A NAME="TOC197" HREF="slib_7.html#SEC197">7.1.12 Macroless Object System</A>
+<BR>
+<A NAME="TOC198" HREF="slib_7.html#SEC198">7.1.13 Concepts</A>
+<BR>
+<A NAME="TOC199" HREF="slib_7.html#SEC199">7.1.14 Procedures</A>
+<BR>
+<A NAME="TOC200" HREF="slib_7.html#SEC200">7.1.15 Examples</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC201" HREF="slib_7.html#SEC201">7.1.15.1 Inverter Documentation</A>
+<BR>
+<A NAME="TOC202" HREF="slib_7.html#SEC202">7.1.15.2 Number Documention</A>
+<BR>
+<A NAME="TOC203" HREF="slib_7.html#SEC203">7.1.15.3 Inverter code</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC204" HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A>
+<BR>
+<A NAME="TOC205" HREF="slib_7.html#SEC205">7.1.17 Queues</A>
+<BR>
+<A NAME="TOC206" HREF="slib_7.html#SEC206">7.1.18 Records</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC207" HREF="slib_7.html#SEC207">7.2 Sorting and Searching</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC208" HREF="slib_7.html#SEC208">7.2.1 Common List Functions</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC209" HREF="slib_7.html#SEC209">7.2.1.1 List construction</A>
+<BR>
+<A NAME="TOC210" HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A>
+<BR>
+<A NAME="TOC211" HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A>
+<BR>
+<A NAME="TOC212" HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A>
+<BR>
+<A NAME="TOC213" HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC214" HREF="slib_7.html#SEC214">7.2.2 Tree operations</A>
+<BR>
+<A NAME="TOC215" HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A>
+<BR>
+<A NAME="TOC216" HREF="slib_7.html#SEC216">7.2.4 Sorting</A>
+<BR>
+<A NAME="TOC217" HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A>
+<BR>
+<A NAME="TOC218" HREF="slib_7.html#SEC218">7.2.6 Hashing</A>
+<BR>
+<A NAME="TOC219" HREF="slib_7.html#SEC219">7.2.7 Space-Filling Curves</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC220" HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A>
+<BR>
+<A NAME="TOC221" HREF="slib_7.html#SEC221">7.2.7.2 Sierpinski Curve</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC222" HREF="slib_7.html#SEC222">7.2.8 Soundex</A>
+<BR>
+<A NAME="TOC223" HREF="slib_7.html#SEC223">7.2.9 String Search</A>
+<BR>
+<A NAME="TOC224" HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC225" HREF="slib_7.html#SEC225">7.3 Procedures</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC226" HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A>
+<BR>
+<A NAME="TOC227" HREF="slib_7.html#SEC227">7.3.2 String-Case</A>
+<BR>
+<A NAME="TOC228" HREF="slib_7.html#SEC228">7.3.3 String Ports</A>
+<BR>
+<A NAME="TOC229" HREF="slib_7.html#SEC229">7.3.4 Line I/O</A>
+<BR>
+<A NAME="TOC230" HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A>
+<BR>
+<A NAME="TOC231" HREF="slib_7.html#SEC231">7.3.6 Metric Units</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC232" HREF="slib_7.html#SEC232">7.3.6.1 SI Prefixes</A>
+<BR>
+<A NAME="TOC233" HREF="slib_7.html#SEC233">7.3.6.2 Binary Prefixes</A>
+<BR>
+<A NAME="TOC234" HREF="slib_7.html#SEC234">7.3.6.3 Unit Symbols</A>
+<BR>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<A NAME="TOC235" HREF="slib_7.html#SEC235">7.4 Standards Support</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC236" HREF="slib_7.html#SEC236">7.4.1 RnRS</A>
+<BR>
+<A NAME="TOC237" HREF="slib_7.html#SEC237">7.4.2 With-File</A>
+<BR>
+<A NAME="TOC238" HREF="slib_7.html#SEC238">7.4.3 Transcripts</A>
+<BR>
+<A NAME="TOC239" HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A>
+<BR>
+<A NAME="TOC240" HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A>
+<BR>
+<A NAME="TOC241" HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A>
+<BR>
+<A NAME="TOC242" HREF="slib_7.html#SEC242">7.4.7 Multi-argument Apply</A>
+<BR>
+<A NAME="TOC243" HREF="slib_7.html#SEC243">7.4.8 Rationalize</A>
+<BR>
+<A NAME="TOC244" HREF="slib_7.html#SEC244">7.4.9 Promises</A>
+<BR>
+<A NAME="TOC245" HREF="slib_7.html#SEC245">7.4.10 Dynamic-Wind</A>
+<BR>
+<A NAME="TOC246" HREF="slib_7.html#SEC246">7.4.11 Eval</A>
+<BR>
+<A NAME="TOC247" HREF="slib_7.html#SEC247">7.4.12 Values</A>
+<BR>
+<A NAME="TOC248" HREF="slib_7.html#SEC248">7.4.13 SRFI</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC249" HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A>
+<BR>
+<A NAME="TOC260" HREF="slib_7.html#SEC260">7.4.13.2 SRFI-2</A>
+<BR>
+<A NAME="TOC261" HREF="slib_7.html#SEC261">7.4.13.3 SRFI-8</A>
+<BR>
+<A NAME="TOC262" HREF="slib_7.html#SEC262">7.4.13.4 SRFI-9</A>
+<BR>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<A NAME="TOC263" HREF="slib_7.html#SEC263">7.5 Session Support</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC264" HREF="slib_7.html#SEC264">7.5.1 Repl</A>
+<BR>
+<A NAME="TOC265" HREF="slib_7.html#SEC265">7.5.2 Quick Print</A>
+<BR>
+<A NAME="TOC266" HREF="slib_7.html#SEC266">7.5.3 Debug</A>
+<BR>
+<A NAME="TOC267" HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A>
+<BR>
+<A NAME="TOC268" HREF="slib_7.html#SEC268">7.5.5 Tracing</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC269" HREF="slib_7.html#SEC269">7.6 System Interface</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC270" HREF="slib_7.html#SEC270">7.6.1 Directories</A>
+<BR>
+<A NAME="TOC271" HREF="slib_7.html#SEC271">7.6.2 Transactions</A>
+<BR>
+<A NAME="TOC275" HREF="slib_7.html#SEC275">7.6.3 CVS</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC276" HREF="slib_7.html#SEC276">7.7 Extra-SLIB Packages</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC277" HREF="slib_8.html#SEC277">8. About SLIB</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC278" HREF="slib_8.html#SEC278">8.1 Installation</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC279" HREF="slib_8.html#SEC279">8.1.1 Unpacking the SLIB Distribution</A>
+<BR>
+<A NAME="TOC280" HREF="slib_8.html#SEC280">8.1.2 Configure Scheme Implementation to Locate SLIB</A>
+<BR>
+<A NAME="TOC281" HREF="slib_8.html#SEC281">8.1.3 Loading SLIB Initialization File</A>
+<BR>
+<A NAME="TOC282" HREF="slib_8.html#SEC282">8.1.4 Build New SLIB Catalog for Implementation</A>
+<BR>
+<A NAME="TOC283" HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC284" HREF="slib_8.html#SEC284">8.2 Porting</A>
+<BR>
+<A NAME="TOC285" HREF="slib_8.html#SEC285">8.3 Coding Guidelines</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC286" HREF="slib_8.html#SEC286">8.3.1 Modifications</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC287" HREF="slib_8.html#SEC287">8.4 Copyrights</A>
+<BR>
+<BLOCKQUOTE>
+<A NAME="TOC288" HREF="slib_8.html#SEC288">8.4.1 Putting code into the Public Domain</A>
+<BR>
+<A NAME="TOC289" HREF="slib_8.html#SEC289">8.4.2 Explicit copying terms</A>
+<BR>
+<A NAME="TOC290" HREF="slib_8.html#SEC290">8.4.3 Example: Company Copyright Disclaimer</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC291" HREF="slib_8.html#SEC291">8.5 About this manual</A>
+<BR>
+</BLOCKQUOTE>
+<A NAME="TOC292" HREF="slib_9.html#SEC292">Procedure and Macro Index</A>
+<BR>
+<A NAME="TOC293" HREF="slib_10.html#SEC293">Variable Index</A>
+<BR>
+<A NAME="TOC294" HREF="slib_11.html#SEC294">Concept and Feature Index</A>
+<BR>
+</BLOCKQUOTE>
+<HR SIZE=1>
+<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>
diff --git a/srcdir.mk b/srcdir.mk
new file mode 100644
index 0000000..befa6a7
--- /dev/null
+++ b/srcdir.mk
@@ -0,0 +1,2 @@
+srcdir = /home/devel/release/slib-3a1/
+
diff --git a/strsrch.scm b/strsrch.scm
index 13edb65..7773e51 100644
--- a/strsrch.scm
+++ b/strsrch.scm
@@ -6,7 +6,7 @@
; This code is in the public domain.
;;;@ Return the index of the first occurence of chr in str, or #f
-(define (string-index str chr)
+(define (strsrch:string-index str chr)
(define len (string-length str))
(do ((pos 0 (+ 1 pos)))
((or (>= pos len) (char=? chr (string-ref str pos)))
@@ -34,7 +34,7 @@
(cond ((zero? patlen) 0) ; trivial match
((>= patlen strlen) (and (= patlen strlen) (string=? pat str) 0))
;; use faster string-index to match a single-character pattern
- ((= 1 patlen) (string-index str (string-ref pat 0)))
+ ((= 1 patlen) (strsrch:string-index str (string-ref pat 0)))
((or (<= strlen (+ patlen patlen (quotient char-code-limit 2)))
(<= patlen 4))
(subloop pat patlen str strlen char=?))
@@ -55,7 +55,7 @@
(define strlen (string-length str))
(cond ((zero? patlen) 0) ; trivial match
((>= patlen strlen) (and (= patlen strlen) (string-ci=? pat str) 0))
- ((= 1 patlen) (string-index-ci str (string-ref pat 0)))
+ ((= 1 patlen) (strsrch:string-index-ci str (string-ref pat 0)))
((or (<= strlen (+ patlen patlen (quotient char-code-limit 2)))
(<= patlen 4))
(subloop pat patlen str strlen char-ci=?))