aboutsummaryrefslogtreecommitdiffstats
path: root/slib_4.html
diff options
context:
space:
mode:
Diffstat (limited to 'slib_4.html')
-rw-r--r--slib_4.html5157
1 files changed, 0 insertions, 5157 deletions
diff --git a/slib_4.html b/slib_4.html
deleted file mode 100644
index 4aa89a0..0000000
--- a/slib_4.html
+++ /dev/null
@@ -1,5157 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html40/loose.dtd">
-<HTML>
-<!-- Created on January, 10 2005 by texi2html 1.66 -->
-<!--
-Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
- Karl Berry <karl@freefriends.org>
- Olaf Bachmann <obachman@mathematik.uni-kl.de>
- and many others.
-Maintained by: Many creative people <dev@texi2html.cvshome.org>
-Send bugs and suggestions to <users@texi2html.cvshome.org>
-
--->
-<HEAD>
-<TITLE>SLIB: 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>