summaryrefslogtreecommitdiffstats
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, 5157 insertions, 0 deletions
diff --git a/slib_4.html b/slib_4.html
new file mode 100644
index 0000000..4aa89a0
--- /dev/null
+++ b/slib_4.html
@@ -0,0 +1,5157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html40/loose.dtd">
+<HTML>
+<!-- Created on January, 10 2005 by texi2html 1.66 -->
+<!--
+Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
+ Karl Berry <karl@freefriends.org>
+ Olaf Bachmann <obachman@mathematik.uni-kl.de>
+ and many others.
+Maintained by: Many creative people <dev@texi2html.cvshome.org>
+Send bugs and suggestions to <users@texi2html.cvshome.org>
+
+-->
+<HEAD>
+<TITLE>SLIB: Textual Conversion Packages</TITLE>
+
+<META NAME="description" CONTENT="SLIB: Textual Conversion Packages">
+<META NAME="keywords" CONTENT="SLIB: Textual Conversion Packages">
+<META NAME="resource-type" CONTENT="document">
+<META NAME="distribution" CONTENT="global">
+<META NAME="Generator" CONTENT="texi2html 1.66">
+
+</HEAD>
+
+<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
+
+<A NAME="SEC45"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC44"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H1> 4. Textual Conversion Packages </H1>
+<!--docid::SEC45::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC46">4.1 Precedence Parsing</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Common-Lisp Format</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC54">4.3 Standard Formatted I/O</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Posix printf and scanf</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC61">4.4 Program and Arguments</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Generating</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Databases meet HTML</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Serve WWW sites</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'html-for-each</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC76">4.10 URI</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Uniform Resource Identifier</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC78">4.11 Printing Scheme</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Nicely</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">DNA and protein sequences</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Documentation markup for Scheme programs</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Precedence Parsing"></A>
+<HR SIZE="6">
+<A NAME="SEC46"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC47"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.1 Precedence Parsing </H2>
+<!--docid::SEC46::-->
+<P>
+
+<CODE>(require 'precedence-parse)</CODE> or <CODE>(require 'parse)</CODE>
+<A NAME="IDX170"></A>
+<A NAME="IDX171"></A>
+</P>
+<P>
+
+This package implements:
+</P>
+<P>
+
+<UL>
+<LI>
+a Pratt style precedence parser;
+<LI>
+a <EM>tokenizer</EM> which congeals tokens according to assigned classes of
+constituent characters;
+<LI>
+procedures giving direct control of parser rulesets;
+<LI>
+procedures for higher level specification of rulesets.
+</UL>
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Precedence Parsing Overview"></A>
+<HR SIZE="6">
+<A NAME="SEC47"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC48"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.1.1 Precedence Parsing Overview </H3>
+<!--docid::SEC47::-->
+<P>
+
+This package offers improvements over previous parsers.
+</P>
+<P>
+
+<UL>
+<LI>
+Common computer language constructs are concisely specified.
+<LI>
+Grammars can be changed dynamically. Operators can be assigned
+different meanings within a lexical context.
+<LI>
+Rulesets don't need compilation. Grammars can be changed incrementally.
+<LI>
+Operator precedence is specified by integers.
+<LI>
+All possibilities of bad input are handled <A NAME="DOCF3" HREF="slib_fot.html#FOOT3">(3)</A> and return as much structure as was
+parsed when the error occured; The symbol <CODE>?</CODE> is substituted for
+missing input.
+</UL>
+<P>
+
+<A NAME="IDX172"></A>
+The notion of <EM>binding power</EM> may be unfamiliar to those
+accustomed to BNF grammars.
+</P>
+<P>
+
+When two consecutive objects are parsed, the first might be the prefix
+to the second, or the second might be a suffix of the first.
+Comparing the left and right binding powers of the two objects decides
+which way to interpret them.
+</P>
+<P>
+
+Objects at each level of syntactic grouping have binding powers.
+</P>
+<P>
+
+<A NAME="IDX173"></A>
+A syntax tree is not built unless the rules explicitly do so. The
+call graph of grammar rules effectively instantiate the sytnax tree.
+</P>
+<P>
+
+The JACAL symbolic math system
+(<A HREF="http://swissnet.ai.mit.edu/~jaffer/JACAL.html">http://swissnet.ai.mit.edu/~jaffer/JACAL.html</A>) uses
+<TT>precedence-parse</TT>. Its grammar definitions in the file
+`<TT>jacal/English.scm</TT>' can serve as examples of use.
+</P>
+<P>
+
+<A NAME="Rule Types"></A>
+<HR SIZE="6">
+<A NAME="SEC48"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC47"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC49"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.1.2 Rule Types </H3>
+<!--docid::SEC48::-->
+<P>
+
+Here are the higher-level syntax types and an example of each.
+Precedence considerations are omitted for clarity. See <A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A> for full details.
+<A NAME="IDX174"></A>
+</P>
+<DL>
+<DT><U>Grammar:</U> <B>nofix</B> <I>bye exit</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>bye
+</pre></td></tr></table>calls the function <CODE>exit</CODE> with no arguments.
+</DL>
+<A NAME="IDX175"></A>
+<DL>
+<DT><U>Grammar:</U> <B>prefix</B> <I>- negate</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>- 42
+</pre></td></tr></table>Calls the function <CODE>negate</CODE> with the argument <CODE>42</CODE>.
+</DL>
+<A NAME="IDX176"></A>
+<DL>
+<DT><U>Grammar:</U> <B>infix</B> <I>- difference</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>x - y
+</pre></td></tr></table>Calls the function <CODE>difference</CODE> with arguments <CODE>x</CODE> and <CODE>y</CODE>.
+</DL>
+<A NAME="IDX177"></A>
+<DL>
+<DT><U>Grammar:</U> <B>nary</B> <I>+ sum</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>x + y + z
+</pre></td></tr></table>Calls the function <CODE>sum</CODE> with arguments <CODE>x</CODE>, <CODE>y</CODE>, and
+<CODE>y</CODE>.
+</DL>
+<A NAME="IDX178"></A>
+<DL>
+<DT><U>Grammar:</U> <B>postfix</B> <I>! factorial</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>5 !
+</pre></td></tr></table>Calls the function <CODE>factorial</CODE> with the argument <CODE>5</CODE>.
+</DL>
+<A NAME="IDX179"></A>
+<DL>
+<DT><U>Grammar:</U> <B>prestfix</B> <I>set set!</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>set foo bar
+</pre></td></tr></table>Calls the function <CODE>set!</CODE> with the arguments <CODE>foo</CODE> and
+<CODE>bar</CODE>.
+</DL>
+<A NAME="IDX180"></A>
+<DL>
+<DT><U>Grammar:</U> <B>commentfix</B> <I>/* */</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>/* almost any text here */
+</pre></td></tr></table>Ignores the comment delimited by <CODE>/*</CODE> and <CODE>*/</CODE>.
+</DL>
+<A NAME="IDX181"></A>
+<DL>
+<DT><U>Grammar:</U> <B>matchfix</B> <I>{ list }</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>{0, 1, 2}
+</pre></td></tr></table>Calls the function <CODE>list</CODE> with the arguments <CODE>0</CODE>, <CODE>1</CODE>,
+and <CODE>2</CODE>.
+</DL>
+<A NAME="IDX182"></A>
+<DL>
+<DT><U>Grammar:</U> <B>inmatchfix</B> <I>( funcall )</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>f(x, y)
+</pre></td></tr></table>Calls the function <CODE>funcall</CODE> with the arguments <CODE>f</CODE>, <CODE>x</CODE>,
+and <CODE>y</CODE>.
+</DL>
+<A NAME="IDX183"></A>
+<DL>
+<DT><U>Grammar:</U> <B>delim</B> <I>;</I>
+<DD><TABLE><tr><td>&nbsp;</td><td class=example><pre>set foo bar;
+</pre></td></tr></table>delimits the extent of the restfix operator <CODE>set</CODE>.
+</DL>
+<P>
+
+<A NAME="Ruleset Definition and Use"></A>
+<HR SIZE="6">
+<A NAME="SEC49"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC48"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC50"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.1.3 Ruleset Definition and Use </H3>
+<!--docid::SEC49::-->
+<P>
+
+<A NAME="IDX184"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*syn-defs*</B>
+<DD>A grammar is built by one or more calls to <CODE>prec:define-grammar</CODE>.
+The rules are appended to <VAR>*syn-defs*</VAR>. The value of
+<VAR>*syn-defs*</VAR> is the grammar suitable for passing as an argument to
+<CODE>prec:parse</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX185"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>*syn-ignore-whitespace*</B>
+<DD>Is a nearly empty grammar with whitespace characters set to group 0,
+which means they will not be made into tokens. Most rulesets will want
+to start with <CODE>*syn-ignore-whitespace*</CODE>
+</DL>
+<P>
+
+In order to start defining a grammar, either
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! *syn-defs* '())
+</pre></td></tr></table>or
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(set! *syn-defs* *syn-ignore-whitespace*)
+</pre></td></tr></table><P>
+
+<A NAME="IDX186"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:define-grammar</B> <I>rule1 <small>...</small></I>
+<DD>Appends <VAR>rule1</VAR> <small>...</small> to <VAR>*syn-defs*</VAR>.
+<CODE>prec:define-grammar</CODE> is used to define both the character classes
+and rules for tokens.
+</DL>
+<P>
+
+Once your grammar is defined, save the value of <CODE>*syn-defs*</CODE> in a
+variable (for use when calling <CODE>prec:parse</CODE>).
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define my-ruleset *syn-defs*)
+</pre></td></tr></table><P>
+
+<A NAME="IDX187"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:parse</B> <I>ruleset delim</I>
+<DD><A NAME="IDX188"></A>
+<DT><U>Function:</U> <B>prec:parse</B> <I>ruleset delim port</I>
+<DD>The <VAR>ruleset</VAR> argument must be a list of rules as constructed by
+<CODE>prec:define-grammar</CODE> and extracted from <VAR>*syn-defs*</VAR>.
+<P>
+
+The token <VAR>delim</VAR> may be a character, symbol, or string. A
+character <VAR>delim</VAR> argument will match only a character token; i.e. a
+character for which no token-group is assigned. A symbols or string
+will match only a token string; i.e. a token resulting from a token
+group.
+</P>
+<P>
+
+<CODE>prec:parse</CODE> reads a <VAR>ruleset</VAR> grammar expression delimited
+by <VAR>delim</VAR> from the given input <VAR>port</VAR>. <CODE>prec:parse</CODE>
+returns the next object parsable from the given input <VAR>port</VAR>,
+updating <VAR>port</VAR> to point to the first character past the end of the
+external representation of the object.
+</P>
+<P>
+
+If an end of file is encountered in the input before any characters are
+found that can begin an object, then an end of file object is returned.
+If a delimiter (such as <VAR>delim</VAR>) is found before any characters are
+found that can begin an object, then <CODE>#f</CODE> is returned.
+</P>
+<P>
+
+The <VAR>port</VAR> argument may be omitted, in which case it defaults to the
+value returned by <CODE>current-input-port</CODE>. It is an error to parse
+from a closed port.
+<A NAME="IDX189"></A>
+</P>
+</DL>
+<P>
+
+<A NAME="Token definition"></A>
+<HR SIZE="6">
+<A NAME="SEC50"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC49"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC51"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.1.4 Token definition </H3>
+<!--docid::SEC50::-->
+<P>
+
+<A NAME="IDX190"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tok:char-group</B> <I>group chars chars-proc</I>
+<DD>The argument <VAR>chars</VAR> may be a single character, a list of
+characters, or a string. Each character in <VAR>chars</VAR> is treated as
+though <CODE>tok:char-group</CODE> was called with that character alone.
+<P>
+
+The argument <VAR>chars-proc</VAR> must be a procedure of one argument, a
+list of characters. After <CODE>tokenize</CODE> has finished
+accumulating the characters for a token, it calls <VAR>chars-proc</VAR> with
+the list of characters. The value returned is the token which
+<CODE>tokenize</CODE> returns.
+</P>
+<P>
+
+The argument <VAR>group</VAR> may be an exact integer or a procedure of one
+character argument. The following discussion concerns the treatment
+which the tokenizing routine, <CODE>tokenize</CODE>, will accord to characters
+on the basis of their groups.
+</P>
+<P>
+
+When <VAR>group</VAR> is a non-zero integer, characters whose group number is
+equal to or exactly one less than <VAR>group</VAR> will continue to
+accumulate. Any other character causes the accumulation to stop (until
+a new token is to be read).
+</P>
+<P>
+
+The <VAR>group</VAR> of zero is special. These characters are ignored when
+parsed pending a token, and stop the accumulation of token characters
+when the accumulation has already begun. Whitespace characters are
+usually put in group 0.
+</P>
+<P>
+
+If <VAR>group</VAR> is a procedure, then, when triggerd by the occurence of
+an initial (no accumulation) <VAR>chars</VAR> character, this procedure will
+be repeatedly called with each successive character from the input
+stream until the <VAR>group</VAR> procedure returns a non-false value.
+</P>
+</DL>
+<P>
+
+The following convenient constants are provided for use with
+<CODE>tok:char-group</CODE>.
+</P>
+<P>
+
+<A NAME="IDX191"></A>
+</P>
+<DL>
+<DT><U>Constant:</U> <B>tok:decimal-digits</B>
+<DD>Is the string <CODE>&quot;0123456789&quot;</CODE>.
+</DL>
+<A NAME="IDX192"></A>
+<DL>
+<DT><U>Constant:</U> <B>tok:upper-case</B>
+<DD>Is the string consisting of all upper-case letters
+(&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;).
+</DL>
+<A NAME="IDX193"></A>
+<DL>
+<DT><U>Constant:</U> <B>tok:lower-case</B>
+<DD>Is the string consisting of all lower-case letters
+(&quot;abcdefghijklmnopqrstuvwxyz&quot;).
+</DL>
+<A NAME="IDX194"></A>
+<DL>
+<DT><U>Constant:</U> <B>tok:whitespaces</B>
+<DD>Is the string consisting of all characters between 0 and 255 for which
+<CODE>char-whitespace?</CODE> returns true.
+</DL>
+<P>
+
+For the purpose of reporting problems in error messages, this package
+keeps track of the <EM>current column</EM>. When the column does not
+simply track input characters, <CODE>tok:bump-column</CODE> can be used to
+adjust the current-column.
+</P>
+<P>
+
+<A NAME="IDX195"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tok:bump-column</B> <I>pos port</I>
+<DD>Adds <VAR>pos</VAR> to the current-column for input-port <VAR>port</VAR>.
+</DL>
+<P>
+
+<A NAME="Nud and Led Definition"></A>
+<HR SIZE="6">
+<A NAME="SEC51"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC50"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC52"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.1.5 Nud and Led Definition </H3>
+<!--docid::SEC51::-->
+<P>
+
+This section describes advanced features. You can skip this section on
+first reading.
+</P>
+<P>
+
+The <EM>Null Denotation</EM> (or <EM>nud</EM>)
+<A NAME="IDX196"></A>
+of a token is the procedure and arguments applying for that token when
+<EM>Left</EM>, an unclaimed parsed expression is not extant.
+</P>
+<P>
+
+The <EM>Left Denotation</EM> (or <EM>led</EM>)
+<A NAME="IDX197"></A>
+of a token is the procedure, arguments, and lbp applying for that token
+when there is a <EM>Left</EM>, an unclaimed parsed expression.
+</P>
+<P>
+
+In his paper,
+</P>
+<P>
+
+<BLOCKQUOTE>
+Pratt, V. R.
+Top Down Operator Precendence.
+<CITE>SIGACT/SIGPLAN Symposium on Principles of Programming Languages</CITE>,
+Boston, 1973, pages 41-51
+</BLOCKQUOTE>
+<P>
+
+the <EM>left binding power</EM> (or <EM>lbp</EM>) was an independent property
+of tokens. I think this was done in order to allow tokens with NUDs but
+not LEDs to also be used as delimiters, which was a problem for
+statically defined syntaxes. It turns out that <EM>dynamically
+binding</EM> NUDs and LEDs allows them independence.
+</P>
+<P>
+
+For the rule-defining procedures that follow, the variable <VAR>tk</VAR> may
+be a character, string, or symbol, or a list composed of characters,
+strings, and symbols. Each element of <VAR>tk</VAR> is treated as though the
+procedure were called for each element.
+</P>
+<P>
+
+Character <VAR>tk</VAR> arguments will match only character tokens;
+i.e. characters for which no token-group is assigned. Symbols and
+strings will both match token strings; i.e. tokens resulting from token
+groups.
+</P>
+<P>
+
+<A NAME="IDX198"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:make-nud</B> <I>tk sop arg1 <small>...</small></I>
+<DD>Returns a rule specifying that <VAR>sop</VAR> be called when <VAR>tk</VAR> is
+parsed. If <VAR>sop</VAR> is a procedure, it is called with <VAR>tk</VAR> and
+<VAR>arg1</VAR> <small>...</small> as its arguments; the resulting value is incorporated
+into the expression being built. Otherwise, <CODE>(list <VAR>sop</VAR>
+<VAR>arg1</VAR> <small>...</small>)</CODE> is incorporated.
+</DL>
+<P>
+
+If no NUD has been defined for a token; then if that token is a string,
+it is converted to a symbol and returned; if not a string, the token is
+returned.
+</P>
+<P>
+
+<A NAME="IDX199"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:make-led</B> <I>tk sop arg1 <small>...</small></I>
+<DD>Returns a rule specifying that <VAR>sop</VAR> be called when <VAR>tk</VAR> is
+parsed and <VAR>left</VAR> has an unclaimed parsed expression. If <VAR>sop</VAR>
+is a procedure, it is called with <VAR>left</VAR>, <VAR>tk</VAR>, and <VAR>arg1</VAR>
+<small>...</small> as its arguments; the resulting value is incorporated into the
+expression being built. Otherwise, <VAR>left</VAR> is incorporated.
+</DL>
+<P>
+
+If no LED has been defined for a token, and <VAR>left</VAR> is set, the
+parser issues a warning.
+</P>
+<P>
+
+<A NAME="Grammar Rule Definition"></A>
+<HR SIZE="6">
+<A NAME="SEC52"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC51"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC53"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.1.6 Grammar Rule Definition </H3>
+<!--docid::SEC52::-->
+<P>
+
+Here are procedures for defining rules for the syntax types introduced
+in <A HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A>.
+</P>
+<P>
+
+For the rule-defining procedures that follow, the variable <VAR>tk</VAR> may
+be a character, string, or symbol, or a list composed of characters,
+strings, and symbols. Each element of <VAR>tk</VAR> is treated as though the
+procedure were called for each element.
+</P>
+<P>
+
+For procedures prec:delim, <small>...</small>, prec:prestfix, if the <VAR>sop</VAR>
+argument is <CODE>#f</CODE>, then the token which triggered this rule is
+converted to a symbol and returned. A false <VAR>sop</VAR> argument to the
+procedures prec:commentfix, prec:matchfix, or prec:inmatchfix has a
+different meaning.
+</P>
+<P>
+
+Character <VAR>tk</VAR> arguments will match only character tokens;
+i.e. characters for which no token-group is assigned. Symbols and
+strings will both match token strings; i.e. tokens resulting from token
+groups.
+</P>
+<P>
+
+<A NAME="IDX200"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:delim</B> <I>tk</I>
+<DD>Returns a rule specifying that <VAR>tk</VAR> should not be returned from
+parsing; i.e. <VAR>tk</VAR>'s function is purely syntactic. The end-of-file
+is always treated as a delimiter.
+</DL>
+<P>
+
+<A NAME="IDX201"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:nofix</B> <I>tk sop</I>
+<DD>Returns a rule specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+If <VAR>sop</VAR> is a procedure, it is called with no arguments; the
+resulting value is incorporated into the expression being built.
+Otherwise, the list of <VAR>sop</VAR> is incorporated.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX202"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:prefix</B> <I>tk sop bp rule1 <small>...</small></I>
+<DD>Returns a rule specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+<CODE>prec:parse1</CODE> is called with binding-power <VAR>bp</VAR>.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is called with the expression returned
+from <CODE>prec:parse1</CODE>; the resulting value is incorporated into the
+expression being built. Otherwise, the list of <VAR>sop</VAR> and the
+expression returned from <CODE>prec:parse1</CODE> is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX203"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:infix</B> <I>tk sop lbp bp rule1 <small>...</small></I>
+<DD>Returns a rule declaring the left-binding-precedence of the token
+<VAR>tk</VAR> is <VAR>lbp</VAR> and specifying the following actions take place
+when <VAR>tk</VAR> is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+One expression is parsed with binding-power <VAR>lbp</VAR>. If instead a
+delimiter is encountered, a warning is issued.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of <VAR>left</VAR> and
+the parsed expression; the resulting value is incorporated into the
+expression being built. Otherwise, the list of <VAR>sop</VAR>, the
+<VAR>left</VAR> expression, and the parsed expression is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX204"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:nary</B> <I>tk sop bp</I>
+<DD>Returns a rule declaring the left-binding-precedence of the token
+<VAR>tk</VAR> is <VAR>bp</VAR> and specifying the following actions take place
+when <VAR>tk</VAR> is parsed:
+<UL>
+<LI>
+Expressions are parsed with binding-power <VAR>bp</VAR> as far as they are
+interleaved with the token <VAR>tk</VAR>.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of <VAR>left</VAR> and
+the parsed expressions; the resulting value is incorporated into the
+expression being built. Otherwise, the list of <VAR>sop</VAR>, the
+<VAR>left</VAR> expression, and the parsed expressions is incorporated.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX205"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:postfix</B> <I>tk sop lbp</I>
+<DD>Returns a rule declaring the left-binding-precedence of the token
+<VAR>tk</VAR> is <VAR>lbp</VAR> and specifying the following actions take place
+when <VAR>tk</VAR> is parsed:
+<UL>
+<LI>
+If <VAR>sop</VAR> is a procedure, it is called with the <VAR>left</VAR> expression;
+the resulting value is incorporated into the expression being built.
+Otherwise, the list of <VAR>sop</VAR> and the <VAR>left</VAR> expression is
+incorporated.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX206"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:prestfix</B> <I>tk sop bp rule1 <small>...</small></I>
+<DD>Returns a rule specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+Expressions are parsed with binding-power <VAR>bp</VAR> until a delimiter is
+reached.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of parsed
+expressions; the resulting value is incorporated into the expression
+being built. Otherwise, the list of <VAR>sop</VAR> and the parsed
+expressions is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX207"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:commentfix</B> <I>tk stp match rule1 <small>...</small></I>
+<DD>Returns rules specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+Characters are read until and end-of-file or a sequence of characters
+is read which matches the <EM>string</EM> <VAR>match</VAR>.
+<LI>
+If <VAR>stp</VAR> is a procedure, it is called with the string of all that
+was read between the <VAR>tk</VAR> and <VAR>match</VAR> (exclusive).
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+<P>
+
+Parsing of commentfix syntax differs from the others in several ways.
+It reads directly from input without tokenizing; It calls <VAR>stp</VAR> but
+does not return its value; nay any value. I added the <VAR>stp</VAR>
+argument so that comment text could be echoed.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX208"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:matchfix</B> <I>tk sop sep match rule1 <small>...</small></I>
+<DD>Returns a rule specifying the following actions take place when <VAR>tk</VAR>
+is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+A rule declaring the token <VAR>match</VAR> a delimiter takes effect.
+<LI>
+Expressions are parsed with binding-power <CODE>0</CODE> until the token
+<VAR>match</VAR> is reached. If the token <VAR>sep</VAR> does not appear between
+each pair of expressions parsed, a warning is issued.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of parsed
+expressions; the resulting value is incorporated into the expression
+being built. Otherwise, the list of <VAR>sop</VAR> and the parsed
+expressions is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="IDX209"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>prec:inmatchfix</B> <I>tk sop sep match lbp rule1 <small>...</small></I>
+<DD>Returns a rule declaring the left-binding-precedence of the token
+<VAR>tk</VAR> is <VAR>lbp</VAR> and specifying the following actions take place
+when <VAR>tk</VAR> is parsed:
+<UL>
+<LI>
+The rules <VAR>rule1</VAR> <small>...</small> augment and, in case of conflict, override
+rules currently in effect.
+<LI>
+A rule declaring the token <VAR>match</VAR> a delimiter takes effect.
+<LI>
+Expressions are parsed with binding-power <CODE>0</CODE> until the token
+<VAR>match</VAR> is reached. If the token <VAR>sep</VAR> does not appear between
+each pair of expressions parsed, a warning is issued.
+<LI>
+If <VAR>sop</VAR> is a procedure, it is applied to the list of <VAR>left</VAR> and
+the parsed expressions; the resulting value is incorporated into the
+expression being built. Otherwise, the list of <VAR>sop</VAR>, the
+<VAR>left</VAR> expression, and the parsed expressions is incorporated.
+<LI>
+The ruleset in effect before <VAR>tk</VAR> was parsed is restored;
+<VAR>rule1</VAR> <small>...</small> are forgotten.
+</UL>
+</DL>
+<P>
+
+<A NAME="Format"></A>
+<HR SIZE="6">
+<A NAME="SEC53"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC52"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.2 Format (version 3.0) </H2>
+<!--docid::SEC53::-->
+<P>
+
+&lt;A NAME=&quot;format&quot;&gt;&lt;/A&gt;
+<A NAME="IDX210"></A>
+</P>
+<P>
+
+The `<TT>format.scm</TT>' package was removed because it was not
+reentrant. <A HREF="http://swissnet.ai.mit.edu/~jaffer/SLIB.FAQ">http://swissnet.ai.mit.edu/~jaffer/SLIB.FAQ</A> explains
+more about FORMAT's woes.
+</P>
+<P>
+
+<A NAME="Standard Formatted I/O"></A>
+<HR SIZE="6">
+<A NAME="SEC54"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC53"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC55"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.3 Standard Formatted I/O </H2>
+<!--docid::SEC54::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'printf</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'scanf</TD></TR>
+</TABLE>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC55"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC56"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.3.1 stdio </H3>
+<!--docid::SEC55::-->
+<P>
+
+<CODE>(require 'stdio)</CODE>
+<A NAME="IDX211"></A>
+</P>
+<P>
+
+<CODE>require</CODE>s <CODE>printf</CODE> and <CODE>scanf</CODE> and additionally defines
+the symbols:
+</P>
+<P>
+
+<A NAME="IDX212"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>stdin</B>
+<DD>Defined to be <CODE>(current-input-port)</CODE>.
+</DL>
+<A NAME="IDX213"></A>
+<DL>
+<DT><U>Variable:</U> <B>stdout</B>
+<DD>Defined to be <CODE>(current-output-port)</CODE>.
+</DL>
+<A NAME="IDX214"></A>
+<DL>
+<DT><U>Variable:</U> <B>stderr</B>
+<DD>Defined to be <CODE>(current-error-port)</CODE>.
+</DL>
+<P>
+
+<A NAME="Standard Formatted Output"></A>
+<HR SIZE="6">
+<A NAME="SEC56"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC55"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC57"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.3.2 Standard Formatted Output </H3>
+<!--docid::SEC56::-->
+<P>
+
+&lt;A NAME=&quot;printf&quot;&gt;&lt;/A&gt;
+<CODE>(require 'printf)</CODE>
+<A NAME="IDX215"></A>
+</P>
+<P>
+
+<A NAME="IDX216"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>printf</B> <I>format arg1 <small>...</small></I>
+<DD><A NAME="IDX217"></A>
+<DT><U>Procedure:</U> <B>fprintf</B> <I>port format arg1 <small>...</small></I>
+<DD><A NAME="IDX218"></A>
+<DT><U>Procedure:</U> <B>sprintf</B> <I>str format arg1 <small>...</small></I>
+<DD><A NAME="IDX219"></A>
+<DT><U>Procedure:</U> <B>sprintf</B> <I>#f format arg1 <small>...</small></I>
+<DD><A NAME="IDX220"></A>
+<DT><U>Procedure:</U> <B>sprintf</B> <I>k format arg1 <small>...</small></I>
+<DD><P>
+
+Each function converts, formats, and outputs its <VAR>arg1</VAR> <small>...</small>
+arguments according to the control string <VAR>format</VAR> argument and
+returns the number of characters output.
+</P>
+<P>
+
+<CODE>printf</CODE> sends its output to the port <CODE>(current-output-port)</CODE>.
+<CODE>fprintf</CODE> sends its output to the port <VAR>port</VAR>. <CODE>sprintf</CODE>
+<CODE>string-set!</CODE>s locations of the non-constant string argument
+<VAR>str</VAR> to the output characters.
+</P>
+<P>
+
+Two extensions of <CODE>sprintf</CODE> return new strings. If the first
+argument is <CODE>#f</CODE>, then the returned string's length is as many
+characters as specified by the <VAR>format</VAR> and data; if the first
+argument is a non-negative integer <VAR>k</VAR>, then the length of the
+returned string is also bounded by <VAR>k</VAR>.
+</P>
+<P>
+
+The string <VAR>format</VAR> contains plain characters which are copied to
+the output stream, and conversion specifications, each of which results
+in fetching zero or more of the arguments <VAR>arg1</VAR> <small>...</small>. The
+results are undefined if there are an insufficient number of arguments
+for the format. If <VAR>format</VAR> is exhausted while some of the
+<VAR>arg1</VAR> <small>...</small> arguments remain unused, the excess <VAR>arg1</VAR>
+<small>...</small> arguments are ignored.
+</P>
+<P>
+
+The conversion specifications in a format string have the form:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>% [ <VAR>flags</VAR> ] [ <VAR>width</VAR> ] [ . <VAR>precision</VAR> ] [ <VAR>type</VAR> ] <VAR>conversion</VAR>
+</pre></td></tr></table><P>
+
+An output conversion specifications consist of an initial `<SAMP>%</SAMP>'
+character followed in sequence by:
+</P>
+<P>
+
+<UL>
+<LI>
+Zero or more <EM>flag characters</EM> that modify the normal behavior of
+the conversion specification.
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>-</SAMP>'
+<DD>Left-justify the result in the field. Normally the result is
+right-justified.
+<P>
+
+</P>
+<DT>`<SAMP>+</SAMP>'
+<DD>For the signed `<SAMP>%d</SAMP>' and `<SAMP>%i</SAMP>' conversions and all inexact
+conversions, prefix a plus sign if the value is positive.
+<P>
+
+</P>
+<DT>`<SAMP> </SAMP>'
+<DD>For the signed `<SAMP>%d</SAMP>' and `<SAMP>%i</SAMP>' conversions, if the result
+doesn't start with a plus or minus sign, prefix it with a space
+character instead. Since the `<SAMP>+</SAMP>' flag ensures that the result
+includes a sign, this flag is ignored if both are specified.
+<P>
+
+</P>
+<DT>`<SAMP>#</SAMP>'
+<DD>For inexact conversions, `<SAMP>#</SAMP>' specifies that the result should
+always include a decimal point, even if no digits follow it. For the
+`<SAMP>%g</SAMP>' and `<SAMP>%G</SAMP>' conversions, this also forces trailing zeros
+after the decimal point to be printed where they would otherwise be
+elided.
+<P>
+
+For the `<SAMP>%o</SAMP>' conversion, force the leading digit to be `<SAMP>0</SAMP>', as
+if by increasing the precision. For `<SAMP>%x</SAMP>' or `<SAMP>%X</SAMP>', prefix a
+leading `<SAMP>0x</SAMP>' or `<SAMP>0X</SAMP>' (respectively) to the result. This
+doesn't do anything useful for the `<SAMP>%d</SAMP>', `<SAMP>%i</SAMP>', or `<SAMP>%u</SAMP>'
+conversions. Using this flag produces output which can be parsed by the
+<CODE>scanf</CODE> functions with the `<SAMP>%i</SAMP>' conversion (see section <A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A>).
+</P>
+<P>
+
+</P>
+<DT>`<SAMP>0</SAMP>'
+<DD>Pad the field with zeros instead of spaces. The zeros are placed after
+any indication of sign or base. This flag is ignored if the `<SAMP>-</SAMP>'
+flag is also specified, or if a precision is specified for an exact
+converson.
+</DL>
+<P>
+
+</P>
+<LI>
+An optional decimal integer specifying the <EM>minimum field width</EM>.
+If the normal conversion produces fewer characters than this, the field
+is padded (with spaces or zeros per the `<SAMP>0</SAMP>' flag) to the specified
+width. This is a <EM>minimum</EM> width; if the normal conversion
+produces more characters than this, the field is <EM>not</EM> truncated.
+<A NAME="IDX221"></A>
+<P>
+
+Alternatively, if the field width is `<SAMP>*</SAMP>', the next argument in the
+argument list (before the actual value to be printed) is used as the
+field width. The width value must be an integer. If the value is
+negative it is as though the `<SAMP>-</SAMP>' flag is set (see above) and the
+absolute value is used as the field width.
+</P>
+<P>
+
+</P>
+<LI>
+An optional <EM>precision</EM> to specify the number of digits to be
+written for numeric conversions and the maximum field width for string
+conversions. The precision is specified by a period (`<SAMP>.</SAMP>') followed
+optionally by a decimal integer (which defaults to zero if omitted).
+<A NAME="IDX222"></A>
+<P>
+
+Alternatively, if the precision is `<SAMP>.*</SAMP>', the next argument in the
+argument list (before the actual value to be printed) is used as the
+precision. The value must be an integer, and is ignored if negative.
+If you specify `<SAMP>*</SAMP>' for both the field width and precision, the
+field width argument precedes the precision argument. The `<SAMP>.*</SAMP>'
+precision is an enhancement. C library versions may not accept this
+syntax.
+</P>
+<P>
+
+For the `<SAMP>%f</SAMP>', `<SAMP>%e</SAMP>', and `<SAMP>%E</SAMP>' conversions, the precision
+specifies how many digits follow the decimal-point character. The
+default precision is <CODE>6</CODE>. If the precision is explicitly <CODE>0</CODE>,
+the decimal point character is suppressed.
+</P>
+<P>
+
+For the `<SAMP>%g</SAMP>' and `<SAMP>%G</SAMP>' conversions, the precision specifies how
+many significant digits to print. Significant digits are the first
+digit before the decimal point, and all the digits after it. If the
+precision is <CODE>0</CODE> or not specified for `<SAMP>%g</SAMP>' or `<SAMP>%G</SAMP>', it is
+treated like a value of <CODE>1</CODE>. If the value being printed cannot be
+expressed accurately in the specified number of digits, the value is
+rounded to the nearest number that fits.
+</P>
+<P>
+
+For exact conversions, if a precision is supplied it specifies the
+minimum number of digits to appear; leading zeros are produced if
+necessary. If a precision is not supplied, the number is printed with
+as many digits as necessary. Converting an exact `<SAMP>0</SAMP>' with an
+explicit precision of zero produces no characters.
+</P>
+<P>
+
+</P>
+<LI>
+An optional one of `<SAMP>l</SAMP>', `<SAMP>h</SAMP>' or `<SAMP>L</SAMP>', which is ignored for
+numeric conversions. It is an error to specify these modifiers for
+non-numeric conversions.
+<P>
+
+</P>
+<LI>
+A character that specifies the conversion to be applied.
+</UL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC57"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC56"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC58"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 4.3.2.1 Exact Conversions </H4>
+<!--docid::SEC57::-->
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>b</SAMP>', `<SAMP>B</SAMP>'
+<DD>Print an integer as an unsigned binary number.
+<P>
+
+<EM>Note:</EM> `<SAMP>%b</SAMP>' and `<SAMP>%B</SAMP>' are SLIB extensions.
+</P>
+<P>
+
+</P>
+<DT>`<SAMP>d</SAMP>', `<SAMP>i</SAMP>'
+<DD>Print an integer as a signed decimal number. `<SAMP>%d</SAMP>' and `<SAMP>%i</SAMP>'
+are synonymous for output, but are different when used with <CODE>scanf</CODE>
+for input (see section <A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A>).
+<P>
+
+</P>
+<DT>`<SAMP>o</SAMP>'
+<DD>Print an integer as an unsigned octal number.
+<P>
+
+</P>
+<DT>`<SAMP>u</SAMP>'
+<DD>Print an integer as an unsigned decimal number.
+<P>
+
+</P>
+<DT>`<SAMP>x</SAMP>', `<SAMP>X</SAMP>'
+<DD>Print an integer as an unsigned hexadecimal number. `<SAMP>%x</SAMP>' prints
+using the digits `<SAMP>0123456789abcdef</SAMP>'. `<SAMP>%X</SAMP>' prints using the
+digits `<SAMP>0123456789ABCDEF</SAMP>'.
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC58"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC57"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC59"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 4.3.2.2 Inexact Conversions </H4>
+<!--docid::SEC58::-->
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>f</SAMP>'
+<DD>Print a floating-point number in fixed-point notation.
+<P>
+
+</P>
+<DT>`<SAMP>e</SAMP>', `<SAMP>E</SAMP>'
+<DD>Print a floating-point number in exponential notation. `<SAMP>%e</SAMP>' prints
+`<SAMP>e</SAMP>' between mantissa and exponont. `<SAMP>%E</SAMP>' prints `<SAMP>E</SAMP>'
+between mantissa and exponont.
+<P>
+
+</P>
+<DT>`<SAMP>g</SAMP>', `<SAMP>G</SAMP>'
+<DD>Print a floating-point number in either fixed or exponential notation,
+whichever is more appropriate for its magnitude. Unless an `<SAMP>#</SAMP>'
+flag has been supplied, trailing zeros after a decimal point will be
+stripped off. `<SAMP>%g</SAMP>' prints `<SAMP>e</SAMP>' between mantissa and exponont.
+`<SAMP>%G</SAMP>' prints `<SAMP>E</SAMP>' between mantissa and exponent.
+<P>
+
+</P>
+<DT>`<SAMP>k</SAMP>', `<SAMP>K</SAMP>'
+<DD>Print a number like `<SAMP>%g</SAMP>', except that an SI prefix is output after
+the number, which is scaled accordingly. `<SAMP>%K</SAMP>' outputs a space
+between number and prefix, `<SAMP>%k</SAMP>' does not.
+<P>
+
+</DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC59"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC58"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC60"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H4> 4.3.2.3 Other Conversions </H4>
+<!--docid::SEC59::-->
+<DL COMPACT>
+<DT>`<SAMP>c</SAMP>'
+<DD>Print a single character. The `<SAMP>-</SAMP>' flag is the only one which can
+be specified. It is an error to specify a precision.
+<P>
+
+</P>
+<DT>`<SAMP>s</SAMP>'
+<DD>Print a string. The `<SAMP>-</SAMP>' flag is the only one which can be
+specified. A precision specifies the maximum number of characters to
+output; otherwise all characters in the string are output.
+<P>
+
+</P>
+<DT>`<SAMP>a</SAMP>', `<SAMP>A</SAMP>'
+<DD>Print a scheme expression. The `<SAMP>-</SAMP>' flag left-justifies the output.
+The `<SAMP>#</SAMP>' flag specifies that strings and characters should be quoted
+as by <CODE>write</CODE> (which can be read using <CODE>read</CODE>); otherwise,
+output is as <CODE>display</CODE> prints. A precision specifies the maximum
+number of characters to output; otherwise as many characters as needed
+are output.
+<P>
+
+<EM>Note:</EM> `<SAMP>%a</SAMP>' and `<SAMP>%A</SAMP>' are SLIB extensions.
+</P>
+<P>
+
+</P>
+<DT>`<SAMP>%</SAMP>'
+<DD>Print a literal `<SAMP>%</SAMP>' character. No argument is consumed. It is an
+error to specify flags, field width, precision, or type modifiers with
+`<SAMP>%%</SAMP>'.
+</DL>
+</DL>
+<P>
+
+<A NAME="Standard Formatted Input"></A>
+<HR SIZE="6">
+<A NAME="SEC60"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC59"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.3.3 Standard Formatted Input </H3>
+<!--docid::SEC60::-->
+<P>
+
+<CODE>(require 'scanf)</CODE>
+<A NAME="IDX223"></A>
+</P>
+<P>
+
+<A NAME="IDX224"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>scanf-read-list</B> <I>format</I>
+<DD><A NAME="IDX225"></A>
+<DT><U>Function:</U> <B>scanf-read-list</B> <I>format port</I>
+<DD><A NAME="IDX226"></A>
+<DT><U>Function:</U> <B>scanf-read-list</B> <I>format string</I>
+<DD></DL>
+<P>
+
+<A NAME="IDX227"></A>
+</P>
+<DL>
+<DT><U>Macro:</U> <B>scanf</B> <I>format arg1 <small>...</small></I>
+<DD><A NAME="IDX228"></A>
+<DT><U>Macro:</U> <B>fscanf</B> <I>port format arg1 <small>...</small></I>
+<DD><A NAME="IDX229"></A>
+<DT><U>Macro:</U> <B>sscanf</B> <I>str format arg1 <small>...</small></I>
+<DD><P>
+
+Each function reads characters, interpreting them according to the
+control string <VAR>format</VAR> argument.
+</P>
+<P>
+
+<CODE>scanf-read-list</CODE> returns a list of the items specified as far as
+the input matches <VAR>format</VAR>. <CODE>scanf</CODE>, <CODE>fscanf</CODE>, and
+<CODE>sscanf</CODE> return the number of items successfully matched and
+stored. <CODE>scanf</CODE>, <CODE>fscanf</CODE>, and <CODE>sscanf</CODE> also set the
+location corresponding to <VAR>arg1</VAR> <small>...</small> using the methods:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT>symbol
+<DD><CODE>set!</CODE>
+<DT>car expression
+<DD><CODE>set-car!</CODE>
+<DT>cdr expression
+<DD><CODE>set-cdr!</CODE>
+<DT>vector-ref expression
+<DD><CODE>vector-set!</CODE>
+<DT>substring expression
+<DD><CODE>substring-move-left!</CODE>
+</DL>
+<P>
+
+The argument to a <CODE>substring</CODE> expression in <VAR>arg1</VAR> <small>...</small> must
+be a non-constant string. Characters will be stored starting at the
+position specified by the second argument to <CODE>substring</CODE>. The
+number of characters stored will be limited by either the position
+specified by the third argument to <CODE>substring</CODE> or the length of the
+matched string, whichever is less.
+</P>
+<P>
+
+The control string, <VAR>format</VAR>, contains conversion specifications and
+other characters used to direct interpretation of input sequences. The
+control string contains:
+</P>
+<P>
+
+<UL>
+<LI>White-space characters (blanks, tabs, newlines, or formfeeds)
+that cause input to be read (and discarded) up to the next
+non-white-space character.
+<P>
+
+</P>
+<LI>An ordinary character (not `<SAMP>%</SAMP>') that must match the next
+character of the input stream.
+<P>
+
+</P>
+<LI>Conversion specifications, consisting of the character `<SAMP>%</SAMP>', an
+optional assignment suppressing character `<SAMP>*</SAMP>', an optional
+numerical maximum-field width, an optional `<SAMP>l</SAMP>', `<SAMP>h</SAMP>' or
+`<SAMP>L</SAMP>' which is ignored, and a conversion code.
+<P>
+
+</UL>
+<P>
+
+Unless the specification contains the `<SAMP>n</SAMP>' conversion character
+(described below), a conversion specification directs the conversion of
+the next input field. The result of a conversion specification is
+returned in the position of the corresponding argument points, unless
+`<SAMP>*</SAMP>' indicates assignment suppression. Assignment suppression
+provides a way to describe an input field to be skipped. An input field
+is defined as a string of characters; it extends to the next
+inappropriate character or until the field width, if specified, is
+exhausted.
+</P>
+<P>
+
+<BLOCKQUOTE>
+<EM>Note:</EM> This specification of format strings differs from the
+<CITE>ANSI C</CITE> and <CITE>POSIX</CITE> specifications. In SLIB, white space
+before an input field is not skipped unless white space appears before
+the conversion specification in the format string. In order to write
+format strings which work identically with <CITE>ANSI C</CITE> and SLIB,
+prepend whitespace to all conversion specifications except `<SAMP>[</SAMP>' and
+`<SAMP>c</SAMP>'.
+</BLOCKQUOTE>
+<P>
+
+The conversion code indicates the interpretation of the input field; For
+a suppressed field, no value is returned. The following conversion
+codes are legal:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+
+<DT>`<SAMP>%</SAMP>'
+<DD>A single % is expected in the input at this point; no value is returned.
+<P>
+
+</P>
+<DT>`<SAMP>d</SAMP>', `<SAMP>D</SAMP>'
+<DD>A decimal integer is expected.
+<P>
+
+</P>
+<DT>`<SAMP>u</SAMP>', `<SAMP>U</SAMP>'
+<DD>An unsigned decimal integer is expected.
+<P>
+
+</P>
+<DT>`<SAMP>o</SAMP>', `<SAMP>O</SAMP>'
+<DD>An octal integer is expected.
+<P>
+
+</P>
+<DT>`<SAMP>x</SAMP>', `<SAMP>X</SAMP>'
+<DD>A hexadecimal integer is expected.
+<P>
+
+</P>
+<DT>`<SAMP>i</SAMP>'
+<DD>An integer is expected. Returns the value of the next input item,
+interpreted according to C conventions; a leading `<SAMP>0</SAMP>' implies
+octal, a leading `<SAMP>0x</SAMP>' implies hexadecimal; otherwise, decimal is
+assumed.
+<P>
+
+</P>
+<DT>`<SAMP>n</SAMP>'
+<DD>Returns the total number of bytes (including white space) read by
+<CODE>scanf</CODE>. No input is consumed by <CODE>%n</CODE>.
+<P>
+
+</P>
+<DT>`<SAMP>f</SAMP>', `<SAMP>F</SAMP>', `<SAMP>e</SAMP>', `<SAMP>E</SAMP>', `<SAMP>g</SAMP>', `<SAMP>G</SAMP>'
+<DD>A floating-point number is expected. The input format for
+floating-point numbers is an optionally signed string of digits,
+possibly containing a radix character `<SAMP>.</SAMP>', followed by an optional
+exponent field consisting of an `<SAMP>E</SAMP>' or an `<SAMP>e</SAMP>', followed by an
+optional `<SAMP>+</SAMP>', `<SAMP>-</SAMP>', or space, followed by an integer.
+<P>
+
+</P>
+<DT>`<SAMP>c</SAMP>', `<SAMP>C</SAMP>'
+<DD><VAR>Width</VAR> characters are expected. The normal skip-over-white-space
+is suppressed in this case; to read the next non-space character, use
+`<SAMP>%1s</SAMP>'. If a field width is given, a string is returned; up to the
+indicated number of characters is read.
+<P>
+
+</P>
+<DT>`<SAMP>s</SAMP>', `<SAMP>S</SAMP>'
+<DD>A character string is expected The input field is terminated by a
+white-space character. <CODE>scanf</CODE> cannot read a null string.
+<P>
+
+</P>
+<DT>`<SAMP>[</SAMP>'
+<DD>Indicates string data and the normal skip-over-leading-white-space is
+suppressed. The left bracket is followed by a set of characters, called
+the scanset, and a right bracket; the input field is the maximal
+sequence of input characters consisting entirely of characters in the
+scanset. `<SAMP>^</SAMP>', when it appears as the first character in the
+scanset, serves as a complement operator and redefines the scanset as
+the set of all characters not contained in the remainder of the scanset
+string. Construction of the scanset follows certain conventions. A
+range of characters may be represented by the construct first-last,
+enabling `<SAMP>[0123456789]</SAMP>' to be expressed `<SAMP>[0-9]</SAMP>'. Using this
+convention, first must be lexically less than or equal to last;
+otherwise, the dash stands for itself. The dash also stands for itself
+when it is the first or the last character in the scanset. To include
+the right square bracket as an element of the scanset, it must appear as
+the first character (possibly preceded by a `<SAMP>^</SAMP>') of the scanset, in
+which case it will not be interpreted syntactically as the closing
+bracket. At least one character must match for this conversion to
+succeed.
+</DL>
+<P>
+
+The <CODE>scanf</CODE> functions terminate their conversions at end-of-file,
+at the end of the control string, or when an input character conflicts
+with the control string. In the latter case, the offending character is
+left unread in the input stream.
+</P>
+</DL>
+<P>
+
+<A NAME="Programs and Arguments"></A>
+<HR SIZE="6">
+<A NAME="SEC61"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC60"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC62"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.4 Program and Arguments </H2>
+<!--docid::SEC61::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">Command Line option parsing</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">A command line reader for Scheme shells</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'parameters</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'getopt-parameters</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'glob or 'filename</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'batch</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Getopt"></A>
+<HR SIZE="6">
+<A NAME="SEC62"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC63"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.4.1 Getopt </H3>
+<!--docid::SEC62::-->
+<P>
+
+<CODE>(require 'getopt)</CODE>
+<A NAME="IDX230"></A>
+</P>
+<P>
+
+This routine implements Posix command line argument parsing. Notice
+that returning values through global variables means that <CODE>getopt</CODE>
+is <EM>not</EM> reentrant.
+</P>
+<P>
+
+Obedience to Posix format for the <CODE>getopt</CODE> calls sows confusion.
+Passing <VAR>argc</VAR> and <VAR>argv</VAR> as arguments while referencing
+<VAR>optind</VAR> as a global variable leads to strange behavior,
+especially when the calls to <CODE>getopt</CODE> are buried in other
+procedures.
+</P>
+<P>
+
+Even in C, <VAR>argc</VAR> can be derived from <VAR>argv</VAR>; what purpose
+does it serve beyond providing an opportunity for
+<VAR>argv</VAR>/<VAR>argc</VAR> mismatch? Just such a mismatch existed for
+years in a SLIB <CODE>getopt--</CODE> example.
+</P>
+<P>
+
+I have removed the <VAR>argc</VAR> and <VAR>argv</VAR> arguments to getopt
+procedures; and replaced them with a global variable:
+</P>
+<P>
+
+<A NAME="IDX231"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*argv*</B>
+<DD>Define <VAR>*argv*</VAR> with a list of arguments before calling getopt
+procedures. If you don't want the first (0th) element to be ignored,
+set <VAR>*optind*</VAR> to 0 (after requiring getopt).
+</DL>
+<P>
+
+<A NAME="IDX232"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*optind*</B>
+<DD>Is the index of the current element of the command line. It is
+initially one. In order to parse a new command line or reparse an old
+one, <VAR>*optind*</VAR> must be reset.
+</DL>
+<P>
+
+<A NAME="IDX233"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*optarg*</B>
+<DD>Is set by getopt to the (string) option-argument of the current option.
+</DL>
+<P>
+
+<A NAME="IDX234"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>getopt</B> <I>optstring</I>
+<DD>Returns the next option letter in <VAR>*argv*</VAR> (starting from
+<CODE>(vector-ref argv *optind*)</CODE>) that matches a letter in
+<VAR>optstring</VAR>. <VAR>*argv*</VAR> is a vector or list of strings, the 0th
+of which getopt usually ignores. <VAR>optstring</VAR> is a string of
+recognized option characters; if a character is followed by a colon,
+the option takes an argument which may be immediately following it in
+the string or in the next element of <VAR>*argv*</VAR>.
+<P>
+
+<VAR>*optind*</VAR> is the index of the next element of the <VAR>*argv*</VAR> vector
+to be processed. It is initialized to 1 by `<TT>getopt.scm</TT>', and
+<CODE>getopt</CODE> updates it when it finishes with each element of
+<VAR>*argv*</VAR>.
+</P>
+<P>
+
+<CODE>getopt</CODE> returns the next option character from <VAR>*argv*</VAR> that
+matches a character in <VAR>optstring</VAR>, if there is one that matches.
+If the option takes an argument, <CODE>getopt</CODE> sets the variable
+<VAR>*optarg*</VAR> to the option-argument as follows:
+</P>
+<P>
+
+<UL>
+<LI>
+If the option was the last character in the string pointed to by an
+element of <VAR>*argv*</VAR>, then <VAR>*optarg*</VAR> contains the next element
+of <VAR>*argv*</VAR>, and <VAR>*optind*</VAR> is incremented by 2. If the
+resulting value of <VAR>*optind*</VAR> is greater than or equal to
+<CODE>(length <VAR>*argv*</VAR>)</CODE>, this indicates a missing option
+argument, and <CODE>getopt</CODE> returns an error indication.
+<P>
+
+</P>
+<LI>
+Otherwise, <VAR>*optarg*</VAR> is set to the string following the option
+character in that element of <VAR>*argv*</VAR>, and <VAR>*optind*</VAR> is
+incremented by 1.
+</UL>
+<P>
+
+If, when <CODE>getopt</CODE> is called, the string <CODE>(vector-ref argv
+*optind*)</CODE> either does not begin with the character <CODE>#\-</CODE> or is
+just <CODE>&quot;-&quot;</CODE>, <CODE>getopt</CODE> returns <CODE>#f</CODE> without changing
+<VAR>*optind*</VAR>. If <CODE>(vector-ref argv *optind*)</CODE> is the string
+<CODE>&quot;--&quot;</CODE>, <CODE>getopt</CODE> returns <CODE>#f</CODE> after incrementing
+<VAR>*optind*</VAR>.
+</P>
+<P>
+
+If <CODE>getopt</CODE> encounters an option character that is not contained in
+<VAR>optstring</VAR>, it returns the question-mark <CODE>#\?</CODE> character. If
+it detects a missing option argument, it returns the colon character
+<CODE>#\:</CODE> if the first character of <VAR>optstring</VAR> was a colon, or a
+question-mark character otherwise. In either case, <CODE>getopt</CODE> sets
+the variable <VAR>getopt:opt</VAR> to the option character that caused the
+error.
+</P>
+<P>
+
+The special option <CODE>&quot;--&quot;</CODE> can be used to delimit the end of the
+options; <CODE>#f</CODE> is returned, and <CODE>&quot;--&quot;</CODE> is skipped.
+</P>
+<P>
+
+RETURN VALUE
+</P>
+<P>
+
+<CODE>getopt</CODE> returns the next option character specified on the command
+line. A colon <CODE>#\:</CODE> is returned if <CODE>getopt</CODE> detects a missing
+argument and the first character of <VAR>optstring</VAR> was a colon
+<CODE>#\:</CODE>.
+</P>
+<P>
+
+A question-mark <CODE>#\?</CODE> is returned if <CODE>getopt</CODE> encounters an
+option character not in <VAR>optstring</VAR> or detects a missing argument
+and the first character of <VAR>optstring</VAR> was not a colon <CODE>#\:</CODE>.
+</P>
+<P>
+
+Otherwise, <CODE>getopt</CODE> returns <CODE>#f</CODE> when all command line options
+have been parsed.
+</P>
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>#! /usr/local/bin/scm
+;;;This code is SCM specific.
+(define argv (program-arguments))
+(require 'getopt)
+<A NAME="IDX235"></A>
+(define opts &quot;:a:b:cd&quot;)
+(let loop ((opt (getopt (length argv) argv opts)))
+ (case opt
+ ((#\a) (print &quot;option a: &quot; *optarg*))
+ ((#\b) (print &quot;option b: &quot; *optarg*))
+ ((#\c) (print &quot;option c&quot;))
+ ((#\d) (print &quot;option d&quot;))
+ ((#\?) (print &quot;error&quot; getopt:opt))
+ ((#\:) (print &quot;missing arg&quot; getopt:opt))
+ ((#f) (if (&lt; *optind* (length argv))
+ (print &quot;argv[&quot; *optind* &quot;]=&quot;
+ (list-ref argv *optind*)))
+ (set! *optind* (+ *optind* 1))))
+ (if (&lt; *optind* (length argv))
+ (loop (getopt (length argv) argv opts))))
+
+(slib:exit)
+</pre></td></tr></table></DL>
+<P>
+
+<HR SIZE="6">
+<A NAME="SEC63"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC62"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC64"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.4.2 Getopt--- </H3>
+<!--docid::SEC63::-->
+<P>
+
+<A NAME="IDX236"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B><CODE>getopt--</CODE></B> <I>optstring</I>
+<DD>The procedure <CODE>getopt--</CODE> is an extended version of <CODE>getopt</CODE>
+which parses <EM>long option names</EM> of the form
+`<SAMP>--hold-the-onions</SAMP>' and `<SAMP>--verbosity-level=extreme</SAMP>'.
+<CODE>Getopt--</CODE> behaves as <CODE>getopt</CODE> except for non-empty
+options beginning with `<SAMP>--</SAMP>'.
+<P>
+
+Options beginning with `<SAMP>--</SAMP>' are returned as strings rather than
+characters. If a value is assigned (using `<SAMP>=</SAMP>') to a long option,
+<CODE>*optarg*</CODE> is set to the value. The `<SAMP>=</SAMP>' and value are
+not returned as part of the option string.
+</P>
+<P>
+
+No information is passed to <CODE>getopt--</CODE> concerning which long
+options should be accepted or whether such options can take arguments.
+If a long option did not have an argument, <CODE>*optarg*</CODE> will be set
+to <CODE>#f</CODE>. The caller is responsible for detecting and reporting
+errors.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(define opts &quot;:-:b:&quot;)
+(define *argv* '(&quot;foo&quot; &quot;-b9&quot; &quot;--f1&quot; &quot;--2=&quot; &quot;--g3=35234.342&quot; &quot;--&quot;))
+(define *optind* 1)
+(define *optarg* #f)
+(require 'qp)
+<A NAME="IDX237"></A>(do ((i 5 (+ -1 i)))
+ ((zero? i))
+ (let ((opt (getopt-- opts)))
+ (print *optind* opt *optarg*)))
+-|
+2 #\b &quot;9&quot;
+3 &quot;f1&quot; #f
+4 &quot;2&quot; &quot;&quot;
+5 &quot;g3&quot; &quot;35234.342&quot;
+5 #f &quot;35234.342&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Command Line"></A>
+<HR SIZE="6">
+<A NAME="SEC64"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC63"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC65"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.4.3 Command Line </H3>
+<!--docid::SEC64::-->
+<P>
+
+<CODE>(require 'read-command)</CODE>
+<A NAME="IDX238"></A>
+</P>
+<P>
+
+<A NAME="IDX239"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>read-command</B> <I>port</I>
+<DD><P>
+
+<A NAME="IDX240"></A>
+<DT><U>Function:</U> <B>read-command</B>
+<DD><CODE>read-command</CODE> converts a <EM>command line</EM> into a list of strings
+<A NAME="IDX241"></A>
+<A NAME="IDX242"></A>
+suitable for parsing by <CODE>getopt</CODE>. The syntax of command lines
+supported resembles that of popular <EM>shell</EM>s. <CODE>read-command</CODE>
+<A NAME="IDX243"></A>
+updates <VAR>port</VAR> to point to the first character past the command
+delimiter.
+</P>
+<P>
+
+If an end of file is encountered in the input before any characters are
+found that can begin an object or comment, then an end of file object is
+returned.
+</P>
+<P>
+
+The <VAR>port</VAR> argument may be omitted, in which case it defaults to the
+value returned by <CODE>current-input-port</CODE>.
+</P>
+<P>
+
+The fields into which the command line is split are delimited by
+whitespace as defined by <CODE>char-whitespace?</CODE>. The end of a command
+is delimited by end-of-file or unescaped semicolon (<KBD>;</KBD>) or
+<KBD>newline</KBD>. Any character can be literally included in a field by
+escaping it with a backslach (<KBD>\</KBD>).
+</P>
+<P>
+
+The initial character and types of fields recognized are:
+</P>
+<DL COMPACT>
+<DT>`<SAMP>\</SAMP>'
+<DD>The next character has is taken literally and not interpreted as a field
+delimiter. If <KBD>\</KBD> is the last character before a <KBD>newline</KBD>,
+that <KBD>newline</KBD> is just ignored. Processing continues from the
+characters after the <KBD>newline</KBD> as though the backslash and
+<KBD>newline</KBD> were not there.
+<DT>`<SAMP>&quot;</SAMP>'
+<DD>The characters up to the next unescaped <KBD>&quot;</KBD> are taken literally,
+according to [R4RS] rules for literal strings (see section `Strings' in <CITE>Revised(4) Scheme</CITE>).
+<DT>`<SAMP>(</SAMP>', `<SAMP>%'</SAMP>'
+<DD>One scheme expression is <CODE>read</CODE> starting with this character. The
+<CODE>read</CODE> expression is evaluated, converted to a string
+(using <CODE>display</CODE>), and replaces the expression in the returned
+field.
+<DT>`<SAMP>;</SAMP>'
+<DD>Semicolon delimits a command. Using semicolons more than one command
+can appear on a line. Escaped semicolons and semicolons inside strings
+do not delimit commands.
+</DL>
+<P>
+
+The comment field differs from the previous fields in that it must be
+the first character of a command or appear after whitespace in order to
+be recognized. <KBD>#</KBD> can be part of fields if these conditions are
+not met. For instance, <CODE>ab#c</CODE> is just the field ab#c.
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>#</SAMP>'
+<DD>Introduces a comment. The comment continues to the end of the line on
+which the semicolon appears. Comments are treated as whitespace by
+<CODE>read-dommand-line</CODE> and backslashes before <KBD>newline</KBD>s in
+comments are also ignored.
+</DL>
+</DL>
+<P>
+
+<A NAME="IDX244"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>read-options-file</B> <I>filename</I>
+<DD><P>
+
+<CODE>read-options-file</CODE> converts an <EM>options file</EM> into a list of
+<A NAME="IDX245"></A>
+<A NAME="IDX246"></A>
+strings suitable for parsing by <CODE>getopt</CODE>. The syntax of options
+files is the same as the syntax for command
+lines, except that <KBD>newline</KBD>s do not terminate reading (only <KBD>;</KBD>
+or end of file).
+</P>
+<P>
+
+If an end of file is encountered before any characters are found that
+can begin an object or comment, then an end of file object is returned.
+</P>
+</DL>
+<P>
+
+<A NAME="Parameter lists"></A>
+<HR SIZE="6">
+<A NAME="SEC65"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC64"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC66"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.4.4 Parameter lists </H3>
+<!--docid::SEC65::-->
+<P>
+
+<CODE>(require 'parameters)</CODE>
+<A NAME="IDX247"></A>
+</P>
+<P>
+
+Arguments to procedures in scheme are distinguished from each other by
+their position in the procedure call. This can be confusing when a
+procedure takes many arguments, many of which are not often used.
+</P>
+<P>
+
+A <EM>parameter-list</EM> is a way of passing named information to a
+procedure. Procedures are also defined to set unused parameters to
+default values, check parameters, and combine parameter lists.
+</P>
+<P>
+
+A <VAR>parameter</VAR> has the form <CODE>(parameter-name value1
+<small>...</small>)</CODE>. This format allows for more than one value per
+parameter-name.
+</P>
+<P>
+
+A <VAR>parameter-list</VAR> is a list of <VAR>parameter</VAR>s, each with a
+different <VAR>parameter-name</VAR>.
+</P>
+<P>
+
+<A NAME="IDX248"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-parameter-list</B> <I>parameter-names</I>
+<DD>Returns an empty parameter-list with slots for <VAR>parameter-names</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX249"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>parameter-list-ref</B> <I>parameter-list parameter-name</I>
+<DD><VAR>parameter-name</VAR> must name a valid slot of <VAR>parameter-list</VAR>.
+<CODE>parameter-list-ref</CODE> returns the value of parameter
+<VAR>parameter-name</VAR> of <VAR>parameter-list</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX250"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>remove-parameter</B> <I>parameter-name parameter-list</I>
+<DD>Removes the parameter <VAR>parameter-name</VAR> from <VAR>parameter-list</VAR>.
+<CODE>remove-parameter</CODE> does not alter the argument
+<VAR>parameter-list</VAR>.
+<P>
+
+If there are more than one <VAR>parameter-name</VAR> parameters, an error is
+signaled.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX251"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>adjoin-parameters!</B> <I>parameter-list parameter1 <small>...</small></I>
+<DD>Returns <VAR>parameter-list</VAR> with <VAR>parameter1</VAR> <small>...</small> merged in.
+</DL>
+<P>
+
+<A NAME="IDX252"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>parameter-list-expand</B> <I>expanders parameter-list</I>
+<DD><VAR>expanders</VAR> is a list of procedures whose order matches the order of
+the <VAR>parameter-name</VAR>s in the call to <CODE>make-parameter-list</CODE>
+which created <VAR>parameter-list</VAR>. For each non-false element of
+<VAR>expanders</VAR> that procedure is mapped over the corresponding
+parameter value and the returned parameter lists are merged into
+<VAR>parameter-list</VAR>.
+<P>
+
+This process is repeated until <VAR>parameter-list</VAR> stops growing. The
+value returned from <CODE>parameter-list-expand</CODE> is unspecified.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX253"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>fill-empty-parameters</B> <I>defaulters parameter-list</I>
+<DD><VAR>defaulters</VAR> is a list of procedures whose order matches the order
+of the <VAR>parameter-name</VAR>s in the call to <CODE>make-parameter-list</CODE>
+which created <VAR>parameter-list</VAR>. <CODE>fill-empty-parameters</CODE>
+returns a new parameter-list with each empty parameter replaced with the
+list returned by calling the corresponding <VAR>defaulter</VAR> with
+<VAR>parameter-list</VAR> as its argument.
+</DL>
+<P>
+
+<A NAME="IDX254"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>check-parameters</B> <I>checks parameter-list</I>
+<DD><VAR>checks</VAR> is a list of procedures whose order matches the order of
+the <VAR>parameter-name</VAR>s in the call to <CODE>make-parameter-list</CODE>
+which created <VAR>parameter-list</VAR>.
+<P>
+
+<CODE>check-parameters</CODE> returns <VAR>parameter-list</VAR> if each <VAR>check</VAR>
+of the corresponding <VAR>parameter-list</VAR> returns non-false. If some
+<VAR>check</VAR> returns <CODE>#f</CODE> a warning is signaled.
+</P>
+</DL>
+<P>
+
+In the following procedures <VAR>arities</VAR> is a list of symbols. The
+elements of <CODE>arities</CODE> can be:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>single</CODE>
+<DD>Requires a single parameter.
+<DT><CODE>optional</CODE>
+<DD>A single parameter or no parameter is acceptable.
+<DT><CODE>boolean</CODE>
+<DD>A single boolean parameter or zero parameters is acceptable.
+<DT><CODE>nary</CODE>
+<DD>Any number of parameters are acceptable.
+<DT><CODE>nary1</CODE>
+<DD>One or more of parameters are acceptable.
+</DL>
+<P>
+
+<A NAME="IDX255"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>parameter-list-&gt;arglist</B> <I>positions arities parameter-list</I>
+<DD>Returns <VAR>parameter-list</VAR> converted to an argument list. Parameters
+of <VAR>arity</VAR> type <CODE>single</CODE> and <CODE>boolean</CODE> are converted to
+the single value associated with them. The other <VAR>arity</VAR> types are
+converted to lists of the value(s).
+<P>
+
+<VAR>positions</VAR> is a list of positive integers whose order matches the
+order of the <VAR>parameter-name</VAR>s in the call to
+<CODE>make-parameter-list</CODE> which created <VAR>parameter-list</VAR>. The
+integers specify in which argument position the corresponding parameter
+should appear.
+</P>
+</DL>
+<P>
+
+<A NAME="Getopt Parameter lists"></A>
+<HR SIZE="6">
+<A NAME="SEC66"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC65"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC67"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.4.5 Getopt Parameter lists </H3>
+<!--docid::SEC66::-->
+<P>
+
+<CODE>(require 'getopt-parameters)</CODE>
+<A NAME="IDX256"></A>
+</P>
+<P>
+
+<A NAME="IDX257"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>getopt-&gt;parameter-list</B> <I>optnames arities types aliases desc <small>...</small></I>
+<DD><P>
+
+Returns <VAR>*argv*</VAR> converted to a parameter-list. <VAR>optnames</VAR> are
+the parameter-names. <VAR>arities</VAR> and <VAR>types</VAR> are lists of symbols
+corresponding to <VAR>optnames</VAR>.
+</P>
+<P>
+
+<VAR>aliases</VAR> is a list of lists of strings or integers paired with
+elements of <VAR>optnames</VAR>. Each one-character string will be treated
+as a single `<SAMP>-</SAMP>' option by <CODE>getopt</CODE>. Longer strings will be
+treated as long-named options (see section <A HREF="slib_4.html#SEC62">getopt--</A>).
+</P>
+<P>
+
+If the <VAR>aliases</VAR> association list has only strings as its
+<CODE>car</CODE>s, then all the option-arguments after an option (and before
+the next option) are adjoined to that option.
+</P>
+<P>
+
+If the <VAR>aliases</VAR> association list has integers, then each (string)
+option will take at most one option-argument. Unoptioned arguments are
+collected in a list. A `<SAMP>-1</SAMP>' alias will take the last argument in
+this list; `<SAMP>+1</SAMP>' will take the first argument in the list. The
+aliases -2 then +2; -3 then +3; <small>...</small> are tried so long as a positive
+or negative consecutive alias is found and arguments remain in the list.
+Finally a `<SAMP>0</SAMP>' alias, if found, absorbs any remaining arguments.
+</P>
+<P>
+
+In all cases, if unclaimed arguments remain after processing, a warning
+is signaled and #f is returned.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX258"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>getopt-&gt;arglist</B> <I>optnames positions arities types defaulters checks aliases desc <small>...</small></I>
+<DD><P>
+
+Like <CODE>getopt-&gt;parameter-list</CODE>, but converts <VAR>*argv*</VAR> to an
+argument-list as specified by <VAR>optnames</VAR>, <VAR>positions</VAR>,
+<VAR>arities</VAR>, <VAR>types</VAR>, <VAR>defaulters</VAR>, <VAR>checks</VAR>, and
+<VAR>aliases</VAR>. If the options supplied violate the <VAR>arities</VAR> or
+<VAR>checks</VAR> constraints, then a warning is signaled and #f is returned.
+</P>
+</DL>
+These <CODE>getopt</CODE> functions can be used with SLIB relational
+databases. For an example, See section <A HREF="slib_6.html#SEC142">make-command-server</A>.
+<P>
+
+If errors are encountered while processing options, directions for using
+the options (and argument strings <VAR>desc</VAR> <small>...</small>) are printed to
+<CODE>current-error-port</CODE>.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(begin
+ (set! *optind* 1)
+ (set! *argv* '(&quot;cmd&quot; &quot;-?&quot;)
+ (getopt-&gt;parameter-list
+ '(flag number symbols symbols string flag2 flag3 num2 num3)
+ '(boolean optional nary1 nary single boolean boolean nary nary)
+ '(boolean integer symbol symbol string boolean boolean integer integer)
+ '((&quot;flag&quot; flag)
+ (&quot;f&quot; flag)
+ (&quot;Flag&quot; flag2)
+ (&quot;B&quot; flag3)
+ (&quot;optional&quot; number)
+ (&quot;o&quot; number)
+ (&quot;nary1&quot; symbols)
+ (&quot;N&quot; symbols)
+ (&quot;nary&quot; symbols)
+ (&quot;n&quot; symbols)
+ (&quot;single&quot; string)
+ (&quot;s&quot; string)
+ (&quot;a&quot; num2)
+ (&quot;Abs&quot; num3))))
+-|
+Usage: cmd [OPTION ARGUMENT ...] ...
+
+ -f, --flag
+ -o, --optional=&lt;number&gt;
+ -n, --nary=&lt;symbols&gt; ...
+ -N, --nary1=&lt;symbols&gt; ...
+ -s, --single=&lt;string&gt;
+ --Flag
+ -B
+ -a &lt;num2&gt; ...
+ --Abs=&lt;num3&gt; ...
+
+ERROR: getopt-&gt;parameter-list &quot;unrecognized option&quot; &quot;-?&quot;
+</pre></td></tr></table><P>
+
+<A NAME="Filenames"></A>
+<HR SIZE="6">
+<A NAME="SEC67"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC66"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC68"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.4.6 Filenames </H3>
+<!--docid::SEC67::-->
+<P>
+
+<CODE>(require 'filename)</CODE> or <CODE>(require 'glob)</CODE>
+<A NAME="IDX259"></A>
+<A NAME="IDX260"></A>
+</P>
+<P>
+
+<A NAME="IDX261"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>filename:match??</B> <I>pattern</I>
+<DD><A NAME="IDX262"></A>
+<DT><U>Function:</U> <B>filename:match-ci??</B> <I>pattern</I>
+<DD><P>
+
+Returns a predicate which returns a non-false value if its string argument
+matches (the string) <VAR>pattern</VAR>, false otherwise. Filename matching
+is like
+<A NAME="IDX263"></A>
+<EM>glob</EM> expansion described the bash manpage, except that names
+<A NAME="IDX264"></A>
+beginning with `<SAMP>.</SAMP>' are matched and `<SAMP>/</SAMP>' characters are not
+treated specially.
+</P>
+<P>
+
+These functions interpret the following characters specially in
+<VAR>pattern</VAR> strings:
+</P>
+<DL COMPACT>
+<DT>`<SAMP>*</SAMP>'
+<DD>Matches any string, including the null string.
+<DT>`<SAMP>?</SAMP>'
+<DD>Matches any single character.
+<DT>`<SAMP>[<small>...</small>]</SAMP>'
+<DD>Matches any one of the enclosed characters. A pair of characters
+separated by a minus sign (-) denotes a range; any character lexically
+between those two characters, inclusive, is matched. If the first
+character following the `<SAMP>[</SAMP>' is a `<SAMP>!</SAMP>' or a `<SAMP>^</SAMP>' then any
+character not enclosed is matched. A `<SAMP>-</SAMP>' or `<SAMP>]</SAMP>' may be
+matched by including it as the first or last character in the set.
+</DL>
+</DL>
+<P>
+
+<A NAME="IDX265"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>filename:substitute??</B> <I>pattern template</I>
+<DD><A NAME="IDX266"></A>
+<DT><U>Function:</U> <B>filename:substitute-ci??</B> <I>pattern template</I>
+<DD><P>
+
+Returns a function transforming a single string argument according to
+glob patterns <VAR>pattern</VAR> and <VAR>template</VAR>. <VAR>pattern</VAR> and
+<VAR>template</VAR> must have the same number of wildcard specifications,
+which need not be identical. <VAR>pattern</VAR> and <VAR>template</VAR> may have
+a different number of literal sections. If an argument to the function
+matches <VAR>pattern</VAR> in the sense of <CODE>filename:match??</CODE> then it
+returns a copy of <VAR>template</VAR> in which each wildcard specification is
+replaced by the part of the argument matched by the corresponding
+wildcard specification in <VAR>pattern</VAR>. A <CODE>*</CODE> wildcard matches
+the longest leftmost string possible. If the argument does not match
+<VAR>pattern</VAR> then false is returned.
+</P>
+<P>
+
+<VAR>template</VAR> may be a function accepting the same number of string
+arguments as there are wildcard specifications in <VAR>pattern</VAR>. In
+the case of a match the result of applying <VAR>template</VAR> to a list
+of the substrings matched by wildcard specifications will be returned,
+otherwise <VAR>template</VAR> will not be called and <CODE>#f</CODE> will be returned.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>((filename:substitute?? &quot;scm_[0-9]*.html&quot; &quot;scm5c4_??.htm&quot;)
+ &quot;scm_10.html&quot;)
+=> &quot;scm5c4_10.htm&quot;
+((filename:substitute?? &quot;??&quot; &quot;beg?mid?end&quot;) &quot;AZ&quot;)
+=> &quot;begAmidZend&quot;
+((filename:substitute?? &quot;*na*&quot; &quot;?NA?&quot;) &quot;banana&quot;)
+=> &quot;banaNA&quot;
+((filename:substitute?? &quot;?*?&quot; (lambda (s1 s2 s3) (string-append s3 s1)))
+ &quot;ABZ&quot;)
+=> &quot;ZA&quot;
+</pre></td></tr></table><P>
+
+<A NAME="IDX267"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>replace-suffix</B> <I>str old new</I>
+<DD><P>
+
+<VAR>str</VAR> can be a string or a list of strings. Returns a new string
+(or strings) similar to <CODE>str</CODE> but with the suffix string <VAR>old</VAR>
+removed and the suffix string <VAR>new</VAR> appended. If the end of
+<VAR>str</VAR> does not match <VAR>old</VAR>, an error is signaled.
+</P>
+</DL>
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(replace-suffix &quot;/usr/local/lib/slib/batch.scm&quot; &quot;.scm&quot; &quot;.c&quot;)
+=> &quot;/usr/local/lib/slib/batch.c&quot;
+</pre></td></tr></table><P>
+
+<A NAME="IDX268"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>call-with-tmpnam</B> <I>proc k</I>
+<DD><P>
+
+<A NAME="IDX269"></A>
+<DT><U>Function:</U> <B>call-with-tmpnam</B> <I>proc</I>
+<DD>Calls <VAR>proc</VAR> with <VAR>k</VAR> arguments, strings returned by successive calls to
+<CODE>tmpnam</CODE>.
+If <VAR>proc</VAR> returns, then any files named by the arguments to <VAR>proc</VAR> are
+deleted automatically and the value(s) yielded by the <VAR>proc</VAR> is(are)
+returned. <VAR>k</VAR> may be ommited, in which case it defaults to <CODE>1</CODE>.
+</P>
+<P>
+
+<A NAME="IDX270"></A>
+<DT><U>Function:</U> <B>call-with-tmpnam</B> <I>proc suffix1 <small>...</small></I>
+<DD>Calls <VAR>proc</VAR> with strings returned by successive calls to <CODE>tmpnam</CODE>,
+each with the corresponding <VAR>suffix</VAR> string appended.
+If <VAR>proc</VAR> returns, then any files named by the arguments to <VAR>proc</VAR> are
+deleted automatically and the value(s) yielded by the <VAR>proc</VAR> is(are)
+returned.
+</P>
+</DL>
+<P>
+
+<A NAME="Batch"></A>
+<HR SIZE="6">
+<A NAME="SEC68"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC67"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC69"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.4.7 Batch </H3>
+<!--docid::SEC68::-->
+<P>
+
+<CODE>(require 'batch)</CODE>
+<A NAME="IDX271"></A>
+</P>
+<P>
+
+The batch procedures provide a way to write and execute portable scripts
+for a variety of operating systems. Each <CODE>batch:</CODE> procedure takes
+as its first argument a parameter-list (see section <A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A>). This
+parameter-list argument <VAR>parms</VAR> contains named associations. Batch
+currently uses 2 of these:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>batch-port</CODE>
+<DD>The port on which to write lines of the batch file.
+<DT><CODE>batch-dialect</CODE>
+<DD>The syntax of batch file to generate. Currently supported are:
+<UL>
+<LI>
+unix
+<LI>
+dos
+<LI>
+vms
+<LI>
+amigaos
+<LI>
+system
+<LI>
+*unknown*
+</UL>
+</DL>
+<P>
+
+`<TT>batch.scm</TT>' uses 2 enhanced relational tables
+(see section <A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A>) to store information linking the names of
+<CODE>operating-system</CODE>s to <CODE>batch-dialect</CODE>es.
+</P>
+<P>
+
+<A NAME="IDX272"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:initialize!</B> <I>database</I>
+<DD>Defines <CODE>operating-system</CODE> and <CODE>batch-dialect</CODE> tables and adds
+the domain <CODE>operating-system</CODE> to the enhanced relational database
+<VAR>database</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX273"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*operating-system*</B>
+<DD>Is batch's best guess as to which operating-system it is running under.
+<CODE>*operating-system*</CODE> is set to <CODE>(software-type)</CODE>
+(see section <A HREF="slib_2.html#SEC15">2.2 Configuration</A>) unless <CODE>(software-type)</CODE> is <CODE>unix</CODE>,
+in which case finer distinctions are made.
+</DL>
+<P>
+
+<A NAME="IDX274"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:call-with-output-script</B> <I>parms file proc</I>
+<DD><VAR>proc</VAR> should be a procedure of one argument. If <VAR>file</VAR> is an
+output-port, <CODE>batch:call-with-output-script</CODE> writes an appropriate
+header to <VAR>file</VAR> and then calls <VAR>proc</VAR> with <VAR>file</VAR> as the
+only argument. If <VAR>file</VAR> is a string,
+<CODE>batch:call-with-output-script</CODE> opens a output-file of name
+<VAR>file</VAR>, writes an appropriate header to <VAR>file</VAR>, and then calls
+<VAR>proc</VAR> with the newly opened port as the only argument. Otherwise,
+<CODE>batch:call-with-output-script</CODE> acts as if it was called with the
+result of <CODE>(current-output-port)</CODE> as its third argument.
+</DL>
+<P>
+
+The rest of the <CODE>batch:</CODE> procedures write (or execute if
+<CODE>batch-dialect</CODE> is <CODE>system</CODE>) commands to the batch port which
+has been added to <VAR>parms</VAR> or <CODE>(copy-tree <VAR>parms</VAR>)</CODE> by the
+code:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(adjoin-parameters! <VAR>parms</VAR> (list 'batch-port <VAR>port</VAR>))
+</pre></td></tr></table><P>
+
+<A NAME="IDX275"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:command</B> <I>parms string1 string2 <small>...</small></I>
+<DD>Calls <CODE>batch:try-command</CODE> (below) with arguments, but signals an
+error if <CODE>batch:try-command</CODE> returns <CODE>#f</CODE>.
+</DL>
+<P>
+
+These functions return a non-false value if the command was successfully
+translated into the batch dialect and <CODE>#f</CODE> if not. In the case of
+the <CODE>system</CODE> dialect, the value is non-false if the operation
+suceeded.
+</P>
+<P>
+
+<A NAME="IDX276"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:try-command</B> <I>parms string1 string2 <small>...</small></I>
+<DD>Writes a command to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which executes
+the program named <VAR>string1</VAR> with arguments <VAR>string2</VAR> <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX277"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:try-chopped-command</B> <I>parms arg1 arg2 <small>...</small> list</I>
+<DD>breaks the last argument <VAR>list</VAR> into chunks small enough so that the
+command:
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><VAR>arg1</VAR> <VAR>arg2</VAR> <small>...</small> <VAR>chunk</VAR>
+</pre></td></tr></table><P>
+
+fits withing the platform's maximum command-line length.
+</P>
+<P>
+
+<CODE>batch:try-chopped-command</CODE> calls <CODE>batch:try-command</CODE> with the
+command and returns non-false only if the commands all fit and
+<CODE>batch:try-command</CODE> of each command line returned non-false.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX278"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:run-script</B> <I>parms string1 string2 <small>...</small></I>
+<DD>Writes a command to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which executes
+the batch script named <VAR>string1</VAR> with arguments <VAR>string2</VAR>
+<small>...</small>.
+<P>
+
+<EM>Note:</EM> <CODE>batch:run-script</CODE> and <CODE>batch:try-command</CODE> are not the
+same for some operating systems (VMS).
+</P>
+</DL>
+<P>
+
+<A NAME="IDX279"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:comment</B> <I>parms line1 <small>...</small></I>
+<DD>Writes comment lines <VAR>line1</VAR> <small>...</small> to the <CODE>batch-port</CODE> in
+<VAR>parms</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX280"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:lines-&gt;file</B> <I>parms file line1 <small>...</small></I>
+<DD>Writes commands to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which create a
+file named <VAR>file</VAR> with contents <VAR>line1</VAR> <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX281"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:delete-file</B> <I>parms file</I>
+<DD>Writes a command to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which deletes
+the file named <VAR>file</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX282"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>batch:rename-file</B> <I>parms old-name new-name</I>
+<DD>Writes a command to the <CODE>batch-port</CODE> in <VAR>parms</VAR> which renames
+the file <VAR>old-name</VAR> to <VAR>new-name</VAR>.
+</DL>
+<P>
+
+In addition, batch provides some small utilities very useful for writing
+scripts:
+</P>
+<P>
+
+<A NAME="IDX283"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>truncate-up-to</B> <I>path char</I>
+<DD><A NAME="IDX284"></A>
+<DT><U>Function:</U> <B>truncate-up-to</B> <I>path string</I>
+<DD><A NAME="IDX285"></A>
+<DT><U>Function:</U> <B>truncate-up-to</B> <I>path charlist</I>
+<DD><VAR>path</VAR> can be a string or a list of strings. Returns <VAR>path</VAR>
+sans any prefixes ending with a character of the second argument. This
+can be used to derive a filename moved locally from elsewhere.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(truncate-up-to &quot;/usr/local/lib/slib/batch.scm&quot; &quot;/&quot;)
+=> &quot;batch.scm&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX286"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>string-join</B> <I>joiner string1 <small>...</small></I>
+<DD>Returns a new string consisting of all the strings <VAR>string1</VAR> <small>...</small>
+in order appended together with the string <VAR>joiner</VAR> between each
+adjacent pair.
+</DL>
+<P>
+
+<A NAME="IDX287"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>must-be-first</B> <I>list1 list2</I>
+<DD>Returns a new list consisting of the elements of <VAR>list2</VAR> ordered so
+that if some elements of <VAR>list1</VAR> are <CODE>equal?</CODE> to elements of
+<VAR>list2</VAR>, then those elements will appear first and in the order of
+<VAR>list1</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX288"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>must-be-last</B> <I>list1 list2</I>
+<DD>Returns a new list consisting of the elements of <VAR>list1</VAR> ordered so
+that if some elements of <VAR>list2</VAR> are <CODE>equal?</CODE> to elements of
+<VAR>list1</VAR>, then those elements will appear last and in the order of
+<VAR>list2</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX289"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>os-&gt;batch-dialect</B> <I>osname</I>
+<DD>Returns its best guess for the <CODE>batch-dialect</CODE> to be used for the
+operating-system named <VAR>osname</VAR>. <CODE>os-&gt;batch-dialect</CODE> uses the
+tables added to <VAR>database</VAR> by <CODE>batch:initialize!</CODE>.
+</DL>
+<P>
+
+Here is an example of the use of most of batch's procedures:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'databases)
+<A NAME="IDX290"></A>(require 'parameters)
+<A NAME="IDX291"></A>(require 'batch)
+<A NAME="IDX292"></A>(require 'glob)
+<A NAME="IDX293"></A>
+(define batch (create-database #f 'alist-table))
+(batch:initialize! batch)
+
+(define my-parameters
+ (list (list 'batch-dialect (os-&gt;batch-dialect *operating-system*))
+ (list 'operating-system *operating-system*)
+ (list 'batch-port (current-output-port)))) ;gets filled in later
+
+(batch:call-with-output-script
+ my-parameters
+ &quot;my-batch&quot;
+ (lambda (batch-port)
+ (adjoin-parameters! my-parameters (list 'batch-port batch-port))
+ (and
+ (batch:comment my-parameters
+ &quot;================ Write file with C program.&quot;)
+ (batch:rename-file my-parameters &quot;hello.c&quot; &quot;hello.c~&quot;)
+ (batch:lines-&gt;file my-parameters &quot;hello.c&quot;
+ &quot;#include &lt;stdio.h&gt;&quot;
+ &quot;int main(int argc, char **argv)&quot;
+ &quot;{&quot;
+ &quot; printf(\&quot;hello world\\n\&quot;);&quot;
+ &quot; return 0;&quot;
+ &quot;}&quot; )
+ (batch:command my-parameters &quot;cc&quot; &quot;-c&quot; &quot;hello.c&quot;)
+ (batch:command my-parameters &quot;cc&quot; &quot;-o&quot; &quot;hello&quot;
+ (replace-suffix &quot;hello.c&quot; &quot;.c&quot; &quot;.o&quot;))
+ (batch:command my-parameters &quot;hello&quot;)
+ (batch:delete-file my-parameters &quot;hello&quot;)
+ (batch:delete-file my-parameters &quot;hello.c&quot;)
+ (batch:delete-file my-parameters &quot;hello.o&quot;)
+ (batch:delete-file my-parameters &quot;my-batch&quot;)
+ )))
+</pre></td></tr></table><P>
+
+Produces the file `<TT>my-batch</TT>':
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>#! /bin/sh
+# &quot;my-batch&quot; script created by SLIB/batch Sun Oct 31 18:24:10 1999
+# ================ Write file with C program.
+mv -f hello.c hello.c~
+rm -f hello.c
+echo '#include &lt;stdio.h&gt;'&gt;&gt;hello.c
+echo 'int main(int argc, char **argv)'&gt;&gt;hello.c
+echo '{'&gt;&gt;hello.c
+echo ' printf(&quot;hello world\n&quot;);'&gt;&gt;hello.c
+echo ' return 0;'&gt;&gt;hello.c
+echo '}'&gt;&gt;hello.c
+cc -c hello.c
+cc -o hello hello.o
+hello
+rm -f hello
+rm -f hello.c
+rm -f hello.o
+rm -f my-batch
+</pre></td></tr></table><P>
+
+When run, `<TT>my-batch</TT>' prints:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>bash$ my-batch
+mv: hello.c: No such file or directory
+hello world
+</pre></td></tr></table><P>
+
+<A NAME="HTML"></A>
+<HR SIZE="6">
+<A NAME="SEC69"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC68"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC70"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.5 HTML </H2>
+<!--docid::SEC69::-->
+<P>
+
+<CODE>(require 'html-form)</CODE>
+<A NAME="IDX294"></A>
+</P>
+<P>
+
+<A NAME="IDX295"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:atval</B> <I>txt</I>
+<DD>Returns a string with character substitutions appropriate to
+send <VAR>txt</VAR> as an <EM>attribute-value</EM>.
+<A NAME="IDX296"></A>
+</DL>
+<P>
+
+<A NAME="IDX297"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:plain</B> <I>txt</I>
+<DD>Returns a string with character substitutions appropriate to
+send <VAR>txt</VAR> as an <EM>plain-text</EM>.
+<A NAME="IDX298"></A>
+</DL>
+<P>
+
+<A NAME="IDX299"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:meta</B> <I>name content</I>
+<DD>Returns a tag of meta-information suitable for passing as the
+third argument to <CODE>html:head</CODE>. The tag produced is `<SAMP>&lt;META
+NAME=&quot;<VAR>name</VAR>&quot; CONTENT=&quot;<VAR>content</VAR>&quot;&gt;</SAMP>'. The string or symbol <VAR>name</VAR> can be
+`<SAMP>author</SAMP>', `<SAMP>copyright</SAMP>', `<SAMP>keywords</SAMP>', `<SAMP>description</SAMP>',
+`<SAMP>date</SAMP>', `<SAMP>robots</SAMP>', <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX300"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:http-equiv</B> <I>name content</I>
+<DD>Returns a tag of HTTP information suitable for passing as the
+third argument to <CODE>html:head</CODE>. The tag produced is `<SAMP>&lt;META
+HTTP-EQUIV=&quot;<VAR>name</VAR>&quot; CONTENT=&quot;<VAR>content</VAR>&quot;&gt;</SAMP>'. The string or symbol <VAR>name</VAR> can be
+`<SAMP>Expires</SAMP>', `<SAMP>PICS-Label</SAMP>', `<SAMP>Content-Type</SAMP>',
+`<SAMP>Refresh</SAMP>', <small>...</small>.
+</DL>
+<P>
+
+<A NAME="IDX301"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:meta-refresh</B> <I>delay uri</I>
+<DD><P>
+
+<A NAME="IDX302"></A>
+<DT><U>Function:</U> <B>html:meta-refresh</B> <I>delay</I>
+<DD></P>
+<P>
+
+Returns a tag suitable for passing as the third argument to
+<CODE>html:head</CODE>. If <VAR>uri</VAR> argument is supplied, then <VAR>delay</VAR> seconds after
+displaying the page with this tag, Netscape or IE browsers will fetch
+and display <VAR>uri</VAR>. Otherwise, <VAR>delay</VAR> seconds after displaying the page with
+this tag, Netscape or IE browsers will fetch and redisplay this page.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX303"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:head</B> <I>title backlink tags <small>...</small></I>
+<DD><P>
+
+<A NAME="IDX304"></A>
+<DT><U>Function:</U> <B>html:head</B> <I>title backlink</I>
+<DD></P>
+<P>
+
+<A NAME="IDX305"></A>
+<DT><U>Function:</U> <B>html:head</B> <I>title</I>
+<DD></P>
+<P>
+
+Returns header string for an HTML page named <VAR>title</VAR>. If <VAR>backlink</VAR> is a string,
+it is used verbatim between the `<SAMP>H1</SAMP>' tags; otherwise <VAR>title</VAR> is
+used. If string arguments <VAR>tags</VAR> ... are supplied, then they are
+included verbatim within the <TT>&lt;HEAD&gt;</TT> section.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX306"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:body</B> <I>body <small>...</small></I>
+<DD>Returns HTML string to end a page.
+</DL>
+<P>
+
+<A NAME="IDX307"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:pre</B> <I>line1 line <small>...</small></I>
+<DD>Returns the strings <VAR>line1</VAR>, <VAR>lines</VAR> as <EM>PRE</EM>formmated plain text
+<A NAME="IDX308"></A>
+(rendered in fixed-width font). Newlines are inserted between <VAR>line1</VAR>,
+<VAR>lines</VAR>. HTML tags (`<SAMP>&lt;tag&gt;</SAMP>') within <VAR>lines</VAR> will be visible verbatim.
+</DL>
+<P>
+
+<A NAME="IDX309"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:comment</B> <I>line1 line <small>...</small></I>
+<DD>Returns the strings <VAR>line1</VAR> as HTML comments.
+</DL>
+<HR SIZE="6">
+<A NAME="SEC70"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC69"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC71"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.6 HTML Forms </H2>
+<!--docid::SEC70::-->
+<P>
+
+<A NAME="IDX310"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:form</B> <I>method action body <small>...</small></I>
+<DD>The symbol <VAR>method</VAR> is either <CODE>get</CODE>, <CODE>head</CODE>, <CODE>post</CODE>,
+<CODE>put</CODE>, or <CODE>delete</CODE>. The strings <VAR>body</VAR> form the body of the
+form. <CODE>html:form</CODE> returns the HTML <EM>form</EM>.
+<A NAME="IDX311"></A>
+</DL>
+<P>
+
+<A NAME="IDX312"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:hidden</B> <I>name value</I>
+<DD>Returns HTML string which will cause <VAR>name</VAR>=<VAR>value</VAR> in form.
+</DL>
+<P>
+
+<A NAME="IDX313"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:checkbox</B> <I>pname default</I>
+<DD>Returns HTML string for check box.
+</DL>
+<P>
+
+<A NAME="IDX314"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:text</B> <I>pname default size <small>...</small></I>
+<DD>Returns HTML string for one-line text box.
+</DL>
+<P>
+
+<A NAME="IDX315"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:text-area</B> <I>pname default-list</I>
+<DD>Returns HTML string for multi-line text box.
+</DL>
+<P>
+
+<A NAME="IDX316"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:select</B> <I>pname arity default-list foreign-values</I>
+<DD>Returns HTML string for pull-down menu selector.
+</DL>
+<P>
+
+<A NAME="IDX317"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:buttons</B> <I>pname arity default-list foreign-values</I>
+<DD>Returns HTML string for any-of selector.
+</DL>
+<P>
+
+<A NAME="IDX318"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:submit</B> <I>submit-label command</I>
+<DD><P>
+
+<A NAME="IDX319"></A>
+<DT><U>Function:</U> <B>form:submit</B> <I>submit-label</I>
+<DD></P>
+<P>
+
+The string or symbol <VAR>submit-label</VAR> appears on the button which submits the form.
+If the optional second argument <VAR>command</VAR> is given, then <CODE>*command*=<VAR>command</VAR></CODE>
+and <CODE>*button*=<VAR>submit-label</VAR></CODE> are set in the query. Otherwise,
+<CODE>*command*=<VAR>submit-label</VAR></CODE> is set in the query.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX320"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:image</B> <I>submit-label image-src</I>
+<DD>The <VAR>image-src</VAR> appears on the button which submits the form.
+</DL>
+<P>
+
+<A NAME="IDX321"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:reset</B>
+<DD>Returns a string which generates a <EM>reset</EM> button.
+<A NAME="IDX322"></A>
+</DL>
+<P>
+
+<A NAME="IDX323"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:element</B> <I>pname arity default-list foreign-values</I>
+<DD>Returns a string which generates an INPUT element for the field
+named <VAR>pname</VAR>. The element appears in the created form with its
+representation determined by its <VAR>arity</VAR> and domain. For domains which
+are foreign-keys:
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>single</CODE>
+<DD>select menu
+<DT><CODE>optional</CODE>
+<DD>select menu
+<DT><CODE>nary</CODE>
+<DD>check boxes
+<DT><CODE>nary1</CODE>
+<DD>check boxes
+</DL>
+<P>
+
+If the foreign-key table has a field named `<SAMP>visible-name</SAMP>', then
+the contents of that field are the names visible to the user for
+those choices. Otherwise, the foreign-key itself is visible.
+</P>
+<P>
+
+For other types of domains:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><CODE>single</CODE>
+<DD>text area
+<DT><CODE>optional</CODE>
+<DD>text area
+<DT><CODE>boolean</CODE>
+<DD>check box
+<DT><CODE>nary</CODE>
+<DD>text area
+<DT><CODE>nary1</CODE>
+<DD>text area
+</DL>
+</DL>
+<P>
+
+<A NAME="IDX324"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>form:delimited</B> <I>pname doc aliat arity default-list foreign-values</I>
+<DD><P>
+
+Returns a HTML string for a form element embedded in a line of a
+delimited list. Apply map <CODE>form:delimited</CODE> to the list returned by
+<CODE>command-&gt;p-specs</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX325"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:delimited-list</B> <I>row <small>...</small></I>
+<DD>Wraps its arguments with delimited-list (`<SAMP>DL</SAMP>' command.
+</DL>
+<P>
+
+<A NAME="IDX326"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>get-foreign-choices</B> <I>tab</I>
+<DD>Returns a list of the `<SAMP>visible-name</SAMP>' or first fields of
+table <VAR>tab</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX327"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>command-&gt;p-specs</B> <I>rdb command-table command</I>
+<DD><P>
+
+The symbol <VAR>command-table</VAR> names a command table in the <VAR>rdb</VAR> relational database.
+The symbol <VAR>command</VAR> names a key in <VAR>command-table</VAR>.
+</P>
+<P>
+
+<CODE>command-&gt;p-specs</CODE> returns a list of lists of <VAR>pname</VAR>, <VAR>doc</VAR>, <VAR>aliat</VAR>,
+<VAR>arity</VAR>, <VAR>default-list</VAR>, and <VAR>foreign-values</VAR>. The
+returned list has one element for each parameter of command <VAR>command</VAR>.
+</P>
+<P>
+
+This example demonstrates how to create a HTML-form for the `<SAMP>build</SAMP>'
+command.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require (in-vicinity (implementation-vicinity) &quot;build.scm&quot;))
+(call-with-output-file &quot;buildscm.html&quot;
+ (lambda (port)
+ (display
+ (string-append
+ (html:head 'commands)
+ (html:body
+ (sprintf #f &quot;&lt;H2&gt;%s:&lt;/H2&gt;&lt;BLOCKQUOTE&gt;%s&lt;/BLOCKQUOTE&gt;\\n&quot;
+ (html:plain 'build)
+ (html:plain ((comtab 'get 'documentation) 'build)))
+ (html:form
+ 'post
+ (or &quot;http://localhost:8081/buildscm&quot; &quot;/cgi-bin/build.cgi&quot;)
+ (apply html:delimited-list
+ (apply map form:delimited
+ (command-&gt;p-specs build '*commands* 'build)))
+ (form:submit 'build)
+ (form:reset))))
+ port)))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="HTML Tables"></A>
+<HR SIZE="6">
+<A NAME="SEC71"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC70"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC72"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.7 HTML Tables </H2>
+<!--docid::SEC71::-->
+<P>
+
+<CODE>(require 'db-&gt;html)</CODE>
+<A NAME="IDX328"></A>
+</P>
+<P>
+
+<A NAME="IDX329"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:table</B> <I>options row <small>...</small></I>
+<DD><P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX330"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:caption</B> <I>caption align</I>
+<DD><P>
+
+<A NAME="IDX331"></A>
+<DT><U>Function:</U> <B>html:caption</B> <I>caption</I>
+<DD><VAR>align</VAR> can be `<SAMP>top</SAMP>' or `<SAMP>bottom</SAMP>'.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX332"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:heading</B> <I>columns</I>
+<DD>Outputs a heading row for the currently-started table.
+</DL>
+<P>
+
+<A NAME="IDX333"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:href-heading</B> <I>columns uris</I>
+<DD>Outputs a heading row with column-names <VAR>columns</VAR> linked to URIs <VAR>uris</VAR>.
+</DL>
+<P>
+
+<A NAME="IDX334"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:linked-row-converter</B> <I>k foreigns</I>
+<DD><P>
+
+The positive integer <VAR>k</VAR> is the primary-key-limit (number of
+primary-keys) of the table. <VAR>foreigns</VAR> is a list of the filenames of
+foreign-key field pages and #f for non foreign-key fields.
+</P>
+<P>
+
+<CODE>html:linked-row-converter</CODE> returns a procedure taking a row for its single argument. This
+returned procedure returns the html string for that table row.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX335"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>table-name-&gt;filename</B> <I>table-name</I>
+<DD><P>
+
+Returns the symbol <VAR>table-name</VAR> converted to a filename.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX336"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>table-&gt;linked-html</B> <I>caption db table-name match-key1 <small>...</small></I>
+<DD><P>
+
+Returns HTML string for <VAR>db</VAR> table <VAR>table-name</VAR>. Every foreign-key value is
+linked to the page (of the table) defining that key.
+</P>
+<P>
+
+The optional <VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a subset of
+the table. See section <A HREF="slib_6.html#SEC147">match-key</A>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX337"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>table-&gt;linked-page</B> <I>db table-name index-filename arg <small>...</small></I>
+<DD><P>
+
+Returns a complete HTML page. The string <VAR>index-filename</VAR> names the page which
+refers to this one.
+</P>
+<P>
+
+The optional <VAR>args</VAR> <small>...</small> arguments restrict actions to a subset of
+the table. See section <A HREF="slib_6.html#SEC147">match-key</A>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX338"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>catalog-&gt;html</B> <I>db caption arg <small>...</small></I>
+<DD><P>
+
+Returns HTML string for the catalog table of <VAR>db</VAR>.
+</P>
+</DL>
+<HR SIZE="6">
+<A NAME="SEC72"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC71"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC73"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.7.1 HTML editing tables </H3>
+<!--docid::SEC72::-->
+<P>
+
+A client can modify one row of an editable table at a time.
+For any change submitted, these routines check if that row has been
+modified during the time the user has been editing the form. If so,
+an error page results.
+</P>
+<P>
+
+The behavior of edited rows is:
+</P>
+<P>
+
+<UL>
+<LI>
+If no fields are changed, then no change is made to the table.
+<LI>
+If the primary keys equal null-keys (parameter defaults), and no other
+user has modified that row, then that row is deleted.
+<LI>
+If only primary keys are changed, there are non-key fields, and no
+row with the new keys is in the table, then the old row is
+deleted and one with the new keys is inserted.
+<LI>
+If only non-key fields are changed, and that row has not been
+modified by another user, then the row is changed to reflect the
+fields.
+<LI>
+If both keys and non-key fields are changed, and no row with the
+new keys is in the table, then a row is created with the new
+keys and fields.
+<LI>
+If fields are changed, all fields are primary keys, and no row with
+the new keys is in the table, then a row is created with the new
+keys.
+</UL>
+<P>
+
+After any change to the table, a <CODE>sync-database</CODE> of the
+database is performed.
+</P>
+<P>
+
+<A NAME="IDX339"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>command:modify-table</B> <I>table-name null-keys update delete retrieve</I>
+<DD><P>
+
+<A NAME="IDX340"></A>
+<DT><U>Function:</U> <B>command:modify-table</B> <I>table-name null-keys update delete</I>
+<DD></P>
+<P>
+
+<A NAME="IDX341"></A>
+<DT><U>Function:</U> <B>command:modify-table</B> <I>table-name null-keys update</I>
+<DD></P>
+<P>
+
+<A NAME="IDX342"></A>
+<DT><U>Function:</U> <B>command:modify-table</B> <I>table-name null-keys</I>
+<DD></P>
+<P>
+
+Returns procedure (of <VAR>db</VAR>) which returns procedure to modify
+row of <VAR>table-name</VAR>. <VAR>null-keys</VAR> is the list of <EM>null</EM> keys indicating the row is
+<A NAME="IDX343"></A>
+to be deleted when any matches its corresponding primary key.
+Optional arguments <VAR>update</VAR>, <VAR>delete</VAR>, and <VAR>retrieve</VAR> default to the <CODE>row:update</CODE>,
+<CODE>row:delete</CODE>, and <CODE>row:retrieve</CODE> of <VAR>table-name</VAR> in <VAR>db</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX344"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>command:make-editable-table</B> <I>rdb table-name arg <small>...</small></I>
+<DD>Given <VAR>table-name</VAR> in <VAR>rdb</VAR>, creates parameter and <CODE>*command*</CODE> tables
+for editing one row of <VAR>table-name</VAR> at a time. <CODE>command:make-editable-table</CODE> returns a procedure taking a
+row argument which returns the HTML string for editing that row.
+<P>
+
+Optional <VAR>args</VAR> are expressions (lists) added to the call to
+<CODE>command:modify-table</CODE>.
+</P>
+<P>
+
+The domain name of a column determines the expected arity of the data
+stored in that column. Domain names ending in:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT>`<SAMP>*</SAMP>'
+<DD>have arity `<SAMP>nary</SAMP>';
+<DT>`<SAMP>+</SAMP>'
+<DD>have arity `<SAMP>nary1</SAMP>'.
+</DL>
+</DL>
+<P>
+
+<A NAME="IDX345"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:editable-row-converter</B> <I>k names edit-point edit-converter</I>
+<DD><P>
+
+The positive integer <VAR>k</VAR> is the primary-key-limit (number of
+primary-keys) of the table. <VAR>names</VAR> is a list of the field-names. <VAR>edit-point</VAR> is
+the list of primary-keys denoting the row to edit (or #f). <VAR>edit-converter</VAR> is the
+procedure called with <VAR>k</VAR>, <VAR>names</VAR>, and the row to edit.
+</P>
+<P>
+
+<CODE>html:editable-row-converter</CODE> returns a procedure taking a row for its single argument. This
+returned procedure returns the html string for that table row.
+</P>
+<P>
+
+Each HTML table constructed using <CODE>html:editable-row-converter</CODE> has first <VAR>k</VAR> fields (typically
+the primary key fields) of each row linked to a text encoding of these
+fields (the result of calling <CODE>row-&gt;anchor</CODE>). The page so
+referenced typically allows the user to edit fields of that row.
+</P>
+</DL>
+<HR SIZE="6">
+<A NAME="SEC73"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC72"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC74"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.7.2 HTML databases </H3>
+<!--docid::SEC73::-->
+<P>
+
+<A NAME="IDX346"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>db-&gt;html-files</B> <I>db dir index-filename caption</I>
+<DD><VAR>db</VAR> must be a relational database. <VAR>dir</VAR> must be #f or a
+non-empty string naming an existing sub-directory of the current
+directory.
+<P>
+
+<CODE>db-&gt;html-files</CODE> creates an html page for each table in the database <VAR>db</VAR> in the
+sub-directory named <VAR>dir</VAR>, or the current directory if <VAR>dir</VAR> is #f. The
+top level page with the catalog of tables (captioned <VAR>caption</VAR>) is written
+to a file named <VAR>index-filename</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX347"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>db-&gt;html-directory</B> <I>db dir index-filename</I>
+<DD><P>
+
+<A NAME="IDX348"></A>
+<DT><U>Function:</U> <B>db-&gt;html-directory</B> <I>db dir</I>
+<DD><VAR>db</VAR> must be a relational database. <VAR>dir</VAR> must be a non-empty
+string naming an existing sub-directory of the current directory or
+one to be created. The optional string <VAR>index-filename</VAR> names the filename of the
+top page, which defaults to `<TT>index.html</TT>'.
+</P>
+<P>
+
+<CODE>db-&gt;html-directory</CODE> creates sub-directory <VAR>dir</VAR> if neccessary, and calls
+<CODE>(db-&gt;html-files <VAR>db</VAR> <VAR>dir</VAR> <VAR>index-filename</VAR> <VAR>dir</VAR>)</CODE>. The `<SAMP>file:</SAMP>' URI of <VAR>index-filename</VAR> is
+returned.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX349"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>db-&gt;netscape</B> <I>db dir index-filename</I>
+<DD><P>
+
+<A NAME="IDX350"></A>
+<DT><U>Function:</U> <B>db-&gt;netscape</B> <I>db dir</I>
+<DD><CODE>db-&gt;netscape</CODE> is just like <CODE>db-&gt;html-directory</CODE>, but calls
+<CODE>browse-url</CODE> with the uri for the top page after the
+pages are created.
+</P>
+</DL>
+<P>
+
+<A NAME="HTTP and CGI"></A>
+<HR SIZE="6">
+<A NAME="SEC74"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC73"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC75"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.8 HTTP and CGI </H2>
+<!--docid::SEC74::-->
+<P>
+
+<CODE>(require 'http)</CODE> or <CODE>(require 'cgi)</CODE>
+<A NAME="IDX351"></A>
+<A NAME="IDX352"></A>
+</P>
+<P>
+
+<A NAME="IDX353"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:header</B> <I>alist</I>
+<DD>Returns a string containing lines for each element of <VAR>alist</VAR>; the
+<CODE>car</CODE> of which is followed by `<SAMP>: </SAMP>', then the <CODE>cdr</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX354"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:content</B> <I>alist body <small>...</small></I>
+<DD>Returns the concatenation of strings <VAR>body</VAR> with the
+<CODE>(http:header <VAR>alist</VAR>)</CODE> and the `<SAMP>Content-Length</SAMP>' prepended.
+</DL>
+<P>
+
+<A NAME="IDX355"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*http:byline*</B>
+<DD>String appearing at the bottom of error pages.
+</DL>
+<P>
+
+<A NAME="IDX356"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:error-page</B> <I>status-code reason-phrase html-string <small>...</small></I>
+<DD><VAR>status-code</VAR> and <VAR>reason-phrase</VAR> should be an integer and string as specified in
+<CITE>RFC 2068</CITE>. The returned page (string) will show the <VAR>status-code</VAR> and <VAR>reason-phrase</VAR>
+and any additional <VAR>html-strings</VAR> <small>...</small>; with <VAR>*http:byline*</VAR> or SLIB's
+default at the bottom.
+</DL>
+<P>
+
+<A NAME="IDX357"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:forwarding-page</B> <I>title delay uri html-string <small>...</small></I>
+<DD>The string or symbol <VAR>title</VAR> is the page title. <VAR>delay</VAR> is a non-negative
+integer. The <VAR>html-strings</VAR> <small>...</small> are typically used to explain to the user why
+this page is being forwarded.
+<P>
+
+<CODE>http:forwarding-page</CODE> returns an HTML string for a page which automatically forwards to
+<VAR>uri</VAR> after <VAR>delay</VAR> seconds. The returned page (string) contains any <VAR>html-strings</VAR>
+<small>...</small> followed by a manual link to <VAR>uri</VAR>, in case the browser does not
+forward automatically.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX358"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>http:serve-query</B> <I>serve-proc input-port output-port</I>
+<DD>reads the <EM>URI</EM> and <EM>query-string</EM> from <VAR>input-port</VAR>. If the
+<A NAME="IDX359"></A>
+<A NAME="IDX360"></A>
+query is a valid `<SAMP>&quot;POST&quot;</SAMP>' or `<SAMP>&quot;GET&quot;</SAMP>' query, then <CODE>http:serve-query</CODE> calls
+<VAR>serve-proc</VAR> with three arguments, the <VAR>request-line</VAR>, <VAR>query-string</VAR>,
+and <VAR>header-alist</VAR>. Otherwise, <CODE>http:serve-query</CODE> calls <VAR>serve-proc</VAR> with the
+<VAR>request-line</VAR>, #f, and <VAR>header-alist</VAR>.
+<P>
+
+If <VAR>serve-proc</VAR> returns a string, it is sent to <VAR>output-port</VAR>. If <VAR>serve-proc</VAR> returns a list,
+then an error page with number 525 and strings from the list. If <VAR>serve-proc</VAR>
+returns #f, then a `<SAMP>Bad Request</SAMP>' (400) page is sent to <VAR>output-port</VAR>.
+</P>
+<P>
+
+Otherwise, <CODE>http:serve-query</CODE> replies (to <VAR>output-port</VAR>) with appropriate HTML describing the
+problem.
+</P>
+</DL>
+<P>
+
+This example services HTTP queries from <VAR>port-number</VAR>:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>
+(define socket (make-stream-socket AF_INET 0))
+(and (socket:bind socket port-number) ; AF_INET INADDR_ANY
+ (socket:listen socket 10) ; Queue up to 10 requests.
+ (dynamic-wind
+ (lambda () #f)
+ (lambda ()
+ (do ((port (socket:accept socket) (socket:accept socket)))
+ (#f)
+ (let ((iport (duplicate-port port &quot;r&quot;))
+ (oport (duplicate-port port &quot;w&quot;)))
+ (http:serve-query build:serve iport oport)
+ (close-port iport)
+ (close-port oport))
+ (close-port port)))
+ (lambda () (close-port socket))))
+</pre></td></tr></table><P>
+
+<A NAME="IDX361"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>cgi:serve-query</B> <I>serve-proc</I>
+<DD>reads the <EM>URI</EM> and <EM>query-string</EM> from
+<A NAME="IDX362"></A>
+<A NAME="IDX363"></A>
+<CODE>(current-input-port)</CODE>. If the query is a valid `<SAMP>&quot;POST&quot;</SAMP>'
+or `<SAMP>&quot;GET&quot;</SAMP>' query, then <CODE>cgi:serve-query</CODE> calls <VAR>serve-proc</VAR> with three arguments, the
+<VAR>request-line</VAR>, <VAR>query-string</VAR>, and <VAR>header-alist</VAR>.
+Otherwise, <CODE>cgi:serve-query</CODE> calls <VAR>serve-proc</VAR> with the <VAR>request-line</VAR>, #f, and
+<VAR>header-alist</VAR>.
+<P>
+
+If <VAR>serve-proc</VAR> returns a string, it is sent to <CODE>(current-input-port)</CODE>.
+If <VAR>serve-proc</VAR> returns a list, then an error page with number 525 and strings
+from the list. If <VAR>serve-proc</VAR> returns #f, then a `<SAMP>Bad Request</SAMP>' (400)
+page is sent to <CODE>(current-input-port)</CODE>.
+</P>
+<P>
+
+Otherwise, <CODE>cgi:serve-query</CODE> replies (to <CODE>(current-input-port)</CODE>) with
+appropriate HTML describing the problem.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX364"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-query-alist-command-server</B> <I>rdb command-table</I>
+<DD><P>
+
+<A NAME="IDX365"></A>
+<DT><U>Function:</U> <B>make-query-alist-command-server</B> <I>rdb command-table #t</I>
+<DD></P>
+<P>
+
+Returns a procedure of one argument. When that procedure is called
+with a <VAR>query-alist</VAR> (as returned by <CODE>uri:decode-query</CODE>, the
+value of the `<SAMP>*command*</SAMP>' association will be the command invoked
+in <VAR>command-table</VAR>. If `<SAMP>*command*</SAMP>' is not in the <VAR>query-alist</VAR> then the
+value of `<SAMP>*suggest*</SAMP>' is tried. If neither name is in the
+<VAR>query-alist</VAR>, then the literal value `<SAMP>*default*</SAMP>' is tried in
+<VAR>command-table</VAR>.
+</P>
+<P>
+
+If optional third argument is non-false, then the command is called
+with just the parameter-list; otherwise, command is called with the
+arguments described in its table.
+</P>
+</DL>
+<P>
+
+<A NAME="Parsing HTML"></A>
+<HR SIZE="6">
+<A NAME="SEC75"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC74"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC76"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.9 Parsing HTML </H2>
+<!--docid::SEC75::-->
+<P>
+
+<CODE>(require 'html-for-each)</CODE>
+<A NAME="IDX366"></A>
+</P>
+<P>
+
+<A NAME="IDX367"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html-for-each</B> <I>file word-proc markup-proc white-proc newline-proc</I>
+<DD><P>
+
+<VAR>file</VAR> is an input port or a string naming an existing file containing
+HTML text.
+<VAR>word-proc</VAR> is a procedure of one argument or #f.
+<VAR>markup-proc</VAR> is a procedure of one argument or #f.
+<VAR>white-proc</VAR> is a procedure of one argument or #f.
+<VAR>newline-proc</VAR> is a procedure of no arguments or #f.
+</P>
+<P>
+
+<CODE>html-for-each</CODE> opens and reads characters from port <VAR>file</VAR> or the file named by
+string <VAR>file</VAR>. Sequential groups of characters are assembled into
+strings which are either
+</P>
+<P>
+
+<UL>
+<LI>
+enclosed by `<SAMP>&lt;</SAMP>' and `<SAMP>&gt;</SAMP>' (hypertext markups or comments);
+<LI>
+end-of-line;
+<LI>
+whitespace; or
+<LI>
+none of the above (words).
+</UL>
+<P>
+
+Procedures are called according to these distinctions in order of
+the string's occurrence in <VAR>file</VAR>.
+</P>
+<P>
+
+<VAR>newline-proc</VAR> is called with no arguments for end-of-line <EM>not within a
+markup or comment</EM>.
+</P>
+<P>
+
+<VAR>white-proc</VAR> is called with strings of non-newline whitespace.
+</P>
+<P>
+
+<VAR>markup-proc</VAR> is called with hypertext markup strings (including `<SAMP>&lt;</SAMP>' and
+`<SAMP>&gt;</SAMP>').
+</P>
+<P>
+
+<VAR>word-proc</VAR> is called with the remaining strings.
+</P>
+<P>
+
+<CODE>html-for-each</CODE> returns an unspecified value.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX368"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:read-title</B> <I>file limit</I>
+<DD><P>
+
+<A NAME="IDX369"></A>
+<DT><U>Function:</U> <B>html:read-title</B> <I>file</I>
+<DD><VAR>file</VAR> is an input port or a string naming an existing file containing
+HTML text. If supplied, <VAR>limit</VAR> must be an integer. <VAR>limit</VAR> defaults to
+1000.
+</P>
+<P>
+
+<CODE>html:read-title</CODE> opens and reads HTML from port <VAR>file</VAR> or the file named by string <VAR>file</VAR>,
+until reaching the (mandatory) `<SAMP>TITLE</SAMP>' field. <CODE>html:read-title</CODE> returns the
+title string with adjacent whitespaces collapsed to one space. <CODE>html:read-title</CODE>
+returns #f if the title field is empty, absent, if the first
+character read from <VAR>file</VAR> is not `<SAMP>#\&lt;</SAMP>', or if the end of title is
+not found within the first (approximately) <VAR>limit</VAR> words.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX370"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>htm-fields</B> <I>htm</I>
+<DD><P>
+
+<VAR>htm</VAR> is a hypertext markup string.
+</P>
+<P>
+
+If <VAR>htm</VAR> is a (hypertext) comment, then <CODE>htm-fields</CODE> returns #f.
+Otherwise <CODE>htm-fields</CODE> returns the hypertext element symbol (created by
+<CODE>string-ci-&gt;symbol</CODE>) consed onto an association list of the
+attribute name-symbols and values. Each value is a number or
+string; or #t if the name had no value assigned within the markup.
+</P>
+</DL>
+<P>
+
+<A NAME="URI"></A>
+<HR SIZE="6">
+<A NAME="SEC76"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC75"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.10 URI </H2>
+<!--docid::SEC76::-->
+<P>
+
+<CODE>(require 'uri)</CODE>
+<A NAME="IDX371"></A>
+</P>
+<P>
+
+Implements <EM>Uniform Resource Identifiers</EM> (URI) as
+<A NAME="IDX372"></A>
+described in RFC 2396.
+</P>
+<P>
+
+<A NAME="IDX373"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>make-uri</B>
+<DD><P>
+
+<A NAME="IDX374"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>fragment</I>
+<DD></P>
+<P>
+
+<A NAME="IDX375"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>query fragment</I>
+<DD></P>
+<P>
+
+<A NAME="IDX376"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>path query fragment</I>
+<DD></P>
+<P>
+
+<A NAME="IDX377"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>authority path query fragment</I>
+<DD></P>
+<P>
+
+<A NAME="IDX378"></A>
+<DT><U>Function:</U> <B>make-uri</B> <I>scheme authority path query fragment</I>
+<DD></P>
+<P>
+
+Returns a Uniform Resource Identifier string from component arguments.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX379"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri:make-path</B> <I>path</I>
+<DD><P>
+
+Returns a URI string combining the components of list <VAR>path</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX380"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:anchor</B> <I>name</I>
+<DD>Returns a string which defines this location in the (HTML) file
+as <VAR>name</VAR>. The hypertext `<SAMP>&lt;A HREF=&quot;#<VAR>name</VAR>&quot;&gt;</SAMP>' will link to this point.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(html:anchor &quot;(section 7)&quot;)
+=>
+&quot;&lt;A NAME=\&quot;(section%207)\&quot;&gt;&lt;/A&gt;&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX381"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:link</B> <I>uri highlighted</I>
+<DD>Returns a string which links the <VAR>highlighted</VAR> text to <VAR>uri</VAR>.
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(html:link (make-uri &quot;(section 7)&quot;) &quot;section 7&quot;)
+=>
+&quot;&lt;A HREF=\&quot;#(section%207)\&quot;&gt;section 7&lt;/A&gt;&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX382"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:base</B> <I>uri</I>
+<DD>Returns a string specifying the <EM>base</EM> <VAR>uri</VAR> of a document, for
+<A NAME="IDX383"></A>
+inclusion in the HEAD of the document (see section <A HREF="slib_4.html#SEC69">head</A>).
+</DL>
+<P>
+
+<A NAME="IDX384"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>html:isindex</B> <I>prompt</I>
+<DD>Returns a string specifying the search <VAR>prompt</VAR> of a document, for
+inclusion in the HEAD of the document (see section <A HREF="slib_4.html#SEC69">head</A>).
+</DL>
+<P>
+
+<A NAME="IDX385"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri-&gt;tree</B> <I>uri-reference base-tree</I>
+<DD><P>
+
+<A NAME="IDX386"></A>
+<DT><U>Function:</U> <B>uri-&gt;tree</B> <I>uri-reference</I>
+<DD></P>
+<P>
+
+Returns a list of 5 elements corresponding to the parts
+(<VAR>scheme</VAR> <VAR>authority</VAR> <VAR>path</VAR> <VAR>query</VAR> <VAR>fragment</VAR>)
+of string <VAR>uri-reference</VAR>. Elements corresponding to absent parts are #f.
+</P>
+<P>
+
+The <VAR>path</VAR> is a list of strings. If the first string is empty,
+then the path is absolute; otherwise relative. The optional <VAR>base-tree</VAR> is a
+tree as returned by <CODE>uri-&gt;tree</CODE>; and is used as the base address for relative
+URIs.
+</P>
+<P>
+
+If the <VAR>authority</VAR> component is a
+<EM>Server-based Naming Authority</EM>, then it is a list of the
+<A NAME="IDX387"></A>
+<VAR>userinfo</VAR>, <VAR>host</VAR>, and <VAR>port</VAR> strings (or #f). For other
+types of <VAR>authority</VAR> components the <VAR>authority</VAR> will be a
+string.
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(uri-&gt;tree &quot;http://www.ics.uci.edu/pub/ietf/uri/#Related&quot;)
+=>
+(http &quot;www.ics.uci.edu&quot; (&quot;&quot; &quot;pub&quot; &quot;ietf&quot; &quot;uri&quot; &quot;&quot;) #f &quot;Related&quot;)
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX388"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri:split-fields</B> <I>txt chr</I>
+<DD><P>
+
+Returns a list of <VAR>txt</VAR> split at each occurrence of <VAR>chr</VAR>. <VAR>chr</VAR> does not
+appear in the returned list of strings.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX389"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri:decode-query</B> <I>query-string</I>
+<DD>Converts a <EM>URI</EM> encoded <VAR>query-string</VAR> to a query-alist.
+<A NAME="IDX390"></A>
+</DL>
+<P>
+
+<CODE>uric:</CODE> prefixes indicate procedures dealing with
+URI-components.
+</P>
+<P>
+
+<A NAME="IDX391"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uric:encode</B> <I>uri-component allows</I>
+<DD>Returns a copy of the string <VAR>uri-component</VAR> in which all <EM>unsafe</EM> octets
+<A NAME="IDX392"></A>
+(as defined in RFC 2396) have been `<SAMP>%</SAMP>' <EM>escaped</EM>.
+<A NAME="IDX393"></A>
+<CODE>uric:decode</CODE> decodes strings encoded by <CODE>uric:encode</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX394"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uric:decode</B> <I>uri-component</I>
+<DD>Returns a copy of the string <VAR>uri-component</VAR> in which each `<SAMP>%</SAMP>' escaped
+characters in <VAR>uri-component</VAR> is replaced with the character it encodes. This
+routine is useful for showing URI contents on error pages.
+</DL>
+<P>
+
+<A NAME="IDX395"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>uri:path-&gt;keys</B> <I>path-list ptypes</I>
+<DD><VAR>path-list</VAR> is a path-list as returned by <CODE>uri:split-fields</CODE>. <CODE>uri:path-&gt;keys</CODE>
+returns a list of items returned by <CODE>uri:decode-path</CODE>, coerced
+to types <VAR>ptypes</VAR>.
+</DL>
+<A NAME="SEC77"></A>
+<H3> File-system Locators and Predicates </H3>
+<!--docid::SEC77::-->
+<P>
+
+<A NAME="IDX396"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>path-&gt;uri</B> <I>path</I>
+<DD>Returns a URI-string for <VAR>path</VAR> on the local host.
+</DL>
+<P>
+
+<A NAME="IDX397"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>absolute-uri?</B> <I>str</I>
+<DD>Returns #t if <VAR>str</VAR> is an absolute-URI as indicated by a
+syntactically valid (per RFC 2396) <EM>scheme</EM>; otherwise returns
+<A NAME="IDX398"></A>
+#f.
+</DL>
+<P>
+
+<A NAME="IDX399"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>absolute-path?</B> <I>file-name</I>
+<DD>Returns #t if <VAR>file-name</VAR> is a fully specified pathname (does not
+depend on the current working directory); otherwise returns #f.
+</DL>
+<P>
+
+<A NAME="IDX400"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>null-directory?</B> <I>str</I>
+<DD>Returns #t if changing directory to <VAR>str</VAR> would leave the current
+directory unchanged; otherwise returns #f.
+</DL>
+<P>
+
+<A NAME="IDX401"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>glob-pattern?</B> <I>str</I>
+<DD>Returns #t if the string <VAR>str</VAR> contains characters used for
+specifying glob patterns, namely `<SAMP>*</SAMP>', `<SAMP>?</SAMP>', or `<SAMP>[</SAMP>'.
+</DL>
+Before RFC 2396, the <EM>File Transfer Protocol</EM> (FTP) served a
+<A NAME="IDX402"></A>
+similar purpose.
+<P>
+
+<A NAME="IDX403"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>parse-ftp-address</B> <I>uri</I>
+<DD><P>
+
+Returns a list of the decoded FTP <VAR>uri</VAR>; or #f if indecipherable. FTP
+<EM>Uniform Resource Locator</EM>, <EM>ange-ftp</EM>, and <EM>getit</EM>
+<A NAME="IDX404"></A>
+<A NAME="IDX405"></A>
+<A NAME="IDX406"></A>
+formats are handled. The returned list has four elements which are
+strings or #f:
+</P>
+<P>
+
+<OL>
+<LI>
+username
+<LI>
+password
+<LI>
+remote-site
+<LI>
+remote-directory
+</OL>
+</DL>
+<P>
+
+<A NAME="Printing Scheme"></A>
+<HR SIZE="6">
+<A NAME="SEC78"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC76"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC79"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.11 Printing Scheme </H2>
+<!--docid::SEC78::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC79">4.11.1 Generic-Write</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'generic-write</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'object-&gt;string</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'pretty-print, 'pprint-file</TD></TR>
+</TABLE>
+<P>
+
+<A NAME="Generic-Write"></A>
+<HR SIZE="6">
+<A NAME="SEC79"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC80"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.11.1 Generic-Write </H3>
+<!--docid::SEC79::-->
+<P>
+
+<CODE>(require 'generic-write)</CODE>
+<A NAME="IDX407"></A>
+</P>
+<P>
+
+<CODE>generic-write</CODE> is a procedure that transforms a Scheme data value
+(or Scheme program expression) into its textual representation and
+prints it. The interface to the procedure is sufficiently general to
+easily implement other useful formatting procedures such as pretty
+printing, output to a string and truncated output.
+</P>
+<P>
+
+<A NAME="IDX408"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>generic-write</B> <I>obj display? width output</I>
+<DD><DL COMPACT>
+<DT><VAR>obj</VAR>
+<DD>Scheme data value to transform.
+<DT><VAR>display?</VAR>
+<DD>Boolean, controls whether characters and strings are quoted.
+<DT><VAR>width</VAR>
+<DD>Extended boolean, selects format:
+<DL COMPACT>
+<DT>#f
+<DD>single line format
+<DT>integer &gt; 0
+<DD>pretty-print (value = max nb of chars per line)
+</DL>
+<DT><VAR>output</VAR>
+<DD>Procedure of 1 argument of string type, called repeatedly with
+successive substrings of the textual representation. This procedure can
+return <CODE>#f</CODE> to stop the transformation.
+</DL>
+<P>
+
+The value returned by <CODE>generic-write</CODE> is undefined.
+</P>
+<P>
+
+Examples:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(write obj) == (generic-write obj #f #f <VAR>display-string</VAR>)
+(display obj) == (generic-write obj #t #f <VAR>display-string</VAR>)
+</pre></td></tr></table>where
+<TABLE><tr><td>&nbsp;</td><td class=example><pre><VAR>display-string</VAR> ==
+(lambda (s) (for-each write-char (string-&gt;list s)) #t)
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="Object-To-String"></A>
+<HR SIZE="6">
+<A NAME="SEC80"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC79"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC81"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.11.2 Object-To-String </H3>
+<!--docid::SEC80::-->
+<P>
+
+<CODE>(require 'object-&gt;string)</CODE>
+<A NAME="IDX409"></A>
+</P>
+<P>
+
+<A NAME="IDX410"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>object-&gt;string</B> <I>obj</I>
+<DD>Returns the textual representation of <VAR>obj</VAR> as a string.
+</DL>
+<P>
+
+<A NAME="IDX411"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>object-&gt;limited-string</B> <I>obj limit</I>
+<DD>Returns the textual representation of <VAR>obj</VAR> as a string of length
+at most <VAR>limit</VAR>.
+</DL>
+<P>
+
+<A NAME="Pretty-Print"></A>
+<HR SIZE="6">
+<A NAME="SEC81"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC80"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.11.3 Pretty-Print </H3>
+<!--docid::SEC81::-->
+<P>
+
+<CODE>(require 'pretty-print)</CODE>
+<A NAME="IDX412"></A>
+</P>
+<P>
+
+<A NAME="IDX413"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>pretty-print</B> <I>obj</I>
+<DD><A NAME="IDX414"></A>
+<DT><U>Procedure:</U> <B>pretty-print</B> <I>obj port</I>
+<DD><P>
+
+<CODE>pretty-print</CODE>s <VAR>obj</VAR> on <VAR>port</VAR>. If <VAR>port</VAR> is not
+specified, <CODE>current-output-port</CODE> is used.
+</P>
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(pretty-print '((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15)
+ (16 17 18 19 20) (21 22 23 24 25)))
+ -| ((1 2 3 4 5)
+ -| (6 7 8 9 10)
+ -| (11 12 13 14 15)
+ -| (16 17 18 19 20)
+ -| (21 22 23 24 25))
+</pre></td></tr></table></DL>
+<P>
+
+<A NAME="IDX415"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>pretty-print-&gt;string</B> <I>obj</I>
+<DD><A NAME="IDX416"></A>
+<DT><U>Procedure:</U> <B>pretty-print-&gt;string</B> <I>obj width</I>
+<DD><P>
+
+Returns the string of <VAR>obj</VAR> <CODE>pretty-print</CODE>ed in <VAR>width</VAR>
+columns. If <VAR>width</VAR> is not specified, <CODE>(output-port-width)</CODE> is
+used.
+</P>
+<P>
+
+Example:
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(pretty-print-&gt;string '((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15)
+ (16 17 18 19 20) (21 22 23 24 25)))
+=>
+&quot;((1 2 3 4 5)
+ (6 7 8 9 10)
+ (11 12 13 14 15)
+ (16 17 18 19 20)
+ (21 22 23 24 25))
+&quot;
+(pretty-print-&gt;string '((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15)
+ (16 17 18 19 20) (21 22 23 24 25))
+ 16)
+=>
+&quot;((1 2 3 4 5)
+ (6 7 8 9 10)
+ (11
+ 12
+ 13
+ 14
+ 15)
+ (16
+ 17
+ 18
+ 19
+ 20)
+ (21
+ 22
+ 23
+ 24
+ 25))
+&quot;
+</pre></td></tr></table></DL>
+<P>
+
+<CODE>(require 'pprint-file)</CODE>
+<A NAME="IDX417"></A>
+</P>
+<P>
+
+<A NAME="IDX418"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>pprint-file</B> <I>infile</I>
+<DD><A NAME="IDX419"></A>
+<DT><U>Procedure:</U> <B>pprint-file</B> <I>infile outfile</I>
+<DD>Pretty-prints all the code in <VAR>infile</VAR>. If <VAR>outfile</VAR> is
+specified, the output goes to <VAR>outfile</VAR>, otherwise it goes to
+<CODE>(current-output-port)</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX420"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>pprint-filter-file</B> <I>infile proc outfile</I>
+<DD><A NAME="IDX421"></A>
+<DT><U>Function:</U> <B>pprint-filter-file</B> <I>infile proc</I>
+<DD><VAR>infile</VAR> is a port or a string naming an existing file. Scheme
+source code expressions and definitions are read from the port (or file)
+and <VAR>proc</VAR> is applied to them sequentially.
+<P>
+
+<VAR>outfile</VAR> is a port or a string. If no <VAR>outfile</VAR> is specified
+then <CODE>current-output-port</CODE> is assumed. These expanded expressions
+are then <CODE>pretty-print</CODE>ed to this port.
+</P>
+<P>
+
+Whitepsace and comments (introduced by <CODE>;</CODE>) which are not part of
+scheme expressions are reproduced in the output. This procedure does
+not affect the values returned by <CODE>current-input-port</CODE> and
+<CODE>current-output-port</CODE>.
+</P>
+</DL>
+<P>
+
+<CODE>pprint-filter-file</CODE> can be used to pre-compile macro-expansion and
+thus can reduce loading time. The following will write into
+`<TT>exp-code.scm</TT>' the result of expanding all defmacros in
+`<TT>code.scm</TT>'.
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'pprint-file)
+<A NAME="IDX422"></A>(require 'defmacroexpand)
+<A NAME="IDX423"></A>(defmacro:load &quot;my-macros.scm&quot;)
+(pprint-filter-file &quot;code.scm&quot; defmacro:expand* &quot;exp-code.scm&quot;)
+</pre></td></tr></table><P>
+
+<A NAME="Time and Date"></A>
+<HR SIZE="6">
+<A NAME="SEC82"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC81"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC83"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.12 Time and Date </H2>
+<!--docid::SEC82::-->
+<P>
+
+<TABLE BORDER="0" CELLSPACING="0">
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'posix-time</TD></TR>
+<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP">'common-lisp-time</TD></TR>
+</TABLE>
+<P>
+
+If <CODE>(provided? 'current-time)</CODE>:
+</P>
+<P>
+
+The procedures <CODE>current-time</CODE>, <CODE>difftime</CODE>, and
+<CODE>offset-time</CODE> deal with a <EM>calendar time</EM> datatype
+<A NAME="IDX424"></A>
+<A NAME="IDX425"></A>
+which may or may not be disjoint from other Scheme datatypes.
+</P>
+<P>
+
+<A NAME="IDX426"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>current-time</B>
+<DD>Returns the time since 00:00:00 GMT, January 1, 1970, measured in
+seconds. Note that the reference time is different from the reference
+time for <CODE>get-universal-time</CODE> in <A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A>.
+</DL>
+<P>
+
+<A NAME="IDX427"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>difftime</B> <I>caltime1 caltime0</I>
+<DD>Returns the difference (number of seconds) between twe calendar times:
+<VAR>caltime1</VAR> - <VAR>caltime0</VAR>. <VAR>caltime0</VAR> may also be a number.
+</DL>
+<P>
+
+<A NAME="IDX428"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>offset-time</B> <I>caltime offset</I>
+<DD>Returns the calendar time of <VAR>caltime</VAR> offset by <VAR>offset</VAR> number
+of seconds <CODE>(+ caltime offset)</CODE>.
+</DL>
+<P>
+
+<A NAME="Time Zone"></A>
+<HR SIZE="6">
+<A NAME="SEC83"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC84"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.12.1 Time Zone </H3>
+<!--docid::SEC83::-->
+<P>
+
+(require 'time-zone)
+</P>
+<P>
+
+<A NAME="IDX429"></A>
+</P>
+<DL>
+<DT><U>Data Format:</U> <B>TZ-string</B>
+<DD><P>
+
+POSIX standards specify several formats for encoding time-zone rules.
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><TT>:<I>&lt;pathname&gt;</I></TT>
+<DD>If the first character of <I>&lt;pathname&gt;</I> is `<SAMP>/</SAMP>', then
+<I>&lt;pathname&gt;</I> specifies the absolute pathname of a tzfile(5) format
+time-zone file. Otherwise, <I>&lt;pathname&gt;</I> is interpreted as a pathname
+within <VAR>tzfile:vicinity</VAR> (/usr/lib/zoneinfo/) naming a tzfile(5)
+format time-zone file.
+<DT><TT><I>&lt;std&gt;</I><I>&lt;offset&gt;</I></TT>
+<DD>The string <I>&lt;std&gt;</I> consists of 3 or more alphabetic characters.
+<I>&lt;offset&gt;</I> specifies the time difference from GMT. The <I>&lt;offset&gt;</I>
+is positive if the local time zone is west of the Prime Meridian and
+negative if it is east. <I>&lt;offset&gt;</I> can be the number of hours or
+hours and minutes (and optionally seconds) separated by `<SAMP>:</SAMP>'. For
+example, <CODE>-4:30</CODE>.
+<DT><TT><I>&lt;std&gt;</I><I>&lt;offset&gt;</I><I>&lt;dst&gt;</I></TT>
+<DD><I>&lt;dst&gt;</I> is the at least 3 alphabetic characters naming the local
+daylight-savings-time.
+<DT><TT><I>&lt;std&gt;</I><I>&lt;offset&gt;</I><I>&lt;dst&gt;</I><I>&lt;doffset&gt;</I></TT>
+<DD><I>&lt;doffset&gt;</I> specifies the offset from the Prime Meridian when
+daylight-savings-time is in effect.
+</DL>
+<P>
+
+The non-tzfile formats can optionally be followed by transition times
+specifying the day and time when a zone changes from standard to
+daylight-savings and back again.
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><TT>,<I>&lt;date&gt;</I>/<I>&lt;time&gt;</I>,<I>&lt;date&gt;</I>/<I>&lt;time&gt;</I></TT>
+<DD>The <I>&lt;time&gt;</I>s are specified like the <I>&lt;offset&gt;</I>s above, except that
+leading `<SAMP>+</SAMP>' and `<SAMP>-</SAMP>' are not allowed.
+<P>
+
+Each <I>&lt;date&gt;</I> has one of the formats:
+</P>
+<P>
+
+</P>
+<DL COMPACT>
+<DT><TT>J<I>&lt;day&gt;</I></TT>
+<DD>specifies the Julian day with <I>&lt;day&gt;</I> between 1 and 365. February 29
+is never counted and cannot be referenced.
+<DT><TT><I>&lt;day&gt;</I></TT>
+<DD>This specifies the Julian day with n between 0 and 365. February 29 is
+counted in leap years and can be specified.
+<DT><TT>M<I>&lt;month&gt;</I>.<I>&lt;week&gt;</I>.<I>&lt;day&gt;</I></TT>
+<DD>This specifies day <I>&lt;day&gt;</I> (0 &lt;= <I>&lt;day&gt;</I> &lt;= 6) of week <I>&lt;week&gt;</I> (1
+&lt;= <I>&lt;week&gt;</I> &lt;= 5) of month <I>&lt;month&gt;</I> (1 &lt;= <I>&lt;month&gt;</I> &lt;= 12). Week
+1 is the first week in which day d occurs and week 5 is the last week in
+which day <I>&lt;day&gt;</I> occurs. Day 0 is a Sunday.
+</DL>
+</DL>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX430"></A>
+</P>
+<DL>
+<DT><U>Data Type:</U> <B>time-zone</B>
+<DD>is a datatype encoding how many hours from Greenwich Mean Time the local
+time is, and the <EM>Daylight Savings Time</EM> rules for changing it.
+</DL>
+<P>
+
+<A NAME="IDX431"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>time-zone</B> <I>TZ-string</I>
+<DD>Creates and returns a time-zone object specified by the string
+<VAR>TZ-string</VAR>. If <CODE>time-zone</CODE> cannot interpret <VAR>TZ-string</VAR>,
+<CODE>#f</CODE> is returned.
+</DL>
+<P>
+
+<A NAME="IDX432"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tz:params</B> <I>caltime tz</I>
+<DD><VAR>tz</VAR> is a time-zone object. <CODE>tz:params</CODE> returns a list of
+three items:
+<OL>
+<LI>
+An integer. 0 if standard time is in effect for timezone <VAR>tz</VAR> at
+<VAR>caltime</VAR>; 1 if daylight savings time is in effect for timezone
+<VAR>tz</VAR> at <VAR>caltime</VAR>.
+<LI>
+The number of seconds west of the Prime Meridian timezone <VAR>tz</VAR> is at
+<VAR>caltime</VAR>.
+<LI>
+The name for timezone <VAR>tz</VAR> at <VAR>caltime</VAR>.
+</OL>
+<P>
+
+<CODE>tz:params</CODE> is unaffected by the default timezone; inquiries can be
+made of any timezone at any calendar time.
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX433"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tz:std-offset</B> <I>tz</I>
+<DD><VAR>tz</VAR> is a time-zone object. <CODE>tz:std-offset</CODE> returns the
+number of seconds west of the Prime Meridian timezone <VAR>tz</VAR> is.
+<P>
+
+</P>
+</DL>
+<P>
+
+The rest of these procedures and variables are provided for POSIX
+compatability. Because of shared state they are not thread-safe.
+</P>
+<P>
+
+<A NAME="IDX434"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>tzset</B>
+<DD>Returns the default time-zone.
+<P>
+
+<A NAME="IDX435"></A>
+<DT><U>Function:</U> <B>tzset</B> <I>tz</I>
+<DD>Sets (and returns) the default time-zone to <VAR>tz</VAR>.
+</P>
+<P>
+
+<A NAME="IDX436"></A>
+<DT><U>Function:</U> <B>tzset</B> <I>TZ-string</I>
+<DD>Sets (and returns) the default time-zone to that specified by
+<VAR>TZ-string</VAR>.
+</P>
+<P>
+
+<CODE>tzset</CODE> also sets the variables <VAR>*timezone*</VAR>, <VAR>daylight?</VAR>,
+and <VAR>tzname</VAR>. This function is automatically called by the time
+conversion procedures which depend on the time zone (see section <A HREF="slib_4.html#SEC82">4.12 Time and Date</A>).
+</P>
+</DL>
+<P>
+
+<A NAME="IDX437"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>*timezone*</B>
+<DD>Contains the difference, in seconds, between Greenwich Mean Time and
+local standard time (for example, in the U.S. Eastern time zone (EST),
+timezone is 5*60*60). <CODE>*timezone*</CODE> is initialized by <CODE>tzset</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX438"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>daylight?</B>
+<DD>is <CODE>#t</CODE> if the default timezone has rules for <EM>Daylight Savings
+Time</EM>. <EM>Note:</EM> <VAR>daylight?</VAR> does not tell you when Daylight
+Savings Time is in effect, just that the default zone sometimes has
+Daylight Savings Time.
+</DL>
+<P>
+
+<A NAME="IDX439"></A>
+</P>
+<DL>
+<DT><U>Variable:</U> <B>tzname</B>
+<DD>is a vector of strings. Index 0 has the abbreviation for the standard
+timezone; If <VAR>daylight?</VAR>, then index 1 has the abbreviation for the
+Daylight Savings timezone.
+</DL>
+<P>
+
+<A NAME="Posix Time"></A>
+<HR SIZE="6">
+<A NAME="SEC84"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC83"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC85"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.12.2 Posix Time </H3>
+<!--docid::SEC84::-->
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>(require 'posix-time)
+<A NAME="IDX440"></A></pre></td></tr></table><P>
+
+<A NAME="IDX441"></A>
+</P>
+<DL>
+<DT><U>Data Type:</U> <B>Calendar-Time</B>
+<DD><A NAME="IDX442"></A>
+<A NAME="IDX443"></A>
+is a datatype encapsulating time.
+</DL>
+<P>
+
+<A NAME="IDX444"></A>
+</P>
+<DL>
+<DT><U>Data Type:</U> <B>Coordinated Universal Time</B>
+<DD><A NAME="IDX445"></A>
+<A NAME="IDX446"></A>
+(abbreviated <EM>UTC</EM>) is a vector of integers representing time:
+<P>
+
+<OL>
+<LI>
+ seconds (0 - 61)
+<LI>
+ minutes (0 - 59)
+<LI>
+ hours since midnight (0 - 23)
+<LI>
+ day of month (1 - 31)
+<LI>
+ month (0 - 11). Note difference from <CODE>decode-universal-time</CODE>.
+<LI>
+ the number of years since 1900. Note difference from
+<CODE>decode-universal-time</CODE>.
+<LI>
+ day of week (0 - 6)
+<LI>
+ day of year (0 - 365)
+<LI>
+ 1 for daylight savings, 0 for regular time
+</OL>
+</DL>
+<P>
+
+<A NAME="IDX447"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>gmtime</B> <I>caltime</I>
+<DD>Converts the calendar time <VAR>caltime</VAR> to UTC and returns it.
+<P>
+
+<A NAME="IDX448"></A>
+<DT><U>Function:</U> <B>localtime</B> <I>caltime tz</I>
+<DD>Returns <VAR>caltime</VAR> converted to UTC relative to timezone <VAR>tz</VAR>.
+</P>
+<P>
+
+<A NAME="IDX449"></A>
+<DT><U>Function:</U> <B>localtime</B> <I>caltime</I>
+<DD>converts the calendar time <VAR>caltime</VAR> to a vector of integers
+expressed relative to the user's time zone. <CODE>localtime</CODE> sets the
+variable <VAR>*timezone*</VAR> with the difference between Coordinated
+Universal Time (UTC) and local standard time in seconds
+(see section <A HREF="slib_4.html#SEC83">tzset</A>).
+</P>
+<P>
+
+</P>
+</DL>
+<P>
+
+<A NAME="IDX450"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>gmktime</B> <I>univtime</I>
+<DD>Converts a vector of integers in GMT Coordinated Universal Time (UTC)
+format to a calendar time.
+<P>
+
+<A NAME="IDX451"></A>
+<DT><U>Function:</U> <B>mktime</B> <I>univtime</I>
+<DD>Converts a vector of integers in local Coordinated Universal Time (UTC)
+format to a calendar time.
+</P>
+<P>
+
+<A NAME="IDX452"></A>
+<DT><U>Function:</U> <B>mktime</B> <I>univtime tz</I>
+<DD>Converts a vector of integers in Coordinated Universal Time (UTC) format
+(relative to time-zone <VAR>tz</VAR>)
+to calendar time.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX453"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>asctime</B> <I>univtime</I>
+<DD>Converts the vector of integers <VAR>caltime</VAR> in Coordinated
+Universal Time (UTC) format into a string of the form
+<CODE>&quot;Wed Jun 30 21:49:08 1993&quot;</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX454"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>gtime</B> <I>caltime</I>
+<DD><A NAME="IDX455"></A>
+<DT><U>Function:</U> <B>ctime</B> <I>caltime</I>
+<DD><A NAME="IDX456"></A>
+<DT><U>Function:</U> <B>ctime</B> <I>caltime tz</I>
+<DD>Equivalent to <CODE>(asctime (gmtime <VAR>caltime</VAR>))</CODE>,
+<CODE>(asctime (localtime <VAR>caltime</VAR>))</CODE>, and
+<CODE>(asctime (localtime <VAR>caltime</VAR> <VAR>tz</VAR>))</CODE>, respectively.
+</DL>
+<P>
+
+<A NAME="Common-Lisp Time"></A>
+<HR SIZE="6">
+<A NAME="SEC85"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC84"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC86"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H3> 4.12.3 Common-Lisp Time </H3>
+<!--docid::SEC85::-->
+<P>
+
+<A NAME="IDX457"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>get-decoded-time</B>
+<DD>Equivalent to <CODE>(decode-universal-time (get-universal-time))</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX458"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>get-universal-time</B>
+<DD>Returns the current time as <EM>Universal Time</EM>, number of seconds
+since 00:00:00 Jan 1, 1900 GMT. Note that the reference time is
+different from <CODE>current-time</CODE>.
+</DL>
+<P>
+
+<A NAME="IDX459"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>decode-universal-time</B> <I>univtime</I>
+<DD>Converts <VAR>univtime</VAR> to <EM>Decoded Time</EM> format.
+Nine values are returned:
+<OL>
+<LI>
+ seconds (0 - 61)
+<LI>
+ minutes (0 - 59)
+<LI>
+ hours since midnight
+<LI>
+ day of month
+<LI>
+ month (1 - 12). Note difference from <CODE>gmtime</CODE> and <CODE>localtime</CODE>.
+<LI>
+ year (A.D.). Note difference from <CODE>gmtime</CODE> and <CODE>localtime</CODE>.
+<LI>
+ day of week (0 - 6)
+<LI>
+ #t for daylight savings, #f otherwise
+<LI>
+ hours west of GMT (-24 - +24)
+</OL>
+<P>
+
+Notice that the values returned by <CODE>decode-universal-time</CODE> do not
+match the arguments to <CODE>encode-universal-time</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX460"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>encode-universal-time</B> <I>second minute hour date month year</I>
+<DD><A NAME="IDX461"></A>
+<DT><U>Function:</U> <B>encode-universal-time</B> <I>second minute hour date month year time-zone</I>
+<DD>Converts the arguments in Decoded Time format to Universal Time format.
+If <VAR>time-zone</VAR> is not specified, the returned time is adjusted for
+daylight saving time. Otherwise, no adjustment is performed.
+<P>
+
+Notice that the values returned by <CODE>decode-universal-time</CODE> do not
+match the arguments to <CODE>encode-universal-time</CODE>.
+</P>
+</DL>
+<P>
+
+<A NAME="NCBI-DNA"></A>
+<HR SIZE="6">
+<A NAME="SEC86"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC85"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC87"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.13 NCBI-DNA </H2>
+<!--docid::SEC86::-->
+<P>
+
+<A NAME="IDX462"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>ncbi:read-dna-sequence</B> <I>port</I>
+<DD><P>
+
+Reads the NCBI-format DNA sequence following the word `<SAMP>ORIGIN</SAMP>'
+from <VAR>port</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX463"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>ncbi:read-file</B> <I>file</I>
+<DD><P>
+
+Reads the NCBI-format DNA sequence following the word `<SAMP>ORIGIN</SAMP>'
+from <VAR>file</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX464"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>mrna&lt;-cdna</B> <I>str</I>
+<DD><P>
+
+Replaces `<SAMP>T</SAMP>' with `<SAMP>U</SAMP>' in <VAR>str</VAR>
+</P>
+</DL>
+<P>
+
+<A NAME="IDX465"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>codons&lt;-cdna</B> <I>cdna</I>
+<DD><P>
+
+Returns a list of three-letter symbol codons comprising the protein
+sequence encoded by <VAR>cdna</VAR> starting with its first occurence of
+`<SAMP>atg</SAMP>'.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX466"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>protein&lt;-cdna</B> <I>cdna</I>
+<DD><P>
+
+Returns a list of three-letter symbols for the protein sequence
+encoded by <VAR>cdna</VAR> starting with its first occurence of `<SAMP>atg</SAMP>'.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX467"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>p&lt;-cdna</B> <I>cdna</I>
+<DD><P>
+
+Returns a string of one-letter amino acid codes for the protein
+sequence encoded by <VAR>cdna</VAR> starting with its first occurence of
+`<SAMP>atg</SAMP>'.
+</P>
+</DL>
+<P>
+
+These cDNA count routines provide a means to check the nucleotide
+sequence with the `<SAMP>BASE COUNT</SAMP>' line preceding the sequence from
+NCBI.
+</P>
+<P>
+
+<A NAME="IDX468"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>cdna:base-count</B> <I>cdna</I>
+<DD><P>
+
+Returns a list of counts of `<SAMP>a</SAMP>', `<SAMP>c</SAMP>', `<SAMP>g</SAMP>', and
+`<SAMP>t</SAMP>' occurrencing in <VAR>cdna</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="IDX469"></A>
+</P>
+<DL>
+<DT><U>Function:</U> <B>cdna:report-base-count</B> <I>cdna</I>
+<DD><P>
+
+Prints the counts of `<SAMP>a</SAMP>', `<SAMP>c</SAMP>', `<SAMP>g</SAMP>', and `<SAMP>t</SAMP>'
+occurrencing in <VAR>cdna</VAR>.
+</P>
+</DL>
+<P>
+
+<A NAME="Schmooz"></A>
+<HR SIZE="6">
+<A NAME="SEC87"></A>
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC86"> &lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> Up </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<H2> 4.14 Schmooz </H2>
+<!--docid::SEC87::-->
+<P>
+
+<A NAME="IDX470"></A>
+<EM>Schmooz</EM> is a simple, lightweight markup language for interspersing
+Texinfo documentation with Scheme source code. Schmooz does not create
+the top level Texinfo file; it creates `<SAMP>txi</SAMP>' files which can be
+imported into the documentation using the Texinfo command
+`<SAMP>@include</SAMP>'.
+</P>
+<P>
+
+<A NAME="IDX471"></A>
+<CODE>(require 'schmooz)</CODE> defines the function <CODE>schmooz</CODE>, which is
+used to process files. Files containing schmooz documentation should
+not contain <CODE>(require 'schmooz)</CODE>.
+</P>
+<P>
+
+<A NAME="IDX472"></A>
+</P>
+<DL>
+<DT><U>Procedure:</U> <B>schmooz</B> <I>filename.scm <small>...</small></I>
+<DD><VAR>Filename</VAR>.scm should be a string ending with `<SAMP>.scm</SAMP>' naming an
+existing file containing Scheme source code. <CODE>schmooz</CODE> extracts
+top-level comments containing schmooz commands from <VAR>filename</VAR>.scm
+and writes the converted Texinfo source to a file named
+<VAR>filename</VAR>.txi.
+<P>
+
+<A NAME="IDX473"></A>
+<DT><U>Procedure:</U> <B>schmooz</B> <I>filename.texi <small>...</small></I>
+<DD><A NAME="IDX474"></A>
+<DT><U>Procedure:</U> <B>schmooz</B> <I>filename.tex <small>...</small></I>
+<DD><A NAME="IDX475"></A>
+<DT><U>Procedure:</U> <B>schmooz</B> <I>filename.txi <small>...</small></I>
+<DD><VAR>Filename</VAR> should be a string naming an existing file containing
+Texinfo source code. For every occurrence of the string `<SAMP>@include
+<VAR>filename</VAR>.txi</SAMP>' within that file, <CODE>schmooz</CODE> calls itself with
+the argument `<SAMP><VAR>filename</VAR>.scm</SAMP>'.
+</P>
+</DL>
+<P>
+
+Schmooz comments are distinguished (from non-schmooz comments) by their
+first line, which must start with an at-sign (@) preceded by one or
+more semicolons (<TT>;</TT>). A schmooz comment ends at the first subsequent
+line which does <EM>not</EM> start with a semicolon. Currently schmooz
+comments are recognized only at top level.
+</P>
+<P>
+
+Schmooz comments are copied to the Texinfo output file with the leading
+contiguous semicolons removed. Certain character sequences starting
+with at-sign are treated specially. Others are copied unchanged.
+</P>
+<P>
+
+A schmooz comment starting with `<SAMP>@body</SAMP>' must be followed by a
+Scheme definition. All comments between the `<SAMP>@body</SAMP>' line and
+the definition will be included in a Texinfo definition, either
+a `<SAMP>@defun</SAMP>' or a `<SAMP>@defvar</SAMP>', depending on whether a procedure
+or a variable is being defined.
+</P>
+<P>
+
+Within the text of that schmooz comment, at-sign
+followed by `<SAMP>0</SAMP>' will be replaced by <CODE>@code{procedure-name}</CODE>
+if the following definition is of a procedure; or
+<CODE>@var{variable}</CODE> if defining a variable.
+</P>
+<P>
+
+An at-sign followed by a non-zero digit will expand to the variable
+citation of that numbered argument: `<SAMP>@var{argument-name}</SAMP>'.
+</P>
+<P>
+
+If more than one definition follows a `<SAMP>@body</SAMP>' comment line
+without an intervening blank or comment line, then those definitions
+will be included in the same Texinfo definition using `<SAMP>@defvarx</SAMP>'
+or `<SAMP>@defunx</SAMP>', depending on whether the first definition is of
+a variable or of a procedure.
+</P>
+<P>
+
+Schmooz can figure out whether a definition is of a procedure if
+it is of the form:
+</P>
+<P>
+
+`<SAMP>(define (&lt;identifier&gt; &lt;arg&gt; ...) &lt;expression&gt;)</SAMP>'
+</P>
+<P>
+
+or if the left hand side of the definition is some form ending in
+a lambda expression. Obviously, it can be fooled. In order to
+force recognition of a procedure definition, start the documentation
+with `<SAMP>@args</SAMP>' instead of `<SAMP>@body</SAMP>'. `<SAMP>@args</SAMP>' should
+be followed by the argument list of the function being defined,
+which may be enclosed in parentheses and delimited by whitespace,
+(as in Scheme), enclosed in braces and separated by commas, (as
+in Texinfo), or consist of the remainder of the line, separated
+by whitespace.
+</P>
+<P>
+
+For example:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>;;@args arg1 args ...
+;;@0 takes argument @1 and any number of @2
+(define myfun (some-function-returning-magic))
+</pre></td></tr></table><P>
+
+Will result in:
+</P>
+<P>
+
+<TABLE><tr><td>&nbsp;</td><td class=example><pre>@defun myfun arg1 args @dots{}
+
+@code{myfun} takes argument @var{arg1} and any number of @var{args}
+@end defun
+</pre></td></tr></table><P>
+
+`<SAMP>@args</SAMP>' may also be useful for indicating optional arguments
+by name. If `<SAMP>@args</SAMP>' occurs inside a schmooz comment section,
+rather than at the beginning, then it will generate a `<SAMP>@defunx</SAMP>'
+line with the arguments supplied.
+</P>
+<P>
+
+If the first at-sign in a schmooz comment is immediately followed by
+whitespace, then the comment will be expanded to whatever follows that
+whitespace. If the at-sign is followed by a non-whitespace character
+then the at-sign will be included as the first character of the expansion.
+This feature is intended to make it easy to include Texinfo directives
+in schmooz comments.
+</P>
+<P>
+
+<A NAME="Mathematical Packages"></A>
+<HR SIZE="6">
+<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
+<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> &lt;&lt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> &gt;&gt; </A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD>
+<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD>
+</TR></TABLE>
+<BR>
+<FONT SIZE="-1">
+This document was generated
+by <I>Steve Langasek</I> on <I>January, 10 2005</I>
+using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A>
+</FONT>
+
+</BODY>
+</HTML>