diff options
-rw-r--r-- | .slibcat | 164 | ||||
-rw-r--r-- | Makefile | 21 | ||||
-rw-r--r-- | debian/changelog | 231 | ||||
-rw-r--r-- | debian/control | 17 | ||||
-rw-r--r-- | debian/copyright | 580 | ||||
-rw-r--r-- | debian/doc-base | 10 | ||||
-rw-r--r-- | debian/postinst | 31 | ||||
-rw-r--r-- | debian/prerm | 16 | ||||
-rwxr-xr-x | debian/rules | 96 | ||||
-rw-r--r-- | debian/slibconfig | 7 | ||||
-rw-r--r-- | format.scm | 1688 | ||||
-rw-r--r-- | formatst.scm | 666 | ||||
-rw-r--r-- | guile.init.local | 416 | ||||
-rw-r--r-- | http-cgi.scm | 6 | ||||
-rw-r--r-- | mklibcat.scm | 2 | ||||
-rw-r--r-- | schmooz.scm | 33 | ||||
-rw-r--r-- | slib.html | 76 | ||||
-rw-r--r-- | slib_1.html | 1172 | ||||
-rw-r--r-- | slib_10.html | 217 | ||||
-rw-r--r-- | slib_11.html | 268 | ||||
-rw-r--r-- | slib_12.html | 346 | ||||
-rw-r--r-- | slib_13.html | 325 | ||||
-rw-r--r-- | slib_14.html | 314 | ||||
-rw-r--r-- | slib_15.html | 367 | ||||
-rw-r--r-- | slib_16.html | 311 | ||||
-rw-r--r-- | slib_17.html | 461 | ||||
-rw-r--r-- | slib_18.html | 331 | ||||
-rw-r--r-- | slib_19.html | 214 | ||||
-rw-r--r-- | slib_2.html | 824 | ||||
-rw-r--r-- | slib_20.html | 294 | ||||
-rw-r--r-- | slib_21.html | 271 | ||||
-rw-r--r-- | slib_22.html | 180 | ||||
-rw-r--r-- | slib_3.html | 2013 | ||||
-rw-r--r-- | slib_4.html | 5157 | ||||
-rw-r--r-- | slib_5.html | 6100 | ||||
-rw-r--r-- | slib_6.html | 3658 | ||||
-rw-r--r-- | slib_7.html | 8218 | ||||
-rw-r--r-- | slib_8.html | 767 | ||||
-rw-r--r-- | slib_9.html | 340 | ||||
-rw-r--r-- | slib_abt.html | 205 | ||||
-rw-r--r-- | slib_fot.html | 92 | ||||
-rw-r--r-- | slib_ovr.html | 69 | ||||
-rw-r--r-- | slib_toc.html | 676 | ||||
-rw-r--r-- | srcdir.mk | 2 | ||||
-rw-r--r-- | strsrch.scm | 6 |
45 files changed, 37243 insertions, 15 deletions
diff --git a/.slibcat b/.slibcat new file mode 100644 index 0000000..54d82ee --- /dev/null +++ b/.slibcat @@ -0,0 +1,164 @@ +;"slibcat" SLIB catalog for guile1.6.7. -*-scheme-*- +; +; DO NOT EDIT THIS FILE -- it is automagically generated + +( + (schelog . "./schelog/schelog") + (portable-scheme-debugger . "./psd/psd-slib") + (jfilter . "./jfilter/jfilter") + (null . "./null") + (aggregate . "./null") + (r2rs aggregate rev3-procedures rev2-procedures) + (r3rs aggregate rev3-procedures) + (r4rs aggregate rev4-optional-procedures) + (r5rs aggregate values macro eval) + (rev4-optional-procedures . "./sc4opt") + (rev3-procedures . "./null") + (rev2-procedures . "./sc2") + (multiarg/and- . "./mularg") + (multiarg-apply . "./mulapply") + (rationalize . "./ratize") + (transcript . "./trnscrpt") + (with-file . "./withfile") + (dynamic-wind . "./dynwind") + (dynamic . "./dynamic") + (fluid-let defmacro "./fluidlet") + (alist . "./alist") + (hash . "./hash") + (sierpinski . "./sierpinski") + (hilbert-fill . "./phil-spc") + (soundex . "./soundex") + (hash-table . "./hashtab") + (logical . "./logical") + (random . "./random") + (random-inexact . "./randinex") + (modular . "./modular") + (factor . "./factor") + (primes . factor) + (eps-graph . "./grapheps") + (charplot . "./charplot") + (sort . "./sort") + (tsort . topological-sort) + (topological-sort . "./tsort") + (common-list-functions . "./comlist") + (tree . "./tree") + (coerce . "./coerce") + (format . "./format") + (generic-write . "./genwrite") + (pretty-print . "./pp") + (pprint-file . "./ppfile") + (object->string . "./obj2str") + (string-case . "./strcase") + (line-i/o . "./lineio") + (string-port . "./strport") + (getopt . "./getopt") + (qp . "./qp") + (eval . "./eval") + (record . "./record") + (synchk . "./synchk") + (defmacroexpand . "./defmacex") + (printf . "./printf") + (scanf defmacro "./scanf") + (stdio-ports . "./stdio") + (stdio aggregate scanf printf stdio-ports) + (break defmacro "./break") + (trace defmacro "./trace") + (debugf . "./debug") + (debug aggregate trace break debugf) + (delay . promise) + (promise macro "./promise") + (macro-by-example defmacro "./mbe") + (syntax-case . "./scainit") + (syntactic-closures . "./scmacro") + (macros-that-work . "./macwork") + (macro . macro-by-example) + (object . "./object") + (yasos macro "./yasyn") + (oop . yasos) + (collect . "./collectx") + (structure syntax-case "./structure") + (values . "./values") + (queue . "./queue") + (priority-queue . "./priorque") + (array . "./array") + (subarray . "./subarray") + (array-for-each . "./arraymap") + (repl . "./repl") + (process . "./process") + (chapter-order . "./chap") + (posix-time . "./psxtime") + (common-lisp-time . "./cltime") + (time-zone defmacro "./timezone") + (relational-database . "./rdms") + (databases . "./dbutil") + (database-utilities . databases) + (database-commands . "./dbcom") + (database-browse . "./dbrowse") + (database-interpolate . "./dbinterp") + (within-database macro "./dbsyn") + (html-form . "./htmlform") + (alist-table . "./alistab") + (parameters . "./paramlst") + (getopt-parameters . "./getparam") + (read-command . "./comparse") + (batch . "./batch") + (glob . "./glob") + (filename . glob) + (crc . "./crc") + (fft . "./fft") + (wt-tree . "./wttree") + (string-search . "./strsrch") + (root . "./root") + (minimize . "./minimize") + (precedence-parse defmacro "./prec") + (parse . precedence-parse) + (commutative-ring . "./cring") + (self-set . "./selfset") + (determinant . "./determ") + (byte . "./byte") + (byte-number . "./bytenumb") + (tzfile . "./tzfile") + (schmooz . "./schmooz") + (transact defmacro "./transact") + (net-clients . transact) + (db->html . "./db2html") + (http defmacro "./http-cgi") + (cgi . http) + (uri defmacro "./uri") + (uniform-resource-identifier . uri) + (pnm . "./pnm") + (metric-units . "./simetrix") + (diff . "./differ") + (solid . "./solid") + (vrml97 . solid) + (vrml . vrml97) + (color defmacro "./color") + (color-space . "./colorspc") + (cie . color-space) + (color-names . "./colornam") + (color-database defmacro "./mkclrnam") + (resene color-names "./clrnamdb.scm") + (saturate color-names "./clrnamdb.scm") + (daylight . "./daylight") + (matfile . "./matfile") + (mat-file . matfile) + (spectral-tristimulus-values . color-space) + (cie1964 spectral-tristimulus-values "./cie1964.xyz") + (cie1931 spectral-tristimulus-values "./cie1931.xyz") + (ciexyz . cie1931) + (cvs defmacro "./cvs") + (html-for-each defmacro "./html4each") + (directory . "./dirs") + (ncbi-dna defmacro "./ncbi-dna") + (manifest . "./manifest") + (top-refs . "./top-refs") + (vet . "./vet") + (srfi-0 . srfi) + (srfi defmacro "./srfi") + (srfi-1 . "./srfi-1") + (srfi-2 defmacro "./srfi-2") + (srfi-8 macro "./srfi-8") + (srfi-9 macro "./srfi-9") + (new-catalog . "./mklibcat") + (*slib-version* . "3a1") +) @@ -20,7 +20,7 @@ VERSION = 3a1 RELEASE = 1 rpm_prefix=/usr/src/redhat/ -prefix = /usr/local/ +prefix = debian/tmp/usr exec_prefix = $(prefix) # directory where `make install' will put executable. bindir = $(exec_prefix)bin/ @@ -29,7 +29,7 @@ infodir = $(prefix)info/ PREVDOCS = prevdocs/ -htmldir=../public_html/ +htmldir=slib_html/ dvidir=../dvi/ RUNNABLE = scheme48 @@ -92,7 +92,7 @@ version.txi: Makefile echo @set SLIBVERSION $(ver) > version.txi echo @set SLIBDATE `date +"%B %Y"` >> version.txi -scheme = scm +scheme = guile-1.6 collect.sc: echo "(require 'macros-that-work)" > collect.sc @@ -104,7 +104,7 @@ collect.sc: collectx.scm: collect.scm macwork.scm collect.sc $(scheme) < collect.sc -ffiles = printf.scm genwrite.scm pp.scm \ +ffiles = printf.scm genwrite.scm pp.scm format.scm \ ppfile.scm strcase.scm debug.scm trace.scm \ strport.scm scanf.scm qp.scm break.scm stdio.scm \ strsrch.scm prec.scm schmooz.scm defmacex.scm mbe.scm @@ -157,13 +157,13 @@ ifiles = bigloo.init chez.init elk.init macscheme.init mitscheme.init \ scheme2c.init scheme48.init s48-0_57.init gambit.init t3.init \ vscm.init scm.init scsh.init pscheme.init STk.init \ RScheme.init DrScheme.init umbscheme.init guile.init -tfiles = plottest.scm macrotst.scm dwindtst.scm +tfiles = plottest.scm macrotst.scm dwindtst.scm formatst.scm sfiles = $(ffiles) $(lfiles) $(revfiles) $(afiles) $(scfiles) $(efiles) \ $(rfiles) $(gfiles) $(scafiles) $(txiscms) $(srfiles) allfiles = $(docfiles) $(mkfiles) $(ifiles) $(sfiles) $(tfiles) $(bfiles) $(txifiles): $(txiscms) schmooz.scm - $(scheme) -rschmooz -e'(schmooz "slib.texi")' + $(scheme) -l guile.init.local -c '(require '\''schmooz) (schmooz "slib.texi")' dvi: $(dvidir)slib.dvi $(dvidir)slib.dvi: version.txi slib.texi $(dvidir)slib.fn \ @@ -185,7 +185,7 @@ $(htmldir)slib.pdf: version.txi slib.texi $(dvidir)slib.fn schmooz.texi xpdf: $(htmldir)slib.pdf xpdf -z 3 $(htmldir)slib.pdf -TEXI2HTML = /usr/local/bin/texi2html -split -verbose +TEXI2HTML = texi2html -split chapter -verbose slib_toc.html: $(txifiles) version.txi slib.texi schmooz.texi ${TEXI2HTML} slib.texi html: $(htmldir)slib_toc.html @@ -193,7 +193,7 @@ $(htmldir)slib_toc.html: slib_toc.html Makefile -rm -f slib_stoc.html if [ -f $(PREVDOCS)slib_toc.html ]; \ then hitch $(PREVDOCS)slib_\*.html slib_\*.html $(htmldir); \ - else cp slib_*.html $(htmldir);fi + else mkdir -p $(htmldir) ; cp slib_*.html $(htmldir);fi slib$(VERSION).info: $(txifiles) version.txi slib.texi schmooz.texi makeinfo slib.texi --no-warn --no-split -o slib.info @@ -374,6 +374,11 @@ report: clean: -rm -f *~ *.bak *.orig *.rej core a.out *.o \#* -rm -rf *temp + -rm -f slib$(VERSION).info + -rm -f version.txi + -rm -rf $(htmldir) + echo $(scheme) -l guile.init.local -c '(require '\''schmooz) (schmooz-which-files "slib.texi")' + distclean: realclean realclean: -rm -f *~ *.bak *.orig *.rej TAGS core a.out *.o \#* diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..99d04fa --- /dev/null +++ b/debian/changelog @@ -0,0 +1,231 @@ +slib (3a1-4.2) unstable; urgency=low + + * Non-maintainer upload. + * Add guile.init.local for use within the build dir, since otherwise we + have an (earlier unnoticed) circular build-dep due to a difference + between scm and guile. + + -- Steve Langasek <vorlon@debian.org> Mon, 10 Jan 2005 08:53:33 +0000 + +slib (3a1-4.1) unstable; urgency=low + + * Non-maintainer upload. + * Build-depend on guile-1.6 instead of scm, since the new version of + scm is wedged in unstable (closes: #281809). + + -- Steve Langasek <vorlon@debian.org> Sat, 8 Jan 2005 17:56:08 -0800 + +slib (3a1-4) unstable; urgency=low + + * Also check for expected creation on slibcat. (Closes: #240096) + + -- James LewisMoss <dres@debian.org> Sun, 28 Mar 2004 17:29:19 -0500 + +slib (3a1-3) unstable; urgency=low + + * Also check for /usr/share/guile/1.6/slib before installing for guile + 1.6. (Closes: #239267) + + -- James LewisMoss <dres@debian.org> Mon, 22 Mar 2004 20:53:40 -0500 + +slib (3a1-2) unstable; urgency=low + + * Add format.scm back into slib until gnucash stops using it. + * Call guile-1.6 new-catalog (Closes: #238231) + + -- James LewisMoss <dres@debian.org> Sat, 20 Mar 2004 16:51:07 -0500 + +slib (3a1-1) unstable; urgency=low + + * New upstream release + * Remove Info section from doc-base file (Closes: #186950) + * Remove period from end of description (linda, lintian) + * html gen fixed upstream (Closes: #111778) + + -- James LewisMoss <dres@debian.org> Sun, 14 Mar 2004 11:56:11 -0500 + +slib (2d4-2) unstable; urgency=low + + * Fix url for upstream source (Closes: #144981) + * Fix typo in slib.texi (enquque->enqueue) (Closes: #147475) + * Add build depends. + + -- James LewisMoss <dres@debian.org> Thu, 23 May 2002 13:33:33 -0400 + +slib (2d4-1) unstable; urgency=low + + * New upstream. + + -- James LewisMoss <dres@debian.org> Fri, 17 May 2002 11:23:06 -0400 + +slib (2d3-1) unstable; urgency=low + + * New upstream. + * Remove texi2html call in debian/rules. Now done upstream. Add make + html instead. + * Changes to rules and doc-base to conform to upstream html gen + * Clean up upstream makefile to make sure it cleans up after itself. + + -- James LewisMoss <dres@debian.org> Sat, 6 Apr 2002 16:27:35 -0500 + +slib (2d2-1) unstable; urgency=low + + * New upstream version + * Revert back to free. Is now so. + + -- James LewisMoss <dres@debian.org> Fri, 27 Jul 2001 23:45:29 -0400 + +slib (2d1-1) unstable; urgency=low + + * New upstream version. + * Move to non-free. FSF pointed out license doesn't allow modified + versions to be distributed. + * Get a complete list of copyrights that apply to the source into + copyright file. + * Remove setup for guile 1.3. + * Remove postrm. Just calling install-info (lintian) Move install-info + call to prerm since doc-base doesn't do install-info. + + -- James LewisMoss <dres@debian.org> Mon, 21 May 2001 23:34:52 -0400 + +slib (2c9-3) unstable; urgency=low + + * Change info location to section "The Algorithmic Language Scheme" to + match up with where guile puts it's files. + * Postinst is running slibconfig now. (Closes: #75891) + + -- James LewisMoss <dres@debian.org> Mon, 11 Dec 2000 03:39:43 -0500 + +slib (2c9-2) unstable; urgency=low + + * Stop installing slibconfig (for guile). + * In postinst if /usr/sbin/slibconnfig exists call it (Close: #75843 + #75891). + + -- James LewisMoss <dres@debian.org> Sun, 5 Nov 2000 00:10:51 -0500 + +slib (2c9-1) unstable; urgency=low + + * New upstream (Closes: #74760) + * replace string-index with strsrch:string-index in http-cgi.scm. + * Add doc-base support (Closes: #31163) + + -- James LewisMoss <dres@debian.org> Sun, 22 Oct 2000 22:15:55 -0400 + +slib (2c7-1) unstable; urgency=low + + * New upstream. + * Add slibconfig back in. + + -- James LewisMoss <dres@debian.org> Mon, 6 Dec 1999 19:32:57 -0500 + +slib (2c6-2) unstable; urgency=low + + * Remove the slib$(VERSION).info file. Cut the diff back down to + size. + + -- James LewisMoss <dres@debian.org> Sat, 13 Nov 1999 14:10:38 -0500 + +slib (2c6-1) unstable; urgency=low + + * New upstream. + * Move docs to /usr/share. Up standards version. add /usr/doc symlink. + Move info files. Remove undocumented link. + + -- James LewisMoss <dres@debian.org> Sat, 13 Nov 1999 12:56:18 -0500 + +slib (2c5-6) unstable; urgency=low + + * Lowercase two vars in yasyn.scm (Fixes bug #37222) + + -- James LewisMoss <dres@debian.org> Sat, 10 Jul 1999 19:17:04 -0400 + +slib (2c5-5) unstable; urgency=low + + * Fix it so string-index isn't defined (now there is a + strsrch:string-index) (Fixes #38812) + + -- James LewisMoss <dres@debian.org> Fri, 9 Jul 1999 21:30:19 -0400 + +slib (2c5-4) unstable; urgency=low + + * Don't run slibconfig in postinst. (Fixes bug #38253, #37733, #37715, + #37746, #37809, #37917, #38123, #38462) + + -- James LewisMoss <dres@debian.org> Thu, 3 Jun 1999 20:19:53 -0400 + +slib (2c5-3) unstable; urgency=low + + * Run slibconfig in postinst. It was commented out there, but I don't + see any old bug reports on why it was commented out, so let's try + again. :) (Fixes bug #37221) + + -- James LewisMoss <dres@debian.org> Wed, 12 May 1999 22:37:02 -0400 + +slib (2c5-2) unstable; urgency=low + + * Link mklibcat.scm to mklibcat. Fixes a problem with using slib with + guile. + + -- James LewisMoss <dres@debian.org> Sun, 7 Mar 1999 21:51:35 -0500 + +slib (2c5-1) unstable; urgency=low + + * New upstream. + + -- James LewisMoss <dres@debian.org> Sun, 7 Mar 1999 10:10:27 -0500 + +slib (2c3-4) unstable; urgency=low + + * New maintainer. + + -- James LewisMoss <dres@debian.org> Fri, 26 Feb 1999 00:52:26 -0500 + +slib (2c3-3) frozen unstable; urgency=low + + * Fixes #16235. + * Fixes #19943. + * Fixes #20265. + * Fixes #24917. + * Fixes #27389. + + -- David N. Welton <davidw@efn.org> Mon, 9 Nov 1998 21:18:01 -0800 + +slib (2c3-2) frozen unstable; urgency=low + + * Re-uploaded for slink freeze. + + -- David N. Welton <davidw@efn.org> Mon, 2 Nov 1998 21:07:07 -0800 + +slib (2c3-1) unstable; urgency=low + + * New upstream release. + + -- David N. Welton <davidw@efn.org> Mon, 26 Oct 1998 22:14:30 -0800 + +slib (2c0-3) unstable; urgency=low + + * New maintainer. + * slibconfig script to automatically configure guile. + * Fix type in description, closes: Bug#18996 + + -- Jim Pick <jim@jimpick.com> Sun, 8 Mar 1998 23:05:22 -0800 + +slib (2c0-2) unstable; urgency=low + + * Minor fix for debian/rules targets + + -- Rob Browning <rlb@cs.utexas.edu> Fri, 12 Dec 1997 17:35:22 -0600 + +slib (2c0-1) unstable; urgency=low + + * New upstream source + * New maintainer + + -- Rob Browning <rlb@cs.utexas.edu> Fri, 12 Dec 1997 16:49:13 -0600 + +slib (2a6-1) unstable; urgency=low + + * First Debian release. + + -- Karl Sackett <krs@debian.org> Mon, 16 Dec 1996 09:23:46 -0600 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..084f82f --- /dev/null +++ b/debian/control @@ -0,0 +1,17 @@ +Source: slib +Section: devel +Priority: optional +Maintainer: James LewisMoss <dres@debian.org> +Build-Depends-Indep: guile-1.6, texi2html, texinfo +Standards-Version: 3.1.0 + +Package: slib +Section: devel +Priority: optional +Architecture: all +Description: Portable Scheme library + SLIB is a portable scheme library meant to provide compatibility and + utility functions for all standard scheme implementations. SLIB + includes initialization files for Chez, ELK 2.1, GAMBIT, MacScheme, + MITScheme, scheme->C, Scheme48, T3.1, and VSCM. SCM also supports + SLIB. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..0445f9e --- /dev/null +++ b/debian/copyright @@ -0,0 +1,580 @@ +This is the Debian GNU/Linux prepackaged version of slib. + +This package was put together by Rob Browning <rlb@cs.utexas.edu> and +continued by James LewisMoss <dres@debian.org> from sources obtained +from: + + http://swissnet.ai.mit.edu/ftpdir/scm/slib2d4.zip + +For more information see: + + http://www-swiss.ai.mit.edu/~jaffer/SLIB.html + +Following are a list of source files followed by the copyright that +applies to them. + +alist.scm alistab.scm arraymap.scm batch.scm break.scm Bev2slib.scm +chap.scm charplot.scm cltime.scm coerce.scm comparse.scm cring.scm +db2html.scm dbrowse.scm dbutil.scm debug.scm dwindtst.scm dynwind.scm +eval.scm factor.scm fft.scm fluidlet.scm getopt.scm getparam.scm +hash.scm hashtab.scm htmlform.scm http-cgi.scm lineio.scm logical.scm +makcrc.scm mklibcat.scm modular.scm mulapply.scm nclients.scm +obj2str.scm paramlst.scm plottest.scm pnm.scm ppfile.scm prec.scm +printf.scm priorque.scm process.scm psxtime.scm qp.scm randinex.scm +random.scm rdms.scm repl.scm report.scm require.scm root.scm sc2.scm +sc4opt.scm sc4sc3.scm scanf.scm scmacro.scm simetrix.scm structst.scm +tek40.scm tek41.scm timezone.scm trace.scm trnscrpt.scm tzfile.scm +uri.scm withfile.scm +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. +format.scm formatst.scm Template.scm +;;; "Template.scm" configuration template of *features* for Scheme -*-scheme-*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. +array.scm +;;;;"array.scm" Arrays for Scheme +; Copyright (C) 1993 Alan Bawden +; +; Permission to copy this software, to redistribute it, and to use it +; for any purpose is granted, subject to the following restrictions and +; understandings. +; +; 1. Any copy made of this software must include this copyright notice +; in full. +; +; 2. Users of this software agree to make their best efforts (a) to +; return to me any improvements or extensions that they make, so that +; these may be included in future releases; and (b) to inform me of +; noteworthy uses of this software. +; +; 3. I have made no warrantee or representation that the operation of +; this software will be error-free, and I am under no obligation to +; provide any services, by way of maintenance, update, or otherwise. +; +; 4. In conjunction with products arising from the use of this material, +; there shall be no use of my name in any advertising, promotional, or +; sales literature without prior written consent in each case. +; +; Alan Bawden +; MIT Room NE43-510 +; 545 Tech. Sq. +; Cambridge, MA 02139 +; Alan@LCS.MIT.EDU +byte.scm determ.scm mularg.scm +;; NO COPYRIGHT +collect.scm +;"collect.scm" Sample collection operations +; COPYRIGHT (c) Kenneth Dickey 1992 +; +; This software may be used for any purpose whatever +; without warrantee of any kind. +; AUTHOR Ken Dickey +; DATE 1992 September 1 +; LAST UPDATED 1992 September 2 +; NOTES Expository (optimizations & checks elided). +; Requires YASOS (Yet Another Scheme Object System). +comlist.scm +;;"comlist.scm" Implementation of COMMON LISP list functions for Scheme +; Copyright (C) 1991, 1993, 1995 Aubrey Jaffer. +; Copyright (C) 2000 Colin Walters +; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. +defmacex.scm +;;;"defmacex.scm" defmacro:expand* for any Scheme dialect. +;;;Copyright 1993-1994 Dorai Sitaram and Aubrey Jaffer. +; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. +dynamic.scm +; "dynamic.scm", DYNAMIC data type for Scheme +; Copyright 1992 Andrew Wilcox. +; +; You may freely copy, redistribute and modify this package. +genwrite.scm +;;"genwrite.scm" generic write used by pretty-print and truncated-print. +;; Copyright (c) 1991, Marc Feeley +;; Author: Marc Feeley (feeley@iro.umontreal.ca) +;; Distribution restrictions: none +glob.scm +;;; "glob.scm" String matching for filenames (a la BASH). +;;; Copyright (C) 1998 Radey Shouman. +; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. +macrotst.scm +;;;"macrotst.scm" Test for R4RS Macros +;;; From Revised^4 Report on the Algorithmic Language Scheme +;;; Editors: William Clinger and Jonathon Rees +; +; We intend this report to belong to the entire Scheme community, and so +; we grant permission to copy it in whole or in part without fee. In +; particular, we encourage implementors of Scheme to use this report as +; a starting point for manuals and other documentation, modifying it as +; necessary. +macwork.scm mwdenote.scm mwexpand.scm mwsynrul.scm +;;;; "macwork.scm": Will Clinger's macros that work. -*- Scheme -*- +;Copyright 1992 William Clinger +; +; Permission to copy this software, in whole or in part, to use this +; software for any lawful purpose, and to redistribute this software +; is granted subject to the restriction that all copies made of this +; software must include this copyright notice in full. +; +; I also request that you send me a copy of any improvements that you +; make to this software so that they may be incorporated within it to +; the benefit of the Scheme community. +mbe.scm +;;;; "mbe.scm" "Macro by Example" (Eugene Kohlbecker, R4RS) +;;; From: Dorai Sitaram, dorai@cs.rice.edu, 1991, 1999 +; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. +minimize.scm +;;; "minimize.scm" finds minimum f(x) for x0 <= x <= x1. +;;; Author: Lars Arvestad +;;; +;;; This code is in the public domain. +object.scm +;;; "object.scm" Macroless Object System +;;;From: whumeniu@datap.ca (Wade Humeniuk) +pp.scm +;"pp.scm" Pretty-Print +promise.scm +;;;"promise.scm" promise for force and delay +;;; From Revised^4 Report on the Algorithmic Language Scheme +;;; Editors: William Clinger and Jonathon Rees +; +; We intend this report to belong to the entire Scheme community, and so +; we grant permission to copy it in whole or in part without fee. In +; particular, we encourage implementors of Scheme to use this report as +; a starting point for manuals and other documentation, modifying it as +; necessary. +queue.scm +; "queue.scm" Queues/Stacks for Scheme +; Written by Andrew Wilcox (awilcox@astro.psu.edu) on April 1, 1992. +; +; This code is in the public domain. +r4rsyn.scm synchk.scm synclo.scm synrul.scm +;;; "r4rsyn.scm" R4RS syntax -*-Scheme-*- +;;; Copyright (c) 1989-91 Massachusetts Institute of Technology +;;; +;;; This material was developed by the Scheme project at the +;;; Massachusetts Institute of Technology, Department of Electrical +;;; Engineering and Computer Science. Permission to copy this +;;; software, to redistribute it, and to use it for any purpose is +;;; granted, subject to the following restrictions and understandings. +;;; +;;; 1. Any copy made of this software must include this copyright +;;; notice in full. +;;; +;;; 2. Users of this software agree to make their best efforts (a) to +;;; return to the MIT Scheme project any improvements or extensions +;;; that they make, so that these may be included in future releases; +;;; and (b) to inform MIT of noteworthy uses of this software. +;;; +;;; 3. All materials developed as a consequence of the use of this +;;; software shall duly acknowledge such use, in accordance with the +;;; usual standards of acknowledging credit in academic research. +;;; +;;; 4. MIT has made no warrantee or representation that the operation +;;; of this software will be error-free, and MIT is under no +;;; obligation to provide any services, by way of maintenance, update, +;;; or otherwise. +;;; +;;; 5. In conjunction with products arising from the use of this +;;; material, there shall be no use of the name of the Massachusetts +;;; Institute of Technology nor of any adaptation thereof in any +;;; advertising, promotional, or sales literature without prior +;;; written consent from MIT in each case. +ratize.scm +;;;; "ratize.scm" Find simplest number ratios +recobj.scm +;;; "recobj.scm" Records implemented as objects. +;;;From: whumeniu@datap.ca (Wade Humeniuk) +record.scm +; "record.scm" record data types +; Written by David Carlton, carlton@husc.harvard.edu. +; Re-Written by Aubrey Jaffer, jaffer@ai.mit.edu, 1996, 1997 +; +; This code is in the public domain. +scaexpp.scm scaglob.scm scainit.scm scamacr.scm scaoutp.scm structure.scm +;;; "scaoutp.scm" syntax-case output +;;; Copyright (C) 1992 R. Kent Dybvig +;;; +;;; Permission to copy this software, in whole or in part, to use this +;;; software for any lawful purpose, and to redistribute this software +;;; is granted subject to the restriction that all copies made of this +;;; software must include this copyright notice in full. This software +;;; is provided AS IS, with NO WARRANTY, EITHER EXPRESS OR IMPLIED, +;;; INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY +;;; OR FITNESS FOR ANY PARTICULAR PURPOSE. IN NO EVENT SHALL THE +;;; AUTHORS BE LIABLE FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES OF ANY +;;; NATURE WHATSOEVER. +schmooz.scm +;;; "schmooz.scm" Program for extracting texinfo comments from Scheme. +;;; Copyright (C) 1998, 2000 Radey Shouman and Aubrey Jaffer. +; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. +scmactst.scm +;;;"scmactst.scm" test syntactic closures macros +;;; From "sc-macro.doc", A Syntactic Closures Macro Facility by Chris Hanson +selfset.scm +;;"selfset.scm" Set single letter identifiers to their symbols. +sierpinski.scm +;"sierpinski.scm" Hash function for 2d data which preserves nearness. +;From: jjb@isye.gatech.edu (John Bartholdi) +; +; This code is in the public domain. +sort.scm +;;; "sort.scm" Defines: sorted?, merge, merge!, sort, sort! +;;; Author : Richard A. O'Keefe (based on Prolog code by D.H.D.Warren) +;;; +;;; This code is in the public domain. +soundex.scm +;"soundex.scm" Original SOUNDEX algorithm. +;From jjb@isye.gatech.edu Mon May 2 22:29:43 1994 +; +; This code is in the public domain. +stdio.scm +;; "stdio.scm" compatability stub +strcase.scm +;;; "strcase.scm" String casing functions. +; Written 1992 by Dirk Lutzebaeck (lutzeb@cs.tu-berlin.de) +; +; This code is in the public domain. +strport.scm +;;;;"strport.scm" Portable string ports for Scheme +;;;Copyright 1993 Dorai Sitaram and Aubrey Jaffer. +; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. +strsrch.scm +;;; "MISCIO" Search for string from port. +; Written 1995, 1996 by Oleg Kiselyov (oleg@ponder.csci.unt.edu) +; Modified 1996, 1997, 1998 by A. Jaffer (jaffer@ai.mit.edu) +; +; This code is in the public domain. +struct.scm +;;; "struct.scm": defmacros for RECORDS +;;; Copyright 1992 Jeff Alexander, Shinnder Lee, and Lewis Patterson +tree.scm +;;"tree.scm" Implementation of COMMON LISP tree functions for Scheme +; Copyright 1993, 1994 David Love (d.love@dl.ac.uk) +; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. +tsort.scm +;;; "tsort.scm" Topological sort +;;; Copyright (C) 1995 Mikael Djurfeldt +; +; This code is in the public domain. +values.scm +;"values.scm" multiple values +;By david carlton, carlton@husc.harvard.edu. +; +;This code is in the public domain. +wttest.scm +;; "wttrtst.scm" Test Weight balanced trees -*-Scheme-*- +;; Copyright (c) 1993-1994 Stephen Adams +;; +;; Copyright (c) 1993-94 Massachusetts Institute of Technology +;; +;; This material was developed by the Scheme project at the Massachusetts +;; Institute of Technology, Department of Electrical Engineering and +;; Computer Science. Permission to copy this software, to redistribute +;; it, and to use it for any purpose is granted, subject to the following +;; restrictions and understandings. +;; +;; 1. Any copy made of this software must include this copyright notice +;; in full. +;; +;; 2. Users of this software agree to make their best efforts (a) to +;; return to the MIT Scheme project any improvements or extensions that +;; they make, so that these may be included in future releases; and (b) +;; to inform MIT of noteworthy uses of this software. +;; +;; 3. All materials developed as a consequence of the use of this +;; software shall duly acknowledge such use, in accordance with the usual +;; standards of acknowledging credit in academic research. +;; +;; 4. MIT has made no warrantee or representation that the operation of +;; this software will be error-free, and MIT is under no obligation to +;; provide any services, by way of maintenance, update, or otherwise. +;; +;; 5. In conjunction with products arising from the use of this material, +;; there shall be no use of the name of the Massachusetts Institute of +;; Technology nor of any adaptation thereof in any advertising, +;; promotional, or sales literature without prior written consent from +;; MIT in each case. +wttree.scm +;; "wttree.scm" Weight balanced trees -*-Scheme-*- +;; Copyright (c) 1993-1994 Stephen Adams +;; +;; $Id: wttree.scm,v 1.3 1999/10/11 03:36:29 jaffer Exp $ +;; +;; References: +;; +;; Stephen Adams, Implemeting Sets Efficiently in a Functional +;; Language, CSTR 92-10, Department of Electronics and Computer +;; Science, University of Southampton, 1992 +;; +;; +;; Copyright (c) 1993-94 Massachusetts Institute of Technology +;; +;; This material was developed by the Scheme project at the Massachusetts +;; Institute of Technology, Department of Electrical Engineering and +;; Computer Science. Permission to copy this software, to redistribute +;; it, and to use it for any purpose is granted, subject to the following +;; restrictions and understandings. +;; +;; 1. Any copy made of this software must include this copyright notice +;; in full. +;; +;; 2. Users of this software agree to make their best efforts (a) to +;; return to the MIT Scheme project any improvements or extensions that +;; they make, so that these may be included in future releases; and (b) +;; to inform MIT of noteworthy uses of this software. +;; +;; 3. All materials developed as a consequence of the use of this +;; software shall duly acknowledge such use, in accordance with the usual +;; standards of acknowledging credit in academic research. +;; +;; 4. MIT has made no warrantee or representation that the operation of +;; this software will be error-free, and MIT is under no obligation to +;; provide any services, by way of maintenance, update, or otherwise. +;; +;; 5. In conjunction with products arising from the use of this material, +;; there shall be no use of the name of the Massachusetts Institute of +;; Technology nor of any adaptation thereof in any advertising, +;; promotional, or sales literature without prior written consent from +;; MIT in each case. +yasyn.scm +;;"yasyn.scm" YASOS in terms of "object.scm" +;;;From: whumeniu@datap.ca (Wade Humeniuk) +DrScheme.init +;;;"DrScheme.init" Initialization for SLIB for DrScheme -*-scheme-*- +;; Friedrich Dominicus <frido@q-software-solutions.com> +;; Newsgroups: comp.lang.scheme +;; Date: 02 Oct 2000 09:24:57 +0200 +RScheme.init +;;;"RScheme.init" Initialization for SLIB for RScheme -*-scheme-*- +;;;; From http://www.rscheme.org/rs/pg1/RScheme.scm +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. +;;; +;;; adapted for RScheme by Donovan Kolbly -- (v1 1997-09-14) +;;; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. +STk.init +;;;"STk.init" SLIB Initialization for STk -*-scheme-*- +;;; Authors: Erick Gallesio (eg@unice.fr) and Aubrey Jaffer. +;;; +;;; This code is in the public domain. +bigloo.init +;; "bigloo.init" Initialization for SLIB for Bigloo -*-scheme-*- +;; Copyright 1994 Robert Sanders +;; Copyright 1991, 1992, 1993 Aubrey Jaffer +;; Copyright 1991 David Love +;; +;; Permission to copy this software, to redistribute it, and to use it +;; for any purpose is granted, subject to the following restrictions and +;; understandings. +;; +;; 1. Any copy made of this software must include this copyright notice +;; in full. +;; +;; 2. I have made no warrantee or representation that the operation of +;; this software will be error-free, and I am under no obligation to +;; provide any services, by way of maintenance, update, or otherwise. +;; +;; 3. In conjunction with products arising from the use of this +;; material, there shall be no use of my name in any advertising, +;; promotional, or sales literature without prior written consent in +;; each case. +chez.init +;;;"chez.init" Initialization file for SLIB for Chez Scheme 6.0a -*-scheme-*- +;;; Authors: dorai@cs.rice.edu (Dorai Sitaram) and Aubrey Jaffer. +;;; +;;; This code is in the public domain. +elk.init +;;;"elk.init" Initialisation file for SLIB for ELK 2.1 -*- Scheme -*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. +gambit.init +;;;"gambit.init" Initialization for SLIB for Gambit -*-scheme-*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. +macscheme.init +;;;"macscheme.init" Configuration of *features* for MacScheme -*-scheme-*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. +mitscheme.init +;;;"mitscheme.init" Initialization for SLIB for MITScheme -*-scheme-*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. +pscheme.init +;;; "pscheme.init" SLIB init file for Pocket Scheme -*-scheme-*- +;;; Author: Ben Goetter <goetter@mazama.net> +;;; last revised for 1.1.0 on 16 October 2000 +;;; Initial work for 0.2.3 by Robert Goldman (goldman@htc.honeywell.com) +;;; SLIB orig Author: Aubrey Jaffer (jaffer@ai.mit.edu) +;;; +;;; This code is in the public domain. +scheme2c.init +;;; "scheme2c.init" Initialisation for SLIB for Scheme->C on Sun -*-scheme-*- +;;; Authors: David Love and Aubrey Jaffer +;;; +;;; This code is in the public domain. +scheme48.init +;;;"scheme48.init" Initialisation for SLIB for Scheme48 -*-scheme-*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. +scm.init +;"scm.init" Configuration file for SLIB for SCM -*-scheme-*- +scsh.init +;;; "scsh.init" Initialisation for SLIB for Scsh 0.5.1 -*-scheme-*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. +t3.init +;;; "t3.init" Initialization file for SLIB for T3.1. -*-scheme-*- +;;; Authors: David Carlton, Stephen Bevan, F. Javier Thayer, and Aubrey Jaffer. +;;; +;;; This code is in the public domain. +umbscheme.init +;;; "umbscheme.init" Initialization for SLIB for umb-scheme -*-scheme-*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. +vscm.init +;;; "vscm.init" Configuration of *features* for VSCM -*-scheme-*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. diff --git a/debian/doc-base b/debian/doc-base new file mode 100644 index 0000000..dc4d265 --- /dev/null +++ b/debian/doc-base @@ -0,0 +1,10 @@ +Document: slib +Title: slib Scheme library documentation +Author: Aubrey Jaffer +Abstract: This manual describes the facilities and functions + provided by the slib scheme library. +Section: Apps/Programming + +Format: HTML +Index: /usr/share/doc/slib/slib_toc.html +Files: /usr/share/doc/slib/slib_*.html diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 0000000..88aa502 --- /dev/null +++ b/debian/postinst @@ -0,0 +1,31 @@ +#!/bin/sh +set -e + +install-info --quiet --section "The Algorithmic Language Scheme" \ + "The Algorithmic Language Scheme" \ + --description="The SLIB portable Scheme library" \ + /usr/share/info/slib.info.gz + +# OK. This is bad because it really should be in the guile config or +# in some emacs-commond sort of package. Now we conditionally run it. +# one of these probably shouldn't exist, but don't know which and +# probably shourld support the older. +if [ -x /usr/sbin/guile1.4-slibconfig ] ; then + echo Running /usr/sbin/guile1.4-slibconfig + /usr/sbin/guile1.4-slibconfig +fi + +if [ -x /usr/bin/guile-1.6 -a -e /usr/share/guile/1.6/slib ] ; then + rm -f /usr/share/guile/1.6/slibcat + /usr/bin/guile-1.6 -c "(use-modules (ice-9 slib)) (require 'new-catalog)" + if [ -e /usr/share/guile/1.6/slibcat ] ; then + chmod 644 /usr/share/guile/1.6/slibcat + fi +fi + +# doc base support +if [ "$1" = configure ]; then + if command -v install-docs >/dev/null 2>&1; then + install-docs -i /usr/share/doc-base/slib + fi +fi diff --git a/debian/prerm b/debian/prerm new file mode 100644 index 0000000..3dbde02 --- /dev/null +++ b/debian/prerm @@ -0,0 +1,16 @@ +#!/bin/sh + +set -e + +if [ \( "$1" = "upgrade" -o "$1" = "remove" \) -a -L /usr/doc/slib ]; then + rm -f /usr/doc/slib +fi + +# doc base support +if [ "$1" = remove -o "$1" = upgrade ]; then + if command -v install-docs >/dev/null 2>&1; then + install-docs -r slib + fi +fi + +install-info --quiet --remove /usr/share/info/slib.info.gz diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..ed0da6b --- /dev/null +++ b/debian/rules @@ -0,0 +1,96 @@ +#! /usr/bin/make -f +# -*-Makefile-*- + +SCHEME_LIBRARY_PATH=./ +export SCHEME_LIBRARY_PATH + +CC =gcc +CFLAGS =-O2 -g -Wall +LDFLAGS = + +SHELL =/bin/sh +srcdir =. + +INSTALL =/usr/bin/install +INSTALL_DIR =$(INSTALL) -d -m 755 -o root -g root +INSTALL_PROGRAM =$(INSTALL) -m 755 -o root -g root +INSTALL_DATA =$(INSTALL) -m 644 -o root -g root +INSTALL_MAN =$(INSTALL) -m 444 -o root -g root + +build: + $(checkdir) + make + make html + touch build + +clean: + $(checkdir) + -rm slib.info* + make clean + -rm -f build + -rm -rf debian/tmp* *~ debian/*~ debian/files debian/substvars + +binary-arch: checkroot + $(checkdir) + +binary-indep: checkroot build + $(checkdir) + -rm -rf debian/tmp* + +# debian/tmp + $(INSTALL_DIR) debian/tmp + $(INSTALL_DIR) debian/tmp/DEBIAN + $(INSTALL_PROGRAM) debian/postinst debian/tmp/DEBIAN + $(INSTALL_PROGRAM) debian/prerm debian/tmp/DEBIAN + +# library + $(INSTALL_DIR) debian/tmp/usr/share/slib + $(INSTALL_DATA) *.scm debian/tmp/usr/share/slib + # this fixes a load problem with guile + ( cd debian/tmp/usr/share/slib ; ln -s mklibcat.scm mklibcat ) + +# documentation + $(INSTALL_DIR) debian/tmp/usr/share/doc/slib + $(INSTALL_DATA) debian/copyright debian/tmp/usr/share/doc/slib + $(INSTALL_DATA) debian/changelog \ + debian/tmp/usr/share/doc/slib/changelog.Debian + gzip -9v debian/tmp/usr/share/doc/slib/changelog.Debian + + $(INSTALL_DATA) ChangeLog debian/tmp/usr/share/doc/slib/changelog + gzip -9v debian/tmp/usr/share/doc/slib/changelog + $(INSTALL_DATA) README debian/tmp/usr/share/doc/slib + gzip -9v debian/tmp/usr/share/doc/slib/README + $(INSTALL_DATA) FAQ debian/tmp/usr/share/doc/slib + gzip -9v debian/tmp/usr/share/doc/slib/FAQ + $(INSTALL_DATA) slib_html/*.html debian/tmp/usr/share/doc/slib + + $(INSTALL_DIR) debian/tmp/usr/share/slib/init + $(INSTALL_DATA) *.init debian/tmp/usr/share/slib/init + + $(INSTALL_DIR) debian/tmp/usr/share/doc-base + $(INSTALL_DATA) debian/doc-base debian/tmp/usr/share/doc-base/slib + +# info pages + $(INSTALL_DIR) debian/tmp/usr/share/info + $(INSTALL_DATA) slib.info* debian/tmp/usr/share/info + gzip -9v debian/tmp/usr/share/info/* + +# slibconfig + + #$(INSTALL_DIR) debian/tmp/usr/sbin + #$(INSTALL_PROGRAM) debian/slibconfig debian/tmp/usr/sbin + + dpkg-gencontrol -is -ip + dpkg --build debian/tmp .. + +define checkdir + test -f slib.texi -a -f debian/rules +endef + +binary: binary-indep binary-arch + +checkroot: + $(checkdir) + test root = "`whoami`" + +.PHONY: config build clean binary binary-arch binary-indep diff --git a/debian/slibconfig b/debian/slibconfig new file mode 100644 index 0000000..05eee30 --- /dev/null +++ b/debian/slibconfig @@ -0,0 +1,7 @@ +#! /bin/sh + +if [ -d /usr/share/guile -a -x /usr/bin/guile ]; then + (cd /usr/share/guile + guile -c "(use-modules (ice-9 slib)) (require 'new-catalog)" + ) +fi diff --git a/format.scm b/format.scm new file mode 100644 index 0000000..c9e1d12 --- /dev/null +++ b/format.scm @@ -0,0 +1,1688 @@ +;;; "format.scm" Common LISP text output formatter for SLIB +; Written 1992-1994 by Dirk Lutzebaeck (lutzeb@cs.tu-berlin.de) +; +; This code is in the public domain. + +; Authors of the original version (< 1.4) were Ken Dickey and Aubrey Jaffer. +; Please send error reports to the email address above. +; For documentation see slib.texi and format.doc. +; For testing load formatst.scm. +; +; Version 3.0 + +(provide 'format) +(require 'string-case) +(require 'string-port) +(require 'multiarg/and-) +(require 'rev4-optional-procedures) + +;;; Configuration ------------------------------------------------------------ + +(define format:symbol-case-conv #f) +;; Symbols are converted by symbol->string so the case of the printed +;; symbols is implementation dependent. format:symbol-case-conv is a +;; one arg closure which is either #f (no conversion), string-upcase!, +;; string-downcase! or string-capitalize!. + +(define format:iobj-case-conv #f) +;; As format:symbol-case-conv but applies for the representation of +;; implementation internal objects. + +(define format:expch #\E) +;; The character prefixing the exponent value in ~e printing. + +(define format:iteration-bounded #t) +;; If #t, "~{...~}" iterates no more than format:max-iterations times; +;; if #f, there is no bound. + +(define format:max-iterations 100) +;; Compatible with previous versions. + +(define format:floats (provided? 'inexact)) +;; Detects if the scheme system implements flonums (see at eof). + +(define format:complex-numbers (provided? 'complex)) +;; Detects if the scheme system implements complex numbers. + +(define format:radix-pref (char=? #\# (string-ref (number->string 8 8) 0))) +;; Detects if number->string adds a radix prefix. + +(define format:ascii-non-printable-charnames + '#("nul" "soh" "stx" "etx" "eot" "enq" "ack" "bel" + "bs" "ht" "nl" "vt" "np" "cr" "so" "si" + "dle" "dc1" "dc2" "dc3" "dc4" "nak" "syn" "etb" + "can" "em" "sub" "esc" "fs" "gs" "rs" "us" "space")) + +;;; End of configuration ---------------------------------------------------- + +(define format:version "3.0") +(define format:port #f) ; curr. format output port +(define format:output-col 0) ; curr. format output tty column +(define format:flush-output #f) ; flush output at end of formatting +(define format:case-conversion #f) +(define format:error-continuation #f) +(define format:args #f) +(define format:pos 0) ; curr. format string parsing position +(define format:arg-pos 0) ; curr. format argument position + ; this is global for error presentation + +; format string and char output routines on format:port + +(define (format:out-str str) + (if format:case-conversion + (display (format:case-conversion str) format:port) + (display str format:port)) + (set! format:output-col + (+ format:output-col (string-length str)))) + +(define (format:out-char ch) + (if format:case-conversion + (display (format:case-conversion (string ch)) format:port) + (write-char ch format:port)) + (set! format:output-col + (if (char=? ch #\newline) + 0 + (+ format:output-col 1)))) + +;(define (format:out-substr str i n) ; this allocates a new string +; (display (substring str i n) format:port) +; (set! format:output-col (+ format:output-col n))) + +(define (format:out-substr str i n) + (do ((k i (+ k 1))) + ((= k n)) + (write-char (string-ref str k) format:port)) + (set! format:output-col (+ format:output-col n))) + +;(define (format:out-fill n ch) ; this allocates a new string +; (format:out-str (make-string n ch))) + +(define (format:out-fill n ch) + (do ((i 0 (+ i 1))) + ((= i n)) + (write-char ch format:port)) + (set! format:output-col (+ format:output-col n))) + +; format's user error handler + +(define (format:error . args) ; never returns! + (let ((error-continuation format:error-continuation) + (format-args format:args) + (port (current-error-port))) + (set! format:error format:intern-error) + (if (and (>= (length format:args) 2) + (string? (cadr format:args))) + (let ((format-string (cadr format-args))) + (if (not (zero? format:arg-pos)) + (set! format:arg-pos (- format:arg-pos 1))) + (format port "~%FORMAT: error with call: (format ~a \"~a<===~a\" ~ + ~{~a ~}===>~{~a ~})~% " + (car format:args) + (substring format-string 0 format:pos) + (substring format-string format:pos + (string-length format-string)) + (format:list-head (cddr format:args) format:arg-pos) + (list-tail (cddr format:args) format:arg-pos))) + (format port + "~%FORMAT: error with call: (format~{ ~a~})~% " + format:args)) + (apply format port args) + (newline port) + (set! format:error format:error-save) + (set! format:error-continuation error-continuation) + (format:abort) + (format:intern-error "format:abort does not jump to toplevel!"))) + +(define format:error-save format:error) + +(define (format:intern-error . args) ;if something goes wrong in format:error + (display "FORMAT: INTERNAL ERROR IN FORMAT:ERROR!") (newline) + (display " format args: ") (write format:args) (newline) + (display " error args: ") (write args) (newline) + (set! format:error format:error-save) + (format:abort)) + +(define (format:format . args) ; the formatter entry + (set! format:args args) + (set! format:arg-pos 0) + (set! format:pos 0) + (if (< (length args) 1) + (format:error "not enough arguments")) + + ;; If the first argument is a string, then that's the format string. + ;; (Scheme->C) + ;; In this case, put the argument list in canonical form. + (let ((args (if (string? (car args)) + (cons #f args) + args))) + ;; Use this canonicalized version when reporting errors. + (set! format:args args) + + (let ((destination (car args)) + (arglist (cdr args))) + (cond + ((or (and (boolean? destination) ; port output + destination) + (output-port? destination) + (number? destination)) + (format:out (cond + ((boolean? destination) (current-output-port)) + ((output-port? destination) destination) + ((number? destination) (current-error-port))) + (car arglist) (cdr arglist))) + ((and (boolean? destination) ; string output + (not destination)) + (call-with-output-string + (lambda (port) (format:out port (car arglist) (cdr arglist))))) + (else + (format:error "illegal destination `~a'" destination)))))) + +(define (format:out port fmt args) ; the output handler for a port + (set! format:port port) ; global port for output routines + (set! format:case-conversion #f) ; modifier case conversion procedure + (set! format:flush-output #f) ; ~! reset + (let ((arg-pos (format:format-work fmt args)) + (arg-len (length args))) + (cond + ((< arg-pos arg-len) + (set! format:arg-pos (+ arg-pos 1)) + (set! format:pos (string-length fmt)) + (format:error "~a superfluous argument~:p" (- arg-len arg-pos))) + ((> arg-pos arg-len) + (set! format:arg-pos (+ arg-len 1)) + (display format:arg-pos) + (format:error "~a missing argument~:p" (- arg-pos arg-len))) + (else + (if format:flush-output (force-output port)) + #t)))) + +(define format:parameter-characters + '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\- #\+ #\v #\# #\')) + +(define (format:format-work format-string arglist) ; does the formatting work + (letrec + ((format-string-len (string-length format-string)) + (arg-pos 0) ; argument position in arglist + (arg-len (length arglist)) ; number of arguments + (modifier #f) ; 'colon | 'at | 'colon-at | #f + (params '()) ; directive parameter list + (param-value-found #f) ; a directive parameter value found + (conditional-nest 0) ; conditional nesting level + (clause-pos 0) ; last cond. clause beginning char pos + (clause-default #f) ; conditional default clause string + (clauses '()) ; conditional clause string list + (conditional-type #f) ; reflects the contional modifiers + (conditional-arg #f) ; argument to apply the conditional + (iteration-nest 0) ; iteration nesting level + (iteration-pos 0) ; iteration string beginning char pos + (iteration-type #f) ; reflects the iteration modifiers + (max-iterations #f) ; maximum number of iterations + (recursive-pos-save format:pos) + + (next-char ; gets the next char from format-string + (lambda () + (let ((ch (peek-next-char))) + (set! format:pos (+ 1 format:pos)) + ch))) + + (peek-next-char + (lambda () + (if (>= format:pos format-string-len) + (format:error "illegal format string") + (string-ref format-string format:pos)))) + + (one-positive-integer? + (lambda (params) + (cond + ((null? params) #f) + ((and (integer? (car params)) + (>= (car params) 0) + (= (length params) 1)) #t) + (else (format:error "one positive integer parameter expected"))))) + + (next-arg + (lambda () + (if (>= arg-pos arg-len) + (begin + (set! format:arg-pos (+ arg-len 1)) + (format:error "missing argument(s)"))) + (add-arg-pos 1) + (list-ref arglist (- arg-pos 1)))) + + (prev-arg + (lambda () + (add-arg-pos -1) + (if (negative? arg-pos) + (format:error "missing backward argument(s)")) + (list-ref arglist arg-pos))) + + (rest-args + (lambda () + (let loop ((l arglist) (k arg-pos)) ; list-tail definition + (if (= k 0) l (loop (cdr l) (- k 1)))))) + + (add-arg-pos + (lambda (n) + (set! arg-pos (+ n arg-pos)) + (set! format:arg-pos arg-pos))) + + (anychar-dispatch ; dispatches the format-string + (lambda () + (if (>= format:pos format-string-len) + arg-pos ; used for ~? continuance + (let ((char (next-char))) + (cond + ((char=? char #\~) + (set! modifier #f) + (set! params '()) + (set! param-value-found #f) + (tilde-dispatch)) + (else + (if (and (zero? conditional-nest) + (zero? iteration-nest)) + (format:out-char char)) + (anychar-dispatch))))))) + + (tilde-dispatch + (lambda () + (cond + ((>= format:pos format-string-len) + (format:out-str "~") ; tilde at end of string is just output + arg-pos) ; used for ~? continuance + ((and (or (zero? conditional-nest) + (memv (peek-next-char) ; find conditional directives + (append '(#\[ #\] #\; #\: #\@ #\^) + format:parameter-characters))) + (or (zero? iteration-nest) + (memv (peek-next-char) ; find iteration directives + (append '(#\{ #\} #\: #\@ #\^) + format:parameter-characters)))) + (case (char-upcase (next-char)) + + ;; format directives + + ((#\A) ; Any -- for humans + (set! format:read-proof (memq modifier '(colon colon-at))) + (format:out-obj-padded (memq modifier '(at colon-at)) + (next-arg) #f params) + (anychar-dispatch)) + ((#\S) ; Slashified -- for parsers + (set! format:read-proof (memq modifier '(colon colon-at))) + (format:out-obj-padded (memq modifier '(at colon-at)) + (next-arg) #t params) + (anychar-dispatch)) + ((#\D) ; Decimal + (format:out-num-padded modifier (next-arg) params 10) + (anychar-dispatch)) + ((#\X) ; Hexadecimal + (format:out-num-padded modifier (next-arg) params 16) + (anychar-dispatch)) + ((#\O) ; Octal + (format:out-num-padded modifier (next-arg) params 8) + (anychar-dispatch)) + ((#\B) ; Binary + (format:out-num-padded modifier (next-arg) params 2) + (anychar-dispatch)) + ((#\R) + (if (null? params) + (format:out-obj-padded ; Roman, cardinal, ordinal numerals + #f + ((case modifier + ((at) format:num->roman) + ((colon-at) format:num->old-roman) + ((colon) format:num->ordinal) + (else format:num->cardinal)) + (next-arg)) + #f params) + (format:out-num-padded ; any Radix + modifier (next-arg) (cdr params) (car params))) + (anychar-dispatch)) + ((#\F) ; Fixed-format floating-point + (if format:floats + (format:out-fixed modifier (next-arg) params) + (format:out-str (number->string (next-arg)))) + (anychar-dispatch)) + ((#\E) ; Exponential floating-point + (if format:floats + (format:out-expon modifier (next-arg) params) + (format:out-str (number->string (next-arg)))) + (anychar-dispatch)) + ((#\G) ; General floating-point + (if format:floats + (format:out-general modifier (next-arg) params) + (format:out-str (number->string (next-arg)))) + (anychar-dispatch)) + ((#\$) ; Dollars floating-point + (if format:floats + (format:out-dollar modifier (next-arg) params) + (format:out-str (number->string (next-arg)))) + (anychar-dispatch)) + ((#\I) ; Complex numbers + (if (not format:complex-numbers) + (format:error + "complex numbers not supported by this scheme system")) + (let ((z (next-arg))) + (if (not (complex? z)) + (format:error "argument not a complex number")) + (format:out-fixed modifier (real-part z) params) + (format:out-fixed 'at (imag-part z) params) + (format:out-char #\i)) + (anychar-dispatch)) + ((#\C) ; Character + (let ((ch (if (one-positive-integer? params) + (integer->char (car params)) + (next-arg)))) + (if (not (char? ch)) (format:error "~~c expects a character")) + (case modifier + ((at) + (format:out-str (format:char->str ch))) + ((colon) + (let ((c (char->integer ch))) + (if (< c 0) + (set! c (+ c 256))) ; compensate complement impl. + (cond + ((< c #x20) ; assumes that control chars are < #x20 + (format:out-char #\^) + (format:out-char + (integer->char (+ c #x40)))) + ((>= c #x7f) + (format:out-str "#\\") + (format:out-str + (if format:radix-pref + (let ((s (number->string c 8))) + (substring s 2 (string-length s))) + (number->string c 8)))) + (else + (format:out-char ch))))) + (else (format:out-char ch)))) + (anychar-dispatch)) + ((#\P) ; Plural + (if (memq modifier '(colon colon-at)) + (prev-arg)) + (let ((arg (next-arg))) + (if (not (number? arg)) + (format:error "~~p expects a number argument")) + (if (= arg 1) + (if (memq modifier '(at colon-at)) + (format:out-char #\y)) + (if (memq modifier '(at colon-at)) + (format:out-str "ies") + (format:out-char #\s)))) + (anychar-dispatch)) + ((#\~) ; Tilde + (if (one-positive-integer? params) + (format:out-fill (car params) #\~) + (format:out-char #\~)) + (anychar-dispatch)) + ((#\%) ; Newline + (if (one-positive-integer? params) + (format:out-fill (car params) #\newline) + (format:out-char #\newline)) + (set! format:output-col 0) + (anychar-dispatch)) + ((#\&) ; Fresh line + (if (one-positive-integer? params) + (begin + (if (> (car params) 0) + (format:out-fill (- (car params) + (if (> format:output-col 0) 0 1)) + #\newline)) + (set! format:output-col 0)) + (if (> format:output-col 0) + (format:out-char #\newline))) + (anychar-dispatch)) + ((#\_) ; Space character + (if (one-positive-integer? params) + (format:out-fill (car params) #\space) + (format:out-char #\space)) + (anychar-dispatch)) + ((#\/) ; Tabulator character + (if (one-positive-integer? params) + (format:out-fill (car params) slib:tab) + (format:out-char slib:tab)) + (anychar-dispatch)) + ((#\|) ; Page seperator + (if (one-positive-integer? params) + (format:out-fill (car params) slib:form-feed) + (format:out-char slib:form-feed)) + (set! format:output-col 0) + (anychar-dispatch)) + ((#\T) ; Tabulate + (format:tabulate modifier params) + (anychar-dispatch)) + ((#\Y) ; Pretty-print + (require 'pretty-print) + (pretty-print (next-arg) format:port) + (set! format:output-col 0) + (anychar-dispatch)) + ((#\? #\K) ; Indirection (is "~K" in T-Scheme) + (cond + ((memq modifier '(colon colon-at)) + (format:error "illegal modifier in ~~?")) + ((eq? modifier 'at) + (let* ((frmt (next-arg)) + (args (rest-args))) + (add-arg-pos (format:format-work frmt args)))) + (else + (let* ((frmt (next-arg)) + (args (next-arg))) + (format:format-work frmt args)))) + (anychar-dispatch)) + ((#\!) ; Flush output + (set! format:flush-output #t) + (anychar-dispatch)) + ((#\newline) ; Continuation lines + (if (eq? modifier 'at) + (format:out-char #\newline)) + (if (< format:pos format-string-len) + (do ((ch (peek-next-char) (peek-next-char))) + ((or (not (char-whitespace? ch)) + (= format:pos (- format-string-len 1)))) + (if (eq? modifier 'colon) + (format:out-char (next-char)) + (next-char)))) + (anychar-dispatch)) + ((#\*) ; Argument jumping + (case modifier + ((colon) ; jump backwards + (if (one-positive-integer? params) + (do ((i 0 (+ i 1))) + ((= i (car params))) + (prev-arg)) + (prev-arg))) + ((at) ; jump absolute + (set! arg-pos (if (one-positive-integer? params) + (car params) 0))) + ((colon-at) + (format:error "illegal modifier `:@' in ~~* directive")) + (else ; jump forward + (if (one-positive-integer? params) + (do ((i 0 (+ i 1))) + ((= i (car params))) + (next-arg)) + (next-arg)))) + (anychar-dispatch)) + ((#\() ; Case conversion begin + (set! format:case-conversion + (case modifier + ((at) format:string-capitalize-first) + ((colon) string-capitalize) + ((colon-at) string-upcase) + (else string-downcase))) + (anychar-dispatch)) + ((#\)) ; Case conversion end + (if (not format:case-conversion) + (format:error "missing ~~(")) + (set! format:case-conversion #f) + (anychar-dispatch)) + ((#\[) ; Conditional begin + (set! conditional-nest (+ conditional-nest 1)) + (cond + ((= conditional-nest 1) + (set! clause-pos format:pos) + (set! clause-default #f) + (set! clauses '()) + (set! conditional-type + (case modifier + ((at) 'if-then) + ((colon) 'if-else-then) + ((colon-at) (format:error "illegal modifier in ~~[")) + (else 'num-case))) + (set! conditional-arg + (if (one-positive-integer? params) + (car params) + (next-arg))))) + (anychar-dispatch)) + ((#\;) ; Conditional separator + (if (zero? conditional-nest) + (format:error "~~; not in ~~[~~] conditional")) + (if (not (null? params)) + (format:error "no parameter allowed in ~~;")) + (if (= conditional-nest 1) + (let ((clause-str + (cond + ((eq? modifier 'colon) + (set! clause-default #t) + (substring format-string clause-pos + (- format:pos 3))) + ((memq modifier '(at colon-at)) + (format:error "illegal modifier in ~~;")) + (else + (substring format-string clause-pos + (- format:pos 2)))))) + (set! clauses (append clauses (list clause-str))) + (set! clause-pos format:pos))) + (anychar-dispatch)) + ((#\]) ; Conditional end + (if (zero? conditional-nest) (format:error "missing ~~[")) + (set! conditional-nest (- conditional-nest 1)) + (if modifier + (format:error "no modifier allowed in ~~]")) + (if (not (null? params)) + (format:error "no parameter allowed in ~~]")) + (cond + ((zero? conditional-nest) + (let ((clause-str (substring format-string clause-pos + (- format:pos 2)))) + (if clause-default + (set! clause-default clause-str) + (set! clauses (append clauses (list clause-str))))) + (case conditional-type + ((if-then) + (if conditional-arg + (format:format-work (car clauses) + (list conditional-arg)))) + ((if-else-then) + (add-arg-pos + (format:format-work (if conditional-arg + (cadr clauses) + (car clauses)) + (rest-args)))) + ((num-case) + (if (or (not (integer? conditional-arg)) + (< conditional-arg 0)) + (format:error "argument not a positive integer")) + (if (not (and (>= conditional-arg (length clauses)) + (not clause-default))) + (add-arg-pos + (format:format-work + (if (>= conditional-arg (length clauses)) + clause-default + (list-ref clauses conditional-arg)) + (rest-args)))))))) + (anychar-dispatch)) + ((#\{) ; Iteration begin + (set! iteration-nest (+ iteration-nest 1)) + (cond + ((= iteration-nest 1) + (set! iteration-pos format:pos) + (set! iteration-type + (case modifier + ((at) 'rest-args) + ((colon) 'sublists) + ((colon-at) 'rest-sublists) + (else 'list))) + (set! max-iterations (if (one-positive-integer? params) + (car params) #f)))) + (anychar-dispatch)) + ((#\}) ; Iteration end + (if (zero? iteration-nest) (format:error "missing ~~{")) + (set! iteration-nest (- iteration-nest 1)) + (case modifier + ((colon) + (if (not max-iterations) (set! max-iterations 1))) + ((colon-at at) (format:error "illegal modifier")) + (else (if (not max-iterations) + (set! max-iterations format:max-iterations)))) + (if (not (null? params)) + (format:error "no parameters allowed in ~~}")) + (if (zero? iteration-nest) + (let ((iteration-str + (substring format-string iteration-pos + (- format:pos (if modifier 3 2))))) + (if (string=? iteration-str "") + (set! iteration-str (next-arg))) + (case iteration-type + ((list) + (let ((args (next-arg)) + (args-len 0)) + (if (not (list? args)) + (format:error "expected a list argument")) + (set! args-len (length args)) + (do ((arg-pos 0 (+ arg-pos + (format:format-work + iteration-str + (list-tail args arg-pos)))) + (i 0 (+ i 1))) + ((or (>= arg-pos args-len) + (and format:iteration-bounded + (>= i max-iterations))))))) + ((sublists) + (let ((args (next-arg)) + (args-len 0)) + (if (not (list? args)) + (format:error "expected a list argument")) + (set! args-len (length args)) + (do ((arg-pos 0 (+ arg-pos 1))) + ((or (>= arg-pos args-len) + (and format:iteration-bounded + (>= arg-pos max-iterations)))) + (let ((sublist (list-ref args arg-pos))) + (if (not (list? sublist)) + (format:error + "expected a list of lists argument")) + (format:format-work iteration-str sublist))))) + ((rest-args) + (let* ((args (rest-args)) + (args-len (length args)) + (usedup-args + (do ((arg-pos 0 (+ arg-pos + (format:format-work + iteration-str + (list-tail + args arg-pos)))) + (i 0 (+ i 1))) + ((or (>= arg-pos args-len) + (and format:iteration-bounded + (>= i max-iterations))) + arg-pos)))) + (add-arg-pos usedup-args))) + ((rest-sublists) + (let* ((args (rest-args)) + (args-len (length args)) + (usedup-args + (do ((arg-pos 0 (+ arg-pos 1))) + ((or (>= arg-pos args-len) + (and format:iteration-bounded + (>= arg-pos max-iterations))) + arg-pos) + (let ((sublist (list-ref args arg-pos))) + (if (not (list? sublist)) + (format:error "expected list arguments")) + (format:format-work iteration-str sublist))))) + (add-arg-pos usedup-args))) + (else (format:error "internal error in ~~}"))))) + (anychar-dispatch)) + ((#\^) ; Up and out + (let* ((continue + (cond + ((not (null? params)) + (not + (case (length params) + ((1) (zero? (car params))) + ((2) (= (list-ref params 0) (list-ref params 1))) + ((3) (<= (list-ref params 0) + (list-ref params 1) + (list-ref params 2))) + (else (format:error "too much parameters"))))) + (format:case-conversion ; if conversion stop conversion + (set! format:case-conversion string-copy) #t) + ((= iteration-nest 1) #t) + ((= conditional-nest 1) #t) + ((>= arg-pos arg-len) + (set! format:pos format-string-len) #f) + (else #t)))) + (if continue + (anychar-dispatch)))) + + ;; format directive modifiers and parameters + + ((#\@) ; `@' modifier + (if (memq modifier '(at colon-at)) + (format:error "double `@' modifier")) + (set! modifier (if (eq? modifier 'colon) 'colon-at 'at)) + (tilde-dispatch)) + ((#\:) ; `:' modifier + (if (memq modifier '(colon colon-at)) + (format:error "double `:' modifier")) + (set! modifier (if (eq? modifier 'at) 'colon-at 'colon)) + (tilde-dispatch)) + ((#\') ; Character parameter + (if modifier (format:error "misplaced modifier")) + (set! params (append params (list (char->integer (next-char))))) + (set! param-value-found #t) + (tilde-dispatch)) + ((#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\- #\+) ; num. paramtr + (if modifier (format:error "misplaced modifier")) + (let ((num-str-beg (- format:pos 1)) + (num-str-end format:pos)) + (do ((ch (peek-next-char) (peek-next-char))) + ((not (char-numeric? ch))) + (next-char) + (set! num-str-end (+ 1 num-str-end))) + (set! params + (append params + (list (string->number + (substring format-string + num-str-beg + num-str-end)))))) + (set! param-value-found #t) + (tilde-dispatch)) + ((#\V) ; Variable parameter from next argum. + (if modifier (format:error "misplaced modifier")) + (set! params (append params (list (next-arg)))) + (set! param-value-found #t) + (tilde-dispatch)) + ((#\#) ; Parameter is number of remaining args + (if modifier (format:error "misplaced modifier")) + (set! params (append params (list (length (rest-args))))) + (set! param-value-found #t) + (tilde-dispatch)) + ((#\,) ; Parameter separators + (if modifier (format:error "misplaced modifier")) + (if (not param-value-found) + (set! params (append params '(#f)))) ; append empty paramtr + (set! param-value-found #f) + (tilde-dispatch)) + ((#\Q) ; Inquiry messages + (if (eq? modifier 'colon) + (format:out-str format:version) + (let ((nl (string #\newline))) + (format:out-str + (string-append + "SLIB Common LISP format version " format:version nl + " (C) copyright 1992-1994 by Dirk Lutzebaeck" nl + " please send bug reports to `lutzeb@cs.tu-berlin.de'" + nl)))) + (anychar-dispatch)) + (else ; Unknown tilde directive + (format:error "unknown control character `~c'" + (string-ref format-string (- format:pos 1)))))) + (else (anychar-dispatch)))))) ; in case of conditional + + (set! format:pos 0) + (set! format:arg-pos 0) + (anychar-dispatch) ; start the formatting + (set! format:pos recursive-pos-save) + arg-pos)) ; return the position in the arg. list + +;; format:obj->str returns a R4RS representation as a string of an arbitrary +;; scheme object. +;; First parameter is the object, second parameter is a boolean if the +;; representation should be slashified as `write' does. +;; It uses format:char->str which converts a character into +;; a slashified string as `write' does and which is implementation dependent. +;; It uses format:iobj->str to print out internal objects as +;; quoted strings so that the output can always be processed by (read) + +(define (format:obj->str obj slashify) + (cond + ((string? obj) + (if slashify + (let ((obj-len (string-length obj))) + (string-append + "\"" + (let loop ((i 0) (j 0)) ; taken from Marc Feeley's pp.scm + (if (= j obj-len) + (string-append (substring obj i j) "\"") + (let ((c (string-ref obj j))) + (if (or (char=? c #\\) + (char=? c #\")) + (string-append (substring obj i j) "\\" + (loop j (+ j 1))) + (loop i (+ j 1)))))))) + obj)) + + ((boolean? obj) (if obj "#t" "#f")) + + ((number? obj) (number->string obj)) + + ((symbol? obj) + (if format:symbol-case-conv + (format:symbol-case-conv (symbol->string obj)) + (symbol->string obj))) + + ((char? obj) + (if slashify + (format:char->str obj) + (string obj))) + + ((null? obj) "()") + + ((input-port? obj) + (format:iobj->str obj)) + + ((output-port? obj) + (format:iobj->str obj)) + + ((list? obj) + (string-append "(" + (let loop ((obj-list obj)) + (if (null? (cdr obj-list)) + (format:obj->str (car obj-list) #t) + (string-append + (format:obj->str (car obj-list) #t) + " " + (loop (cdr obj-list))))) + ")")) + + ((pair? obj) + (string-append "(" + (format:obj->str (car obj) #t) + " . " + (format:obj->str (cdr obj) #t) + ")")) + + ((vector? obj) + (string-append "#" (format:obj->str (vector->list obj) #t))) + + (else ; only objects with an #<...> + (format:iobj->str obj)))) ; representation should fall in here + +;; format:iobj->str reveals the implementation dependent representation of +;; #<...> objects with the use of display and call-with-output-string. +;; If format:read-proof is set to #t the resulting string is additionally +;; set into string quotes. + +(define format:read-proof #f) + +(define (format:iobj->str iobj) + (if (or format:read-proof + format:iobj-case-conv) + (string-append + (if format:read-proof "\"" "") + (if format:iobj-case-conv + (format:iobj-case-conv + (call-with-output-string (lambda (p) (display iobj p)))) + (call-with-output-string (lambda (p) (display iobj p)))) + (if format:read-proof "\"" "")) + (call-with-output-string (lambda (p) (display iobj p))))) + + +;; format:char->str converts a character into a slashified string as +;; done by `write'. The procedure is dependent on the integer +;; representation of characters and assumes a character number according to +;; the ASCII character set. + +(define (format:char->str ch) + (let ((int-rep (char->integer ch))) + (if (< int-rep 0) ; if chars are [-128...+127] + (set! int-rep (+ int-rep 256))) + (string-append + "#\\" + (cond + ((char=? ch #\newline) "newline") + ((and (>= int-rep 0) (<= int-rep 32)) + (vector-ref format:ascii-non-printable-charnames int-rep)) + ((= int-rep 127) "del") + ((>= int-rep 128) ; octal representation + (if format:radix-pref + (let ((s (number->string int-rep 8))) + (substring s 2 (string-length s))) + (number->string int-rep 8))) + (else (string ch)))))) + +(define format:space-ch (char->integer #\space)) +(define format:zero-ch (char->integer #\0)) + +(define (format:par pars length index default name) + (if (> length index) + (let ((par (list-ref pars index))) + (if par + (if name + (if (< par 0) + (format:error + "~s parameter must be a positive integer" name) + par) + par) + default)) + default)) + +(define (format:out-obj-padded pad-left obj slashify pars) + (if (null? pars) + (format:out-str (format:obj->str obj slashify)) + (let ((l (length pars))) + (let ((mincol (format:par pars l 0 0 "mincol")) + (colinc (format:par pars l 1 1 "colinc")) + (minpad (format:par pars l 2 0 "minpad")) + (padchar (integer->char + (format:par pars l 3 format:space-ch #f))) + (objstr (format:obj->str obj slashify))) + (if (not pad-left) + (format:out-str objstr)) + (do ((objstr-len (string-length objstr)) + (i minpad (+ i colinc))) + ((>= (+ objstr-len i) mincol) + (format:out-fill i padchar))) + (if pad-left + (format:out-str objstr)))))) + +(define (format:out-num-padded modifier number pars radix) + (if (not (integer? number)) (format:error "argument not an integer")) + (let ((numstr (number->string number radix))) + (if (and format:radix-pref (not (= radix 10))) + (set! numstr (substring numstr 2 (string-length numstr)))) + (if (and (null? pars) (not modifier)) + (format:out-str numstr) + (let ((l (length pars)) + (numstr-len (string-length numstr))) + (let ((mincol (format:par pars l 0 #f "mincol")) + (padchar (integer->char + (format:par pars l 1 format:space-ch #f))) + (commachar (integer->char + (format:par pars l 2 (char->integer #\,) #f))) + (commawidth (format:par pars l 3 3 "commawidth"))) + (if mincol + (let ((numlen numstr-len)) ; calc. the output len of number + (if (and (memq modifier '(at colon-at)) (> number 0)) + (set! numlen (+ numlen 1))) + (if (memq modifier '(colon colon-at)) + (set! numlen (+ (quotient (- numstr-len + (if (< number 0) 2 1)) + commawidth) + numlen))) + (if (> mincol numlen) + (format:out-fill (- mincol numlen) padchar)))) + (if (and (memq modifier '(at colon-at)) + (> number 0)) + (format:out-char #\+)) + (if (memq modifier '(colon colon-at)) ; insert comma character + (let ((start (remainder numstr-len commawidth)) + (ns (if (< number 0) 1 0))) + (format:out-substr numstr 0 start) + (do ((i start (+ i commawidth))) + ((>= i numstr-len)) + (if (> i ns) + (format:out-char commachar)) + (format:out-substr numstr i (+ i commawidth)))) + (format:out-str numstr))))))) + +(define (format:tabulate modifier pars) + (let ((l (length pars))) + (let ((colnum (format:par pars l 0 1 "colnum")) + (colinc (format:par pars l 1 1 "colinc")) + (padch (integer->char (format:par pars l 2 format:space-ch #f)))) + (case modifier + ((colon colon-at) + (format:error "unsupported modifier for ~~t")) + ((at) ; relative tabulation + (format:out-fill + (if (= colinc 0) + colnum ; colnum = colrel + (do ((c 0 (+ c colinc)) + (col (+ format:output-col colnum))) + ((>= c col) + (- c format:output-col)))) + padch)) + (else ; absolute tabulation + (format:out-fill + (cond + ((< format:output-col colnum) + (- colnum format:output-col)) + ((= colinc 0) + 0) + (else + (do ((c colnum (+ c colinc))) + ((>= c format:output-col) + (- c format:output-col))))) + padch)))))) + + +;; roman numerals (from dorai@cs.rice.edu). + +(define format:roman-alist + '((1000 #\M) (500 #\D) (100 #\C) (50 #\L) + (10 #\X) (5 #\V) (1 #\I))) + +(define format:roman-boundary-values + '(100 100 10 10 1 1 #f)) + +(define format:num->old-roman + (lambda (n) + (if (and (integer? n) (>= n 1)) + (let loop ((n n) + (romans format:roman-alist) + (s '())) + (if (null? romans) (list->string (reverse s)) + (let ((roman-val (caar romans)) + (roman-dgt (cadar romans))) + (do ((q (quotient n roman-val) (- q 1)) + (s s (cons roman-dgt s))) + ((= q 0) + (loop (remainder n roman-val) + (cdr romans) s)))))) + (format:error "only positive integers can be romanized")))) + +(define format:num->roman + (lambda (n) + (if (and (integer? n) (> n 0)) + (let loop ((n n) + (romans format:roman-alist) + (boundaries format:roman-boundary-values) + (s '())) + (if (null? romans) + (list->string (reverse s)) + (let ((roman-val (caar romans)) + (roman-dgt (cadar romans)) + (bdry (car boundaries))) + (let loop2 ((q (quotient n roman-val)) + (r (remainder n roman-val)) + (s s)) + (if (= q 0) + (if (and bdry (>= r (- roman-val bdry))) + (loop (remainder r bdry) (cdr romans) + (cdr boundaries) + (cons roman-dgt + (append + (cdr (assv bdry romans)) + s))) + (loop r (cdr romans) (cdr boundaries) s)) + (loop2 (- q 1) r (cons roman-dgt s))))))) + (format:error "only positive integers can be romanized")))) + +;; cardinals & ordinals (from dorai@cs.rice.edu) + +(define format:cardinal-ones-list + '(#f "one" "two" "three" "four" "five" + "six" "seven" "eight" "nine" "ten" "eleven" "twelve" "thirteen" + "fourteen" "fifteen" "sixteen" "seventeen" "eighteen" + "nineteen")) + +(define format:cardinal-tens-list + '(#f #f "twenty" "thirty" "forty" "fifty" "sixty" "seventy" "eighty" + "ninety")) + +(define format:num->cardinal999 + (lambda (n) + ;this procedure is inspired by the Bruno Haible's CLisp + ;function format-small-cardinal, which converts numbers + ;in the range 1 to 999, and is used for converting each + ;thousand-block in a larger number + (let* ((hundreds (quotient n 100)) + (tens+ones (remainder n 100)) + (tens (quotient tens+ones 10)) + (ones (remainder tens+ones 10))) + (append + (if (> hundreds 0) + (append + (string->list + (list-ref format:cardinal-ones-list hundreds)) + (string->list" hundred") + (if (> tens+ones 0) '(#\space) '())) + '()) + (if (< tens+ones 20) + (if (> tens+ones 0) + (string->list + (list-ref format:cardinal-ones-list tens+ones)) + '()) + (append + (string->list + (list-ref format:cardinal-tens-list tens)) + (if (> ones 0) + (cons #\- + (string->list + (list-ref format:cardinal-ones-list ones))) + '()))))))) + +(define format:cardinal-thousand-block-list + '("" " thousand" " million" " billion" " trillion" " quadrillion" + " quintillion" " sextillion" " septillion" " octillion" " nonillion" + " decillion" " undecillion" " duodecillion" " tredecillion" + " quattuordecillion" " quindecillion" " sexdecillion" " septendecillion" + " octodecillion" " novemdecillion" " vigintillion")) + +(define format:num->cardinal + (lambda (n) + (cond ((not (integer? n)) + (format:error + "only integers can be converted to English cardinals")) + ((= n 0) "zero") + ((< n 0) (string-append "minus " (format:num->cardinal (- n)))) + (else + (let ((power3-word-limit + (length format:cardinal-thousand-block-list))) + (let loop ((n n) + (power3 0) + (s '())) + (if (= n 0) + (list->string s) + (let ((n-before-block (quotient n 1000)) + (n-after-block (remainder n 1000))) + (loop n-before-block + (+ power3 1) + (if (> n-after-block 0) + (append + (if (> n-before-block 0) + (string->list ", ") '()) + (format:num->cardinal999 n-after-block) + (if (< power3 power3-word-limit) + (string->list + (list-ref + format:cardinal-thousand-block-list + power3)) + (append + (string->list " times ten to the ") + (string->list + (format:num->ordinal + (* power3 3))) + (string->list " power"))) + s) + s)))))))))) + +(define format:ordinal-ones-list + '(#f "first" "second" "third" "fourth" "fifth" + "sixth" "seventh" "eighth" "ninth" "tenth" "eleventh" "twelfth" + "thirteenth" "fourteenth" "fifteenth" "sixteenth" "seventeenth" + "eighteenth" "nineteenth")) + +(define format:ordinal-tens-list + '(#f #f "twentieth" "thirtieth" "fortieth" "fiftieth" "sixtieth" + "seventieth" "eightieth" "ninetieth")) + +(define format:num->ordinal + (lambda (n) + (cond ((not (integer? n)) + (format:error + "only integers can be converted to English ordinals")) + ((= n 0) "zeroth") + ((< n 0) (string-append "minus " (format:num->ordinal (- n)))) + (else + (let ((hundreds (quotient n 100)) + (tens+ones (remainder n 100))) + (string-append + (if (> hundreds 0) + (string-append + (format:num->cardinal (* hundreds 100)) + (if (= tens+ones 0) "th" " ")) + "") + (if (= tens+ones 0) "" + (if (< tens+ones 20) + (list-ref format:ordinal-ones-list tens+ones) + (let ((tens (quotient tens+ones 10)) + (ones (remainder tens+ones 10))) + (if (= ones 0) + (list-ref format:ordinal-tens-list tens) + (string-append + (list-ref format:cardinal-tens-list tens) + "-" + (list-ref format:ordinal-ones-list ones)))) + )))))))) + +;; format fixed flonums (~F) + +(define (format:out-fixed modifier number pars) + (if (not (or (number? number) (string? number))) + (format:error "argument is not a number or a number string")) + + (let ((l (length pars))) + (let ((width (format:par pars l 0 #f "width")) + (digits (format:par pars l 1 #f "digits")) + (scale (format:par pars l 2 0 #f)) + (overch (format:par pars l 3 #f #f)) + (padch (format:par pars l 4 format:space-ch #f))) + + (if digits + + (begin ; fixed precision + (format:parse-float + (if (string? number) number (number->string number)) #t scale) + (if (<= (- format:fn-len format:fn-dot) digits) + (format:fn-zfill #f (- digits (- format:fn-len format:fn-dot))) + (format:fn-round digits)) + (if width + (let ((numlen (+ format:fn-len 1))) + (if (or (not format:fn-pos?) (eq? modifier 'at)) + (set! numlen (+ numlen 1))) + (if (and (= format:fn-dot 0) (> width (+ digits 1))) + (set! numlen (+ numlen 1))) + (if (< numlen width) + (format:out-fill (- width numlen) (integer->char padch))) + (if (and overch (> numlen width)) + (format:out-fill width (integer->char overch)) + (format:fn-out modifier (> width (+ digits 1))))) + (format:fn-out modifier #t))) + + (begin ; free precision + (format:parse-float + (if (string? number) number (number->string number)) #t scale) + (format:fn-strip) + (if width + (let ((numlen (+ format:fn-len 1))) + (if (or (not format:fn-pos?) (eq? modifier 'at)) + (set! numlen (+ numlen 1))) + (if (= format:fn-dot 0) + (set! numlen (+ numlen 1))) + (if (< numlen width) + (format:out-fill (- width numlen) (integer->char padch))) + (if (> numlen width) ; adjust precision if possible + (let ((dot-index (- numlen + (- format:fn-len format:fn-dot)))) + (if (> dot-index width) + (if overch ; numstr too big for required width + (format:out-fill width (integer->char overch)) + (format:fn-out modifier #t)) + (begin + (format:fn-round (- width dot-index)) + (format:fn-out modifier #t)))) + (format:fn-out modifier #t))) + (format:fn-out modifier #t))))))) + +;; format exponential flonums (~E) + +(define (format:out-expon modifier number pars) + (if (not (or (number? number) (string? number))) + (format:error "argument is not a number")) + + (let ((l (length pars))) + (let ((width (format:par pars l 0 #f "width")) + (digits (format:par pars l 1 #f "digits")) + (edigits (format:par pars l 2 #f "exponent digits")) + (scale (format:par pars l 3 1 #f)) + (overch (format:par pars l 4 #f #f)) + (padch (format:par pars l 5 format:space-ch #f)) + (expch (format:par pars l 6 #f #f))) + + (if digits ; fixed precision + + (let ((digits (if (> scale 0) + (if (< scale (+ digits 2)) + (+ (- digits scale) 1) + 0) + digits))) + (format:parse-float + (if (string? number) number (number->string number)) #f scale) + (if (<= (- format:fn-len format:fn-dot) digits) + (format:fn-zfill #f (- digits (- format:fn-len format:fn-dot))) + (format:fn-round digits)) + (if width + (if (and edigits overch (> format:en-len edigits)) + (format:out-fill width (integer->char overch)) + (let ((numlen (+ format:fn-len 3))) ; .E+ + (if (or (not format:fn-pos?) (eq? modifier 'at)) + (set! numlen (+ numlen 1))) + (if (and (= format:fn-dot 0) (> width (+ digits 1))) + (set! numlen (+ numlen 1))) + (set! numlen + (+ numlen + (if (and edigits (>= edigits format:en-len)) + edigits + format:en-len))) + (if (< numlen width) + (format:out-fill (- width numlen) + (integer->char padch))) + (if (and overch (> numlen width)) + (format:out-fill width (integer->char overch)) + (begin + (format:fn-out modifier (> width (- numlen 1))) + (format:en-out edigits expch))))) + (begin + (format:fn-out modifier #t) + (format:en-out edigits expch)))) + + (begin ; free precision + (format:parse-float + (if (string? number) number (number->string number)) #f scale) + (format:fn-strip) + (if width + (if (and edigits overch (> format:en-len edigits)) + (format:out-fill width (integer->char overch)) + (let ((numlen (+ format:fn-len 3))) ; .E+ + (if (or (not format:fn-pos?) (eq? modifier 'at)) + (set! numlen (+ numlen 1))) + (if (= format:fn-dot 0) + (set! numlen (+ numlen 1))) + (set! numlen + (+ numlen + (if (and edigits (>= edigits format:en-len)) + edigits + format:en-len))) + (if (< numlen width) + (format:out-fill (- width numlen) + (integer->char padch))) + (if (> numlen width) ; adjust precision if possible + (let ((f (- format:fn-len format:fn-dot))) ; fract len + (if (> (- numlen f) width) + (if overch ; numstr too big for required width + (format:out-fill width + (integer->char overch)) + (begin + (format:fn-out modifier #t) + (format:en-out edigits expch))) + (begin + (format:fn-round (+ (- f numlen) width)) + (format:fn-out modifier #t) + (format:en-out edigits expch)))) + (begin + (format:fn-out modifier #t) + (format:en-out edigits expch))))) + (begin + (format:fn-out modifier #t) + (format:en-out edigits expch)))))))) + +;; format general flonums (~G) + +(define (format:out-general modifier number pars) + (if (not (or (number? number) (string? number))) + (format:error "argument is not a number or a number string")) + + (let ((l (length pars))) + (let ((width (if (> l 0) (list-ref pars 0) #f)) + (digits (if (> l 1) (list-ref pars 1) #f)) + (edigits (if (> l 2) (list-ref pars 2) #f)) + (overch (if (> l 4) (list-ref pars 4) #f)) + (padch (if (> l 5) (list-ref pars 5) #f))) + (format:parse-float + (if (string? number) number (number->string number)) #t 0) + (format:fn-strip) + (let* ((ee (if edigits (+ edigits 2) 4)) ; for the following algorithm + (ww (if width (- width ee) #f)) ; see Steele's CL book p.395 + (n (if (= format:fn-dot 0) ; number less than (abs 1.0) ? + (- (format:fn-zlead)) + format:fn-dot)) + (d (if digits + digits + (max format:fn-len (min n 7)))) ; q = format:fn-len + (dd (- d n))) + (if (<= 0 dd d) + (begin + (format:out-fixed modifier number (list ww dd #f overch padch)) + (format:out-fill ee #\space)) ;~@T not implemented yet + (format:out-expon modifier number pars)))))) + +;; format dollar flonums (~$) + +(define (format:out-dollar modifier number pars) + (if (not (or (number? number) (string? number))) + (format:error "argument is not a number or a number string")) + + (let ((l (length pars))) + (let ((digits (format:par pars l 0 2 "digits")) + (mindig (format:par pars l 1 1 "mindig")) + (width (format:par pars l 2 0 "width")) + (padch (format:par pars l 3 format:space-ch #f))) + + (format:parse-float + (if (string? number) number (number->string number)) #t 0) + (if (<= (- format:fn-len format:fn-dot) digits) + (format:fn-zfill #f (- digits (- format:fn-len format:fn-dot))) + (format:fn-round digits)) + (let ((numlen (+ format:fn-len 1))) + (if (or (not format:fn-pos?) (memq modifier '(at colon-at))) + (set! numlen (+ numlen 1))) + (if (and mindig (> mindig format:fn-dot)) + (set! numlen (+ numlen (- mindig format:fn-dot)))) + (if (and (= format:fn-dot 0) (not mindig)) + (set! numlen (+ numlen 1))) + (if (< numlen width) + (case modifier + ((colon) + (if (not format:fn-pos?) + (format:out-char #\-)) + (format:out-fill (- width numlen) (integer->char padch))) + ((at) + (format:out-fill (- width numlen) (integer->char padch)) + (format:out-char (if format:fn-pos? #\+ #\-))) + ((colon-at) + (format:out-char (if format:fn-pos? #\+ #\-)) + (format:out-fill (- width numlen) (integer->char padch))) + (else + (format:out-fill (- width numlen) (integer->char padch)) + (if (not format:fn-pos?) + (format:out-char #\-)))) + (if format:fn-pos? + (if (memq modifier '(at colon-at)) (format:out-char #\+)) + (format:out-char #\-)))) + (if (and mindig (> mindig format:fn-dot)) + (format:out-fill (- mindig format:fn-dot) #\0)) + (if (and (= format:fn-dot 0) (not mindig)) + (format:out-char #\0)) + (format:out-substr format:fn-str 0 format:fn-dot) + (format:out-char #\.) + (format:out-substr format:fn-str format:fn-dot format:fn-len)))) + +; the flonum buffers + +(define format:fn-max 200) ; max. number of number digits +(define format:fn-str (make-string format:fn-max)) ; number buffer +(define format:fn-len 0) ; digit length of number +(define format:fn-dot #f) ; dot position of number +(define format:fn-pos? #t) ; number positive? +(define format:en-max 10) ; max. number of exponent digits +(define format:en-str (make-string format:en-max)) ; exponent buffer +(define format:en-len 0) ; digit length of exponent +(define format:en-pos? #t) ; exponent positive? + +(define (format:parse-float num-str fixed? scale) + (set! format:fn-pos? #t) + (set! format:fn-len 0) + (set! format:fn-dot #f) + (set! format:en-pos? #t) + (set! format:en-len 0) + (do ((i 0 (+ i 1)) + (left-zeros 0) + (mantissa? #t) + (all-zeros? #t) + (num-len (string-length num-str)) + (c #f)) ; current exam. character in num-str + ((= i num-len) + (if (not format:fn-dot) + (set! format:fn-dot format:fn-len)) + + (if all-zeros? + (begin + (set! left-zeros 0) + (set! format:fn-dot 0) + (set! format:fn-len 1))) + + ;; now format the parsed values according to format's need + + (if fixed? + + (begin ; fixed format m.nnn or .nnn + (if (and (> left-zeros 0) (> format:fn-dot 0)) + (if (> format:fn-dot left-zeros) + (begin ; norm 0{0}nn.mm to nn.mm + (format:fn-shiftleft left-zeros) + (set! left-zeros 0) + (set! format:fn-dot (- format:fn-dot left-zeros))) + (begin ; normalize 0{0}.nnn to .nnn + (format:fn-shiftleft format:fn-dot) + (set! left-zeros (- left-zeros format:fn-dot)) + (set! format:fn-dot 0)))) + (if (or (not (= scale 0)) (> format:en-len 0)) + (let ((shift (+ scale (format:en-int)))) + (cond + (all-zeros? #t) + ((> (+ format:fn-dot shift) format:fn-len) + (format:fn-zfill + #f (- shift (- format:fn-len format:fn-dot))) + (set! format:fn-dot format:fn-len)) + ((< (+ format:fn-dot shift) 0) + (format:fn-zfill #t (- (- shift) format:fn-dot)) + (set! format:fn-dot 0)) + (else + (if (> left-zeros 0) + (if (<= left-zeros shift) ; shift always > 0 here + (format:fn-shiftleft shift) ; shift out 0s + (begin + (format:fn-shiftleft left-zeros) + (set! format:fn-dot (- shift left-zeros)))) + (set! format:fn-dot (+ format:fn-dot shift)))))))) + + (let ((negexp ; expon format m.nnnEee + (if (> left-zeros 0) + (- left-zeros format:fn-dot -1) + (if (= format:fn-dot 0) 1 0)))) + (if (> left-zeros 0) + (begin ; normalize 0{0}.nnn to n.nn + (format:fn-shiftleft left-zeros) + (set! format:fn-dot 1)) + (if (= format:fn-dot 0) + (set! format:fn-dot 1))) + (format:en-set (- (+ (- format:fn-dot scale) (format:en-int)) + negexp)) + (cond + (all-zeros? + (format:en-set 0) + (set! format:fn-dot 1)) + ((< scale 0) ; leading zero + (format:fn-zfill #t (- scale)) + (set! format:fn-dot 0)) + ((> scale format:fn-dot) + (format:fn-zfill #f (- scale format:fn-dot)) + (set! format:fn-dot scale)) + (else + (set! format:fn-dot scale))))) + #t) + + ;; do body + (set! c (string-ref num-str i)) ; parse the output of number->string + (cond ; which can be any valid number + ((char-numeric? c) ; representation of R4RS except + (if mantissa? ; complex numbers + (begin + (if (char=? c #\0) + (if all-zeros? + (set! left-zeros (+ left-zeros 1))) + (begin + (set! all-zeros? #f))) + (string-set! format:fn-str format:fn-len c) + (set! format:fn-len (+ format:fn-len 1))) + (begin + (string-set! format:en-str format:en-len c) + (set! format:en-len (+ format:en-len 1))))) + ((or (char=? c #\-) (char=? c #\+)) + (if mantissa? + (set! format:fn-pos? (char=? c #\+)) + (set! format:en-pos? (char=? c #\+)))) + ((char=? c #\.) + (set! format:fn-dot format:fn-len)) + ((char=? c #\e) + (set! mantissa? #f)) + ((char=? c #\E) + (set! mantissa? #f)) + ((char-whitespace? c) #t) + ((char=? c #\d) #t) ; decimal radix prefix + ((char=? c #\#) #t) + (else + (format:error "illegal character `~c' in number->string" c))))) + +(define (format:en-int) ; convert exponent string to integer + (if (= format:en-len 0) + 0 + (do ((i 0 (+ i 1)) + (n 0)) + ((= i format:en-len) + (if format:en-pos? + n + (- n))) + (set! n (+ (* n 10) (- (char->integer (string-ref format:en-str i)) + format:zero-ch)))))) + +(define (format:en-set en) ; set exponent string number + (set! format:en-len 0) + (set! format:en-pos? (>= en 0)) + (let ((en-str (number->string en))) + (do ((i 0 (+ i 1)) + (en-len (string-length en-str)) + (c #f)) + ((= i en-len)) + (set! c (string-ref en-str i)) + (if (char-numeric? c) + (begin + (string-set! format:en-str format:en-len c) + (set! format:en-len (+ format:en-len 1))))))) + +(define (format:fn-zfill left? n) ; fill current number string with 0s + (if (> (+ n format:fn-len) format:fn-max) ; from the left or right + (format:error "number is too long to format (enlarge format:fn-max)")) + (set! format:fn-len (+ format:fn-len n)) + (if left? + (do ((i format:fn-len (- i 1))) ; fill n 0s to left + ((< i 0)) + (string-set! format:fn-str i + (if (< i n) + #\0 + (string-ref format:fn-str (- i n))))) + (do ((i (- format:fn-len n) (+ i 1))) ; fill n 0s to the right + ((= i format:fn-len)) + (string-set! format:fn-str i #\0)))) + +(define (format:fn-shiftleft n) ; shift left current number n positions + (if (> n format:fn-len) + (format:error "internal error in format:fn-shiftleft (~d,~d)" + n format:fn-len)) + (do ((i n (+ i 1))) + ((= i format:fn-len) + (set! format:fn-len (- format:fn-len n))) + (string-set! format:fn-str (- i n) (string-ref format:fn-str i)))) + +(define (format:fn-round digits) ; round format:fn-str + (set! digits (+ digits format:fn-dot)) + (do ((i digits (- i 1)) ; "099",2 -> "10" + (c 5)) ; "023",2 -> "02" + ((or (= c 0) (< i 0)) ; "999",2 -> "100" + (if (= c 1) ; "005",2 -> "01" + (begin ; carry overflow + (set! format:fn-len digits) + (format:fn-zfill #t 1) ; add a 1 before fn-str + (string-set! format:fn-str 0 #\1) + (set! format:fn-dot (+ format:fn-dot 1))) + (set! format:fn-len digits))) + (set! c (+ (- (char->integer (string-ref format:fn-str i)) + format:zero-ch) c)) + (string-set! format:fn-str i (integer->char + (if (< c 10) + (+ c format:zero-ch) + (+ (- c 10) format:zero-ch)))) + (set! c (if (< c 10) 0 1)))) + +(define (format:fn-out modifier add-leading-zero?) + (if format:fn-pos? + (if (eq? modifier 'at) + (format:out-char #\+)) + (format:out-char #\-)) + (if (= format:fn-dot 0) + (if add-leading-zero? + (format:out-char #\0)) + (format:out-substr format:fn-str 0 format:fn-dot)) + (format:out-char #\.) + (format:out-substr format:fn-str format:fn-dot format:fn-len)) + +(define (format:en-out edigits expch) + (format:out-char (if expch (integer->char expch) format:expch)) + (format:out-char (if format:en-pos? #\+ #\-)) + (if edigits + (if (< format:en-len edigits) + (format:out-fill (- edigits format:en-len) #\0))) + (format:out-substr format:en-str 0 format:en-len)) + +(define (format:fn-strip) ; strip trailing zeros but one + (string-set! format:fn-str format:fn-len #\0) + (do ((i format:fn-len (- i 1))) + ((or (not (char=? (string-ref format:fn-str i) #\0)) + (<= i format:fn-dot)) + (set! format:fn-len (+ i 1))))) + +(define (format:fn-zlead) ; count leading zeros + (do ((i 0 (+ i 1))) + ((or (= i format:fn-len) + (not (char=? (string-ref format:fn-str i) #\0))) + (if (= i format:fn-len) ; found a real zero + 0 + i)))) + + +;;; some global functions not found in SLIB + +(define (format:string-capitalize-first str) ; "hello" -> "Hello" + (let ((cap-str (string-copy str)) ; "hELLO" -> "Hello" + (non-first-alpha #f) ; "*hello" -> "*Hello" + (str-len (string-length str))) ; "hello you" -> "Hello you" + (do ((i 0 (+ i 1))) + ((= i str-len) cap-str) + (let ((c (string-ref str i))) + (if (char-alphabetic? c) + (if non-first-alpha + (string-set! cap-str i (char-downcase c)) + (begin + (set! non-first-alpha #t) + (string-set! cap-str i (char-upcase c))))))))) + +(define (format:list-head l k) + (if (= k 0) + '() + (cons (car l) (format:list-head (cdr l) (- k 1))))) + + +;; Aborts the program when a formatting error occures. This is a null +;; argument closure to jump to the interpreters toplevel continuation. + +(define format:abort (lambda () (slib:error "error in format"))) + +(define format format:format) + +;; If this is not possible then a continuation is used to recover +;; properly from a format error. In this case format returns #f. + +;(define format:abort +; (lambda () (format:error-continuation #f))) + +;(define format +; (lambda args ; wraps format:format with an error +; (call-with-current-continuation ; continuation +; (lambda (cont) +; (set! format:error-continuation cont) +; (apply format:format args))))) + +;eof diff --git a/formatst.scm b/formatst.scm new file mode 100644 index 0000000..77a46c4 --- /dev/null +++ b/formatst.scm @@ -0,0 +1,666 @@ +;; "formatst.scm" SLIB FORMAT Version 3.0 conformance test +; Written by Dirk Lutzebaeck (lutzeb@cs.tu-berlin.de) +; +; This code is in the public domain. + +;; Test run: (slib:load "formatst") + +; Failure reports for various scheme interpreters: +; +; SCM4d +; None. +; Elk 2.2: +; None. +; MIT C-Scheme 7.1: +; The empty list is always evaluated as a boolean and consequently +; represented as `#f'. +; Scheme->C 01nov91: +; None, if format:symbol-case-conv and format:iobj-case-conv are set +; to string-downcase. + +(require 'format) +(if (not (string=? format:version "3.0")) + (begin + (display "You have format version ") + (display format:version) + (display ". This test is for format version 3.0!") + (newline) + (format:abort))) + +(define fails 0) +(define total 0) +(define test-verbose #f) ; shows each test performed + +(define (test format-args out-str) + (set! total (+ total 1)) + (if (not test-verbose) + (if (zero? (modulo total 10)) + (begin + (display total) + (display ",") + (force-output (current-output-port))))) + (let ((format-out (apply format `(#f ,@format-args)))) + (if (string=? out-str format-out) + (if test-verbose + (begin + (display "Verified ") + (write format-args) + (display " returns ") + (write out-str) + (newline))) + (begin + (set! fails (+ fails 1)) + (if (not test-verbose) (newline)) + (display "*Failed* ") + (write format-args) + (newline) + (display " returns ") + (write format-out) + (newline) + (display " expected ") + (write out-str) + (newline))))) + +; ensure format default configuration + +(set! format:symbol-case-conv #f) +(set! format:iobj-case-conv #f) +(set! format:read-proof #f) +(set! format:iteration-bounded #t) +(set! format:max-iterations 100) + +(format #t "~q") + +(format #t "This implementation has~@[ no~] flonums ~ + ~:[but no~;and~] complex numbers~%" + (not format:floats) format:complex-numbers) + +; any object test + +(test '("abc") "abc") +(test '("~a" 10) "10") +(test '("~a" -1.2) "-1.2") +(test '("~a" a) "a") +(test '("~a" #t) "#t") +(test '("~a" #f) "#f") +(test '("~a" "abc") "abc") +(test '("~a" #(1 2 3)) "#(1 2 3)") +(test '("~a" ()) "()") +(test '("~a" (a)) "(a)") +(test '("~a" (a b)) "(a b)") +(test '("~a" (a (b c) d)) "(a (b c) d)") +(test '("~a" (a . b)) "(a . b)") +(test '("~a" (a (b c . d))) "(a (b . (c . d)))") ; this is ugly +(test `("~a" ,display) (format:iobj->str display)) +(test `("~a" ,(current-input-port)) (format:iobj->str (current-input-port))) +(test `("~a" ,(current-output-port)) (format:iobj->str (current-output-port))) + +; # argument test + +(test '("~a ~a" 10 20) "10 20") +(test '("~a abc ~a def" 10 20) "10 abc 20 def") + +; numerical test + +(test '("~d" 100) "100") +(test '("~x" 100) "64") +(test '("~o" 100) "144") +(test '("~b" 100) "1100100") +(test '("~@d" 100) "+100") +(test '("~@d" -100) "-100") +(test '("~@x" 100) "+64") +(test '("~@o" 100) "+144") +(test '("~@b" 100) "+1100100") +(test '("~10d" 100) " 100") +(test '("~:d" 123) "123") +(test '("~:d" 1234) "1,234") +(test '("~:d" 12345) "12,345") +(test '("~:d" 123456) "123,456") +(test '("~:d" 12345678) "12,345,678") +(test '("~:d" -123) "-123") +(test '("~:d" -1234) "-1,234") +(test '("~:d" -12345) "-12,345") +(test '("~:d" -123456) "-123,456") +(test '("~:d" -12345678) "-12,345,678") +(test '("~10:d" 1234) " 1,234") +(test '("~10:d" -1234) " -1,234") +(test '("~10,'*d" 100) "*******100") +(test '("~10,,'|:d" 12345678) "12|345|678") +(test '("~10,,,2:d" 12345678) "12,34,56,78") +(test '("~14,'*,'|,4:@d" 12345678) "****+1234|5678") +(test '("~10r" 100) "100") +(test '("~2r" 100) "1100100") +(test '("~8r" 100) "144") +(test '("~16r" 100) "64") +(test '("~16,10,'*r" 100) "********64") + +; roman numeral test + +(test '("~@r" 4) "IV") +(test '("~@r" 19) "XIX") +(test '("~@r" 50) "L") +(test '("~@r" 100) "C") +(test '("~@r" 1000) "M") +(test '("~@r" 99) "XCIX") +(test '("~@r" 1994) "MCMXCIV") + +; old roman numeral test + +(test '("~:@r" 4) "IIII") +(test '("~:@r" 5) "V") +(test '("~:@r" 10) "X") +(test '("~:@r" 9) "VIIII") + +; cardinal/ordinal English number test + +(test '("~r" 4) "four") +(test '("~r" 10) "ten") +(test '("~r" 19) "nineteen") +(test '("~r" 1984) "one thousand, nine hundred eighty-four") +(test '("~:r" -1984) "minus one thousand, nine hundred eighty-fourth") + +; character test + +(test '("~c" #\a) "a") +(test '("~@c" #\a) "#\\a") +(test `("~@c" ,(integer->char 32)) "#\\space") +(test `("~@c" ,(integer->char 0)) "#\\nul") +(test `("~@c" ,(integer->char 27)) "#\\esc") +(test `("~@c" ,(integer->char 127)) "#\\del") +(test `("~@c" ,(integer->char 128)) "#\\200") +(test `("~@c" ,(integer->char 255)) "#\\377") +(test '("~65c") "A") +(test '("~7@c") "#\\bel") +(test '("~:c" #\a) "a") +(test `("~:c" ,(integer->char 1)) "^A") +(test `("~:c" ,(integer->char 27)) "^[") +(test '("~7:c") "^G") +(test `("~:c" ,(integer->char 128)) "#\\200") +(test `("~:c" ,(integer->char 127)) "#\\177") +(test `("~:c" ,(integer->char 255)) "#\\377") + + +; plural test + +(test '("test~p" 1) "test") +(test '("test~p" 2) "tests") +(test '("test~p" 0) "tests") +(test '("tr~@p" 1) "try") +(test '("tr~@p" 2) "tries") +(test '("tr~@p" 0) "tries") +(test '("~a test~:p" 10) "10 tests") +(test '("~a test~:p" 1) "1 test") + +; tilde test + +(test '("~~~~") "~~") +(test '("~3~") "~~~") + +; whitespace character test + +(test '("~%") " +") +(test '("~3%") " + + +") +(test '("~&") "") +(test '("abc~&") "abc +") +(test '("abc~&def") "abc +def") +(test '("~&") " +") +(test '("~3&") " + +") +(test '("abc~3&") "abc + + +") +(test '("~|") (string slib:form-feed)) +(test '("~_~_~_") " ") +(test '("~3_") " ") +(test '("~/") (string slib:tab)) +(test '("~3/") (make-string 3 slib:tab)) + +; tabulate test + +(test '("~0&~3t") " ") +(test '("~0&~10t") " ") +(test '("~10t") "") +(test '("~0&1234567890~,8tABC") "1234567890 ABC") +(test '("~0&1234567890~0,8tABC") "1234567890 ABC") +(test '("~0&1234567890~1,8tABC") "1234567890 ABC") +(test '("~0&1234567890~2,8tABC") "1234567890ABC") +(test '("~0&1234567890~3,8tABC") "1234567890 ABC") +(test '("~0&1234567890~4,8tABC") "1234567890 ABC") +(test '("~0&1234567890~5,8tABC") "1234567890 ABC") +(test '("~0&1234567890~6,8tABC") "1234567890 ABC") +(test '("~0&1234567890~7,8tABC") "1234567890 ABC") +(test '("~0&1234567890~8,8tABC") "1234567890 ABC") +(test '("~0&1234567890~9,8tABC") "1234567890 ABC") +(test '("~0&1234567890~10,8tABC") "1234567890ABC") +(test '("~0&1234567890~11,8tABC") "1234567890 ABC") +(test '("~0&12345~,8tABCDE~,8tXYZ") "12345 ABCDE XYZ") +(test '("~,8t+++~,8t===") " +++ ===") +(test '("~0&ABC~,8,'.tDEF") "ABC......DEF") +(test '("~0&~3,8@tABC") " ABC") +(test '("~0&1234~3,8@tABC") "1234 ABC") +(test '("~0&12~3,8@tABC~3,8@tDEF") "12 ABC DEF") + +; indirection test + +(test '("~a ~? ~a" 10 "~a ~a" (20 30) 40) "10 20 30 40") +(test '("~a ~@? ~a" 10 "~a ~a" 20 30 40) "10 20 30 40") + +; field test + +(test '("~10a" "abc") "abc ") +(test '("~10@a" "abc") " abc") +(test '("~10a" "0123456789abc") "0123456789abc") +(test '("~10@a" "0123456789abc") "0123456789abc") + +; pad character test + +(test '("~10,,,'*a" "abc") "abc*******") +(test '("~10,,,'Xa" "abc") "abcXXXXXXX") +(test '("~10,,,42a" "abc") "abc*******") +(test '("~10,,,'*@a" "abc") "*******abc") +(test '("~10,,3,'*a" "abc") "abc*******") +(test '("~10,,3,'*a" "0123456789abc") "0123456789abc***") ; min. padchar length +(test '("~10,,3,'*@a" "0123456789abc") "***0123456789abc") + +; colinc, minpad padding test + +(test '("~10,8,0,'*a" 123) "123********") +(test '("~10,9,0,'*a" 123) "123*********") +(test '("~10,10,0,'*a" 123) "123**********") +(test '("~10,11,0,'*a" 123) "123***********") +(test '("~8,1,0,'*a" 123) "123*****") +(test '("~8,2,0,'*a" 123) "123******") +(test '("~8,3,0,'*a" 123) "123******") +(test '("~8,4,0,'*a" 123) "123********") +(test '("~8,5,0,'*a" 123) "123*****") +(test '("~8,1,3,'*a" 123) "123*****") +(test '("~8,1,5,'*a" 123) "123*****") +(test '("~8,1,6,'*a" 123) "123******") +(test '("~8,1,9,'*a" 123) "123*********") + +; slashify test + +(test '("~s" "abc") "\"abc\"") +(test '("~s" "abc \\ abc") "\"abc \\\\ abc\"") +(test '("~a" "abc \\ abc") "abc \\ abc") +(test '("~s" "abc \" abc") "\"abc \\\" abc\"") +(test '("~a" "abc \" abc") "abc \" abc") +(test '("~s" #\space) "#\\space") +(test '("~s" #\newline) "#\\newline") +(test `("~s" ,slib:tab) "#\\ht") +(test '("~s" #\a) "#\\a") +(test '("~a" (a "b" c)) "(a \"b\" c)") + +; symbol case force test + +(define format:old-scc format:symbol-case-conv) +(set! format:symbol-case-conv string-upcase) +(test '("~a" abc) "ABC") +(set! format:symbol-case-conv string-downcase) +(test '("~s" abc) "abc") +(set! format:symbol-case-conv string-capitalize) +(test '("~s" abc) "Abc") +(set! format:symbol-case-conv format:old-scc) + +; read proof test + +(test `("~:s" ,display) + (begin + (set! format:read-proof #t) + (format:iobj->str display))) +(test `("~:a" ,display) + (begin + (set! format:read-proof #t) + (format:iobj->str display))) +(test `("~:a" (1 2 ,display)) + (begin + (set! format:read-proof #t) + (string-append "(1 2 " (format:iobj->str display) ")"))) +(test '("~:a" "abc") "abc") +(set! format:read-proof #f) + +; internal object case type force test + +(set! format:iobj-case-conv string-upcase) +(test `("~a" ,display) (string-upcase (format:iobj->str display))) +(set! format:iobj-case-conv string-downcase) +(test `("~s" ,display) (string-downcase (format:iobj->str display))) +(set! format:iobj-case-conv string-capitalize) +(test `("~s" ,display) (string-capitalize (format:iobj->str display))) +(set! format:iobj-case-conv #f) + +; continuation line test + +(test '("abc~ + 123") "abc123") +(test '("abc~ +123") "abc123") +(test '("abc~ +") "abc") +(test '("abc~: + def") "abc def") +(test '("abc~@ + def") +"abc +def") + +; flush output (can't test it here really) + +(test '("abc ~! xyz") "abc xyz") + +; string case conversion + +(test '("~a ~(~a~) ~a" "abc" "HELLO WORLD" "xyz") "abc hello world xyz") +(test '("~a ~:(~a~) ~a" "abc" "HELLO WORLD" "xyz") "abc Hello World xyz") +(test '("~a ~@(~a~) ~a" "abc" "HELLO WORLD" "xyz") "abc Hello world xyz") +(test '("~a ~:@(~a~) ~a" "abc" "hello world" "xyz") "abc HELLO WORLD xyz") +(test '("~:@(~a~)" (a b c)) "(A B C)") +(test '("~:@(~x~)" 255) "FF") +(test '("~:@(~p~)" 2) "S") +(test `("~:@(~a~)" ,display) (string-upcase (format:iobj->str display))) +(test '("~:(~a ~a ~a~) ~a" "abc" "xyz" "123" "world") "Abc Xyz 123 world") + +; variable parameter + +(test '("~va" 10 "abc") "abc ") +(test '("~v,,,va" 10 42 "abc") "abc*******") + +; number of remaining arguments as parameter + +(test '("~#,,,'*@a ~a ~a ~a" 1 1 1 1) "***1 1 1 1") + +; argument jumping + +(test '("~a ~* ~a" 10 20 30) "10 30") +(test '("~a ~2* ~a" 10 20 30 40) "10 40") +(test '("~a ~:* ~a" 10) "10 10") +(test '("~a ~a ~2:* ~a ~a" 10 20) "10 20 10 20") +(test '("~a ~a ~@* ~a ~a" 10 20) "10 20 10 20") +(test '("~a ~a ~4@* ~a ~a" 10 20 30 40 50 60) "10 20 50 60") + +; conditionals + +(test '("~[abc~;xyz~]" 0) "abc") +(test '("~[abc~;xyz~]" 1) "xyz") +(test '("~[abc~;xyz~:;456~]" 99) "456") +(test '("~0[abc~;xyz~:;456~]") "abc") +(test '("~1[abc~;xyz~:;456~] ~a" 100) "xyz 100") +(test '("~#[no arg~;~a~;~a and ~a~;~a, ~a and ~a~]") "no arg") +(test '("~#[no arg~;~a~;~a and ~a~;~a, ~a and ~a~]" 10) "10") +(test '("~#[no arg~;~a~;~a and ~a~;~a, ~a and ~a~]" 10 20) "10 and 20") +(test '("~#[no arg~;~a~;~a and ~a~;~a, ~a and ~a~]" 10 20 30) "10, 20 and 30") +(test '("~:[hello~;world~] ~a" #t 10) "world 10") +(test '("~:[hello~;world~] ~a" #f 10) "hello 10") +(test '("~@[~a tests~]" #f) "") +(test '("~@[~a tests~]" 10) "10 tests") +(test '("~@[~a test~:p~] ~a" 10 done) "10 tests done") +(test '("~@[~a test~:p~] ~a" 1 done) "1 test done") +(test '("~@[~a test~:p~] ~a" 0 done) "0 tests done") +(test '("~@[~a test~:p~] ~a" #f done) " done") +(test '("~@[ level = ~d~]~@[ length = ~d~]" #f 5) " length = 5") +(test '("~[abc~;~[4~;5~;6~]~;xyz~]" 0) "abc") ; nested conditionals (irrghh) +(test '("~[abc~;~[4~;5~;6~]~;xyz~]" 2) "xyz") +(test '("~[abc~;~[4~;5~;6~]~;xyz~]" 1 2) "6") + +; iteration + +(test '("~{ ~a ~}" (a b c)) " a b c ") +(test '("~{ ~a ~}" ()) "") +(test '("~{ ~a ~5,,,'*a~}" (a b c d)) " a b**** c d****") +(test '("~{ ~a,~a ~}" (a 1 b 2 c 3)) " a,1 b,2 c,3 ") +(test '("~2{ ~a,~a ~}" (a 1 b 2 c 3)) " a,1 b,2 ") +(test '("~3{~a ~} ~a" (a b c d e) 100) "a b c 100") +(test '("~0{~a ~} ~a" (a b c d e) 100) " 100") +(test '("~:{ ~a,~a ~}" ((a b) (c d e f) (g h))) " a,b c,d g,h ") +(test '("~2:{ ~a,~a ~}" ((a b) (c d e f) (g h))) " a,b c,d ") +(test '("~@{ ~a,~a ~}" a 1 b 2 c 3) " a,1 b,2 c,3 ") +(test '("~2@{ ~a,~a ~} <~a|~a>" a 1 b 2 c 3) " a,1 b,2 <c|3>") +(test '("~:@{ ~a,~a ~}" (a 1) (b 2) (c 3)) " a,1 b,2 c,3 ") +(test '("~2:@{ ~a,~a ~} ~a" (a 1) (b 2) (c 3)) " a,1 b,2 (c 3)") +(test '("~{~}" "<~a,~a>" (a 1 b 2 c 3)) "<a,1><b,2><c,3>") +(test '("~{ ~a ~{<~a>~}~} ~a" (a (1 2) b (3 4)) 10) " a <1><2> b <3><4> 10") +(let ((nums (let iter ((ns '()) (l 0)) + (if (> l 105) (reverse ns) (iter (cons l ns) (+ l 1)))))) + ;; Test default, only 100 items formatted out: + (test `("~D~{, ~D~}" ,(car nums) ,(cdr nums)) + "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100") + ;; Test control of number of items formatted out: + (set! format:max-iterations 90) + (test `("~D~{, ~D~}" ,(car nums) ,(cdr nums)) + "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90") + ;; Test control of imposing bound on number of items formatted out: + (set! format:iteration-bounded #f) + (test `("~D~{, ~D~}" ,(car nums) ,(cdr nums)) + "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105") + ;; Restore defaults: + (set! format:iteration-bounded #t) + (set! format:max-iterations 100) + ) + +; up and out + +(test '("abc ~^ xyz") "abc ") +(test '("~@(abc ~^ xyz~) ~a" 10) "ABC xyz 10") +(test '("done. ~^ ~d warning~:p. ~^ ~d error~:p.") "done. ") +(test '("done. ~^ ~d warning~:p. ~^ ~d error~:p." 10) "done. 10 warnings. ") +(test '("done. ~^ ~d warning~:p. ~^ ~d error~:p." 10 1) + "done. 10 warnings. 1 error.") +(test '("~{ ~a ~^<~a>~} ~a" (a b c d e f) 10) " a <b> c <d> e <f> 10") +(test '("~{ ~a ~^<~a>~} ~a" (a b c d e) 10) " a <b> c <d> e 10") +(test '("abc~0^ xyz") "abc") +(test '("abc~9^ xyz") "abc xyz") +(test '("abc~7,4^ xyz") "abc xyz") +(test '("abc~7,7^ xyz") "abc") +(test '("abc~3,7,9^ xyz") "abc") +(test '("abc~8,7,9^ xyz") "abc xyz") +(test '("abc~3,7,5^ xyz") "abc xyz") + +; complexity tests (oh my god, I hardly understand them myself (see CL std)) + +(define fmt "Items:~#[ none~; ~a~; ~a and ~a~:;~@{~#[~; and~] ~a~^,~}~].") + +(test `(,fmt ) "Items: none.") +(test `(,fmt foo) "Items: foo.") +(test `(,fmt foo bar) "Items: foo and bar.") +(test `(,fmt foo bar baz) "Items: foo, bar, and baz.") +(test `(,fmt foo bar baz zok) "Items: foo, bar, baz, and zok.") + +; fixed floating points + +(cond + (format:floats + (test '("~6,2f" 3.14159) " 3.14") + (test '("~6,1f" 3.14159) " 3.1") + (test '("~6,0f" 3.14159) " 3.") + (test '("~5,1f" 0) " 0.0") + (test '("~10,7f" 3.14159) " 3.1415900") + (test '("~10,7f" -3.14159) "-3.1415900") + (test '("~10,7@f" 3.14159) "+3.1415900") + (test '("~6,3f" 0.0) " 0.000") + (test '("~6,4f" 0.007) "0.0070") + (test '("~6,3f" 0.007) " 0.007") + (test '("~6,2f" 0.007) " 0.01") + (test '("~3,2f" 0.007) ".01") + (test '("~3,2f" -0.007) "-.01") + (test '("~6,2,,,'*f" 3.14159) "**3.14") + (test '("~6,3,,'?f" 12345.56789) "??????") + (test '("~6,3f" 12345.6789) "12345.679") + (test '("~,3f" 12345.6789) "12345.679") + (test '("~,3f" 9.9999) "10.000") + (test '("~6f" 23.4) " 23.4") + (test '("~6f" 1234.5) "1234.5") + (test '("~6f" 12345678) "12345678.0") + (test '("~6,,,'?f" 12345678) "??????") + (test '("~6f" 123.56789) "123.57") + (test '("~6f" 123.0) " 123.0") + (test '("~6f" -123.0) "-123.0") + (test '("~6f" 0.0) " 0.0") + (test '("~3f" 3.141) "3.1") + (test '("~2f" 3.141) "3.") + (test '("~1f" 3.141) "3.141") + (test '("~f" 123.56789) "123.56789") + (test '("~f" -314.0) "-314.0") + (test '("~f" 1e4) "10000.0") + (test '("~f" -1.23e10) "-12300000000.0") + (test '("~f" 1e-4) "0.0001") + (test '("~f" -1.23e-10) "-0.000000000123") + (test '("~@f" 314.0) "+314.0") + (test '("~,,3f" 0.123456) "123.456") + (test '("~,,-3f" -123.456) "-0.123456") + (test '("~5,,3f" 0.123456) "123.5") +)) + +; exponent floating points + +(cond + (format:floats + (test '("~e" 3.14159) "3.14159E+0") + (test '("~e" 0.00001234) "1.234E-5") + (test '("~,,,0e" 0.00001234) "0.1234E-4") + (test '("~,3e" 3.14159) "3.142E+0") + (test '("~,3@e" 3.14159) "+3.142E+0") + (test '("~,3@e" 0.0) "+0.000E+0") + (test '("~,0e" 3.141) "3.E+0") + (test '("~,3,,0e" 3.14159) "0.314E+1") + (test '("~,5,3,-2e" 3.14159) "0.00314E+003") + (test '("~,5,3,-5e" -3.14159) "-0.00000E+006") + (test '("~,5,2,2e" 3.14159) "31.4159E-01") + (test '("~,5,2,,,,'ee" 0.0) "0.00000e+00") + (test '("~12,3e" -3.141) " -3.141E+0") + (test '("~12,3,,,,'#e" -3.141) "###-3.141E+0") + (test '("~10,2e" -1.236e-4) " -1.24E-4") + (test '("~5,3e" -3.141) "-3.141E+0") + (test '("~5,3,,,'*e" -3.141) "*****") + (test '("~3e" 3.14159) "3.14159E+0") + (test '("~4e" 3.14159) "3.14159E+0") + (test '("~5e" 3.14159) "3.E+0") + (test '("~5,,,,'*e" 3.14159) "3.E+0") + (test '("~6e" 3.14159) "3.1E+0") + (test '("~7e" 3.14159) "3.14E+0") + (test '("~7e" -3.14159) "-3.1E+0") + (test '("~8e" 3.14159) "3.142E+0") + (test '("~9e" 3.14159) "3.1416E+0") + (test '("~9,,,,,,'ee" 3.14159) "3.1416e+0") + (test '("~10e" 3.14159) "3.14159E+0") + (test '("~11e" 3.14159) " 3.14159E+0") + (test '("~12e" 3.14159) " 3.14159E+0") + (test '("~13,6,2,-5e" 3.14159) " 0.000003E+06") + (test '("~13,6,2,-4e" 3.14159) " 0.000031E+05") + (test '("~13,6,2,-3e" 3.14159) " 0.000314E+04") + (test '("~13,6,2,-2e" 3.14159) " 0.003142E+03") + (test '("~13,6,2,-1e" 3.14159) " 0.031416E+02") + (test '("~13,6,2,0e" 3.14159) " 0.314159E+01") + (test '("~13,6,2,1e" 3.14159) " 3.141590E+00") + (test '("~13,6,2,2e" 3.14159) " 31.41590E-01") + (test '("~13,6,2,3e" 3.14159) " 314.1590E-02") + (test '("~13,6,2,4e" 3.14159) " 3141.590E-03") + (test '("~13,6,2,5e" 3.14159) " 31415.90E-04") + (test '("~13,6,2,6e" 3.14159) " 314159.0E-05") + (test '("~13,6,2,7e" 3.14159) " 3141590.E-06") + (test '("~13,6,2,8e" 3.14159) "31415900.E-07") + (test '("~7,3,,-2e" 0.001) ".001E+0") + (test '("~8,3,,-2@e" 0.001) "+.001E+0") + (test '("~8,3,,-2@e" -0.001) "-.001E+0") + (test '("~8,3,,-2e" 0.001) "0.001E+0") + (test '("~7,,,-2e" 0.001) "0.00E+0") + (test '("~12,3,1e" 3.14159e12) " 3.142E+12") + (test '("~12,3,1,,'*e" 3.14159e12) "************") + (test '("~5,3,1e" 3.14159e12) "3.142E+12") +)) + +; general floating point (this test is from Steele's CL book) + +(cond + (format:floats + (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g" + 0.0314159 0.0314159 0.0314159 0.0314159) + " 3.14E-2|314.2$-04|0.314E-01| 3.14E-2") + (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g" + 0.314159 0.314159 0.314159 0.314159) + " 0.31 |0.314 |0.314 | 0.31 ") + (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g" + 3.14159 3.14159 3.14159 3.14159) + " 3.1 | 3.14 | 3.14 | 3.1 ") + (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g" + 31.4159 31.4159 31.4159 31.4159) + " 31. | 31.4 | 31.4 | 31. ") + (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g" + 314.159 314.159 314.159 314.159) + " 3.14E+2| 314. | 314. | 3.14E+2") + (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g" + 3141.59 3141.59 3141.59 3141.59) + " 3.14E+3|314.2$+01|0.314E+04| 3.14E+3") + (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g" + 3.14E12 3.14E12 3.14E12 3.14E12) + "*********|314.0$+10|0.314E+13| 3.14E+12") + (test '("~9,2,1,,'*g|~9,3,2,3,'?,,'$g|~9,3,2,0,'%g|~9,2g" + 3.14E120 3.14E120 3.14E120 3.14E120) + "*********|?????????|%%%%%%%%%|3.14E+120") + + (test '("~g" 0.0) "0.0 ") ; further ~g tests + (test '("~g" 0.1) "0.1 ") + (test '("~g" 0.01) "1.0E-2") + (test '("~g" 123.456) "123.456 ") + (test '("~g" 123456.7) "123456.7 ") + (test '("~g" 123456.78) "123456.78 ") + (test '("~g" 0.9282) "0.9282 ") + (test '("~g" 0.09282) "9.282E-2") + (test '("~g" 1) "1.0 ") + (test '("~g" 12) "12.0 ") + )) + +; dollar floating point + +(cond + (format:floats + (test '("~$" 1.23) "1.23") + (test '("~$" 1.2) "1.20") + (test '("~$" 0.0) "0.00") + (test '("~$" 9.999) "10.00") + (test '("~3$" 9.9999) "10.000") + (test '("~,4$" 3.2) "0003.20") + (test '("~,4$" 10000.2) "10000.20") + (test '("~,4,10$" 3.2) " 0003.20") + (test '("~,4,10@$" 3.2) " +0003.20") + (test '("~,4,10:@$" 3.2) "+ 0003.20") + (test '("~,4,10:$" -3.2) "- 0003.20") + (test '("~,4,10$" -3.2) " -0003.20") + (test '("~,,10@$" 3.2) " +3.20") + (test '("~,,10:@$" 3.2) "+ 3.20") + (test '("~,,10:@$" -3.2) "- 3.20") + (test '("~,,10,'_@$" 3.2) "_____+3.20") + (test '("~,,4$" 1234.4) "1234.40") +)) + +; complex numbers + +(cond + (format:complex-numbers + (test '("~i" 3.0) "3.0+0.0i") + (test '("~,3i" 3.0) "3.000+0.000i") + (test `("~7,2i" ,(string->number "3.0+5.0i")) " 3.00 +5.00i") + (test `("~7,2,1i" ,(string->number "3.0+5.0i")) " 30.00 +50.00i") + (test `("~7,2@i" ,(string->number "3.0+5.0i")) " +3.00 +5.00i") + (test `("~7,2,,,'*@i" ,(string->number "3.0+5.0i")) "**+3.00**+5.00i") + )) ; note: some parsers choke syntactically on reading a complex + ; number though format:complex is #f; this is why we put them in + ; strings + +; inquiry test + +(test '("~:q") format:version) + +(if (not test-verbose) (display "done.")) + +(format #t "~%~a Test~:p completed. (~a failure~:p)~2%" total fails) + +; eof diff --git a/guile.init.local b/guile.init.local new file mode 100644 index 0000000..551a7a2 --- /dev/null +++ b/guile.init.local @@ -0,0 +1,416 @@ +;"guile.init" Configuration file for SLIB for GUILE -*-scheme-*- +;;; Author: Aubrey Jaffer +;;; +;;; This code is in the public domain. + +(if (string<? (version) "1.6") + (define-module (ice-9 slib))) ; :no-backtrace +(define slib-module (current-module)) +(define (defined? symbol) (module-defined? slib-module symbol)) + +(define base:define define) +(define define + (procedure->memoizing-macro + (lambda (exp env) + (cons (if (= 1 (length env)) 'define-public 'base:define) (cdr exp))))) + +;;; Hack to make syncase macros work in the slib module +(if (nested-ref the-root-module '(app modules ice-9 syncase)) + (set-object-property! (module-local-variable (current-module) 'define) + '*sc-expander* + '(define))) + +;;; (software-type) should be set to the generic operating system type. +;;; UNIX, VMS, MACOS, AMIGA and MS-DOS are supported. +(define (software-type) 'unix) + +;;; (scheme-implementation-type) should return the name of the scheme +;;; implementation loading this file. +(define (scheme-implementation-type) 'guile) + +;;; (scheme-implementation-home-page) should return a (string) URI +;;; (Uniform Resource Identifier) for this scheme implementation's home +;;; page; or false if there isn't one. +(define (scheme-implementation-home-page) + "http://www.gnu.org/software/guile/guile.html") + +;;; (scheme-implementation-version) should return a string describing +;;; the version the scheme implementation loading this file. +(define scheme-implementation-version version) + +(define in-vicinity string-append) + +;;; (implementation-vicinity) should be defined to be the pathname of +;;; the directory where any auxillary files to your Scheme +;;; implementation reside. +(define implementation-vicinity + (let ((path '".")) + (lambda () path))) + +;;; (library-vicinity) should be defined to be the pathname of the +;;; directory where files of Scheme library functions reside. +(define library-vicinity + (let ((library-path + (or + ;; Use this getenv if your implementation supports it. + (and (defined? 'getenv) (getenv "SCHEME_LIBRARY_PATH")) + ;; Use this path if your scheme does not support GETENV + ;; or if SCHEME_LIBRARY_PATH is not set. + (in-vicinity (implementation-vicinity) "slib/")))) + (lambda () library-path))) + +;;; (home-vicinity) should return the vicinity of the user's HOME +;;; directory, the directory which typically contains files which +;;; customize a computer environment for a user. +(define (home-vicinity) + (let ((home (getenv "HOME"))) + (and home + (case (software-type) + ((unix coherent ms-dos) ;V7 unix has a / on HOME + (if (eqv? #\/ (string-ref home (+ -1 (string-length home)))) + home + (string-append home "/"))) + (else home))))) + +;;; *FEATURES* should be set to a list of symbols describing features +;;; of this implementation. Suggestions for features are: +(define *features* + (append + '( + source ;can load scheme source files + ;(slib:load-source "filename") +; compiled ;can load compiled files + ;(slib:load-compiled "filename") + + ;; Scheme report features + +; r5rs ;conforms to + eval ;R5RS two-argument eval +; values ;R5RS multiple values + dynamic-wind ;R5RS dynamic-wind +; macro ;R5RS high level macros + delay ;has DELAY and FORCE + multiarg-apply ;APPLY can take more than 2 args. +; rationalize + rev4-optional-procedures ;LIST-TAIL, STRING->LIST, + ;LIST->STRING, STRING-COPY, + ;STRING-FILL!, LIST->VECTOR, + ;VECTOR->LIST, and VECTOR-FILL! + +; r4rs ;conforms to + +; ieee-p1178 ;conforms to + +; r3rs ;conforms to + + rev2-procedures ;SUBSTRING-MOVE-LEFT!, + ;SUBSTRING-MOVE-RIGHT!, + ;SUBSTRING-FILL!, + ;STRING-NULL?, APPEND!, 1+, + ;-1+, <?, <=?, =?, >?, >=? +; object-hash ;has OBJECT-HASH + + multiarg/and- ;/ and - can take more than 2 args. + with-file ;has WITH-INPUT-FROM-FILE and + ;WITH-OUTPUT-TO-FILE +; transcript ;TRANSCRIPT-ON and TRANSCRIPT-OFF +; ieee-floating-point ;conforms to IEEE Standard 754-1985 + ;IEEE Standard for Binary + ;Floating-Point Arithmetic. + full-continuation ;can return multiple times + + ;; Other common features + +; srfi ;srfi-0, COND-EXPAND finds all srfi-* +; sicp ;runs code from Structure and + ;Interpretation of Computer + ;Programs by Abelson and Sussman. + defmacro ;has Common Lisp DEFMACRO +; record ;has user defined data structures + string-port ;has CALL-WITH-INPUT-STRING and + ;CALL-WITH-OUTPUT-STRING +; sort +; pretty-print +; object->string +; format ;Common-lisp output formatting +; trace ;has macros: TRACE and UNTRACE +; compiler ;has (COMPILER) +; ed ;(ED) is editor + random + ) + + (if (defined? 'getenv) + '(getenv) + '()) + + (if (defined? 'current-time) + '(current-time) + '()) + + (if (defined? 'system) + '(system) + '()) + + (if (defined? 'array?) + '(array) + '()) + + (if (defined? 'char-ready?) + '(char-ready?) + '()) + + (if (defined? 'array-for-each) + '(array-for-each) + '()) + + *features*)) + +;;; (OUTPUT-PORT-WIDTH <port>) +(define (output-port-width . arg) 79) + +;;; (OUTPUT-PORT-HEIGHT <port>) +(define (output-port-height . arg) 24) + +;;; (CURRENT-ERROR-PORT) +;;(define current-error-port +;; (let ((port (current-output-port))) +;; (lambda () port))) + +;;; (TMPNAM) makes a temporary file name. +;;(define tmpnam (let ((cntr 100)) +;; (lambda () (set! cntr (+ 1 cntr)) +;; (string-append "slib_" (number->string cntr))))) + +;;; (FILE-EXISTS? <string>) +;;(define (file-exists? f) #f) + +;;; (DELETE-FILE <string>) +;;(define (delete-file f) #f) + +;;; FORCE-OUTPUT flushes any pending output on optional arg output port +;;; use this definition if your system doesn't have such a procedure. +;;(define (force-output . arg) #t) + +;;; CALL-WITH-INPUT-STRING and CALL-WITH-OUTPUT-STRING are the string +;;; port versions of CALL-WITH-*PUT-FILE. + +(define (make-exchanger obj) + (lambda (rep) (let ((old obj)) (set! obj rep) old))) + +(define (port? obj) (or (input-port? obj) (output-port? obj))) +(define (call-with-open-ports . ports) + (define proc (car ports)) + (cond ((procedure? proc) (set! ports (cdr ports))) + (else (set! ports (reverse ports)) + (set! proc (car ports)) + (set! ports (reverse (cdr ports))))) + (let ((ans (apply proc ports))) + (for-each close-port ports) + ans)) + +;;; "rationalize" adjunct procedures. +;;(define (find-ratio x e) +;; (let ((rat (rationalize x e))) +;; (list (numerator rat) (denominator rat)))) +;;(define (find-ratio-between x y) +;; (find-ratio (/ (+ x y) 2) (/ (- x y) 2))) + +;;; CHAR-CODE-LIMIT is one greater than the largest integer which can +;;; be returned by CHAR->INTEGER. +;;(define char-code-limit 256) + +;;; MOST-POSITIVE-FIXNUM is used in modular.scm +;;(define most-positive-fixnum #x0FFFFFFF) + +;;; Return argument +(define (identity x) x) + +;;; SLIB:EVAL is single argument eval using the top-level (user) environment. +(define slib:eval + (if (string<? (scheme-implementation-version) "1.5") + eval + (let ((ie (interaction-environment))) + (lambda (expression) + (eval expression ie))))) + +;;; Define SLIB:EXIT to be the implementation procedure to exit or +;;; return if exitting not supported. +(define slib:exit quit) + +;;; Here for backward compatability +;;(define scheme-file-suffix +;; (let ((suffix (case (software-type) +;; ((NOSVE) "_scm") +;; (else ".scm")))) +;; (lambda () suffix))) + +(define (slib:eval-load <pathname> evl) + (if (not (file-exists? <pathname>)) + (set! <pathname> (string-append <pathname> (scheme-file-suffix)))) + (call-with-input-file <pathname> + (lambda (port) + (let ((old-load-pathname *load-pathname*)) + (set! *load-pathname* <pathname>) + (do ((o (read port) (read port))) + ((eof-object? o)) + (evl o)) + (set! *load-pathname* old-load-pathname))))) + +(define (guile:wrap-case-insensitive proc) + (lambda args + (save-module-excursion + (lambda () + (set-current-module slib-module) + (let ((old (read-options))) + (dynamic-wind + (lambda () (read-enable 'case-insensitive)) + (lambda () (apply proc args)) + (lambda () (read-options old)))))))) + +(define read (guile:wrap-case-insensitive read)) + +;;; (SLIB:LOAD-SOURCE "foo") should load "foo.scm" or with whatever +;;; suffix all the module files in SLIB have. See feature 'SOURCE. +(define slib:load + (let ((load-file (guile:wrap-case-insensitive load))) + (lambda (<pathname>) + (load-file (string-append <pathname> (scheme-file-suffix)))))) + +(define slib:load-source slib:load) + +;;; (SLIB:LOAD-COMPILED "foo") should load the file that was produced +;;; by compiling "foo.scm" if this implementation can compile files. +;;; See feature 'COMPILED. +(define slib:load-compiled slib:load) + +(define defmacro:eval slib:eval) +(define defmacro:load slib:load) + +(define (defmacro:expand* x) + (require 'defmacroexpand) (apply defmacro:expand* x '())) + +;;; If your implementation provides R4RS macros: +(define macro:eval slib:eval) +(define macro:load slib:load) + +(define slib:warn warn) +(define slib:error error) + +;;; define these as appropriate for your system. +(define slib:tab #\tab) +(define slib:form-feed #\page) + +;;; {Time} +(define difftime -) +(define offset-time +) + +;;; Early version of 'logical is built-in +(define logical:logand logand) +(define logical:logior logior) +;;(define logical:logxor logxor) +;;(define logical:lognot lognot) +;;(define logical:logtest logtest) +;;(define logical:logbit? logbit?) +(define (copy-bit index to bool) + (if bool + (logical:logior to (logical:ash 1 index)) + (logical:logand to (logical:lognot (logical:ash 1 index))))) +;;(define copy-bit logical:copy-bit) +;;(define logical:ash ash) +;;(define logical:logcount logcount) +;;(define logical:integer-length integer-length) +(define (logical:bit-field n start end) + (logical:logand (- (logical:integer-expt 2 (- end start)) 1) + (logical:ash n (- start)))) +;;(define bit-field logical:bit-field) +(define (bitwise-if mask n0 n1) + (logical:logior (logical:logand mask n0) + (logical:logand (logical:lognot mask) n1))) +(define logical:bitwise-if bitwise-if) +;;(define logical:bit-extract bit-extract) +(define (copy-bit-field to start end from) + (logical:bitwise-if + (logical:ash (- (logical:integer-expt 2 (- end start)) 1) start) + (logical:ash from start) + to)) +;;(define copy-bit-field logical:copy-bit-field) +(define logical:integer-expt integer-expt) +;;(define logical:ipow-by-squaring ipow-by-squaring) + +;;guile> (expt 2 -1) +;;ERROR: In procedure integer-expt: +;;ERROR: Argument out of range: -1 +;;ABORT: (out-of-range) +(define expt + (let ((integer-expt integer-expt)) + (lambda (z1 z2) + (cond ((zero? z1) (if (zero? z2) 1 0)) + ((and (exact? z2) (not (negative? z2))) + (integer-expt z1 z2)) + ((and (real? z2) (real? z1) (>= z1 0)) + ($expt z1 z2)) + (else + (exp (* z2 (log z1)))))))) + +;;; array-for-each +(define (array-indexes ra) + (let ((ra0 (apply create-array '#() (array-shape ra)))) + (array-index-map! ra0 list) + ra0)) +(define (array-copy! source dest) + (array-map! dest identity source)) +(define (array-null? array) + (zero? (apply * (map (lambda (bnd) (- 1 (apply - bnd))) + (array-shape array))))) +(define (create-array prot . args) + (if (array-null? prot) + (dimensions->uniform-array args (array-prototype prot)) + (dimensions->uniform-array args (array-prototype prot) + (apply array-ref prot + (map car (array-shape prot)))))) +(define (make-uniform-wrapper prot) + (if (string? prot) (set! prot (string->number prot))) + (if prot + (lambda opt (if (null? opt) + (list->uniform-array 1 prot '()) + (list->uniform-array 1 prot opt))) + vector)) +(define ac64 (make-uniform-wrapper "+i")) +(define ac32 ac64) +(define ar64 (make-uniform-wrapper "1/3")) +(define ar32 (make-uniform-wrapper "1.")) +(define as64 vector) +(define as32 (make-uniform-wrapper -32)) +(define as16 as32) +(define as8 as32) +(define au64 vector) +(define au32 (make-uniform-wrapper 32)) +(define au16 au32) +(define au8 au32) +(define at1 (make-uniform-wrapper #t)) + +;;; {Random numbers} +(define (make-random-state . args) + (let ((seed (if (null? args) *random-state* (car args)))) + (cond ((string? seed)) + ((number? seed) (set! seed (number->string seed))) + (else (let () + (require 'object->string) + (set! seed (object->limited-string seed 50))))) + (seed->random-state seed))) + +;;; Support for older versions of Scheme. Not enough code for its own file. +;;(define (last-pair l) (if (pair? (cdr l)) (last-pair (cdr l)) l)) + +;;; Guile has nil and t as self-sets +;;(define t #t) +;;(define nil #f) + +;;; Define these if your implementation's syntax can support it and if +;;; they are not already defined. + +;;(define (1+ n) (+ n 1)) +;;(define (-1+ n) (+ n -1)) +;;(define 1- -1+) + +(slib:load (in-vicinity (library-vicinity) "require")) diff --git a/http-cgi.scm b/http-cgi.scm index 517e312..097da06 100644 --- a/http-cgi.scm +++ b/http-cgi.scm @@ -47,7 +47,7 @@ (set! http:crlf (string (string-ref line 0) #\newline))) (if (eof-object? line) line alist)) (let ((len (string-length line)) - (idx (string-index line #\:))) + (idx (strsrch:string-index line #\:))) (if (char-whitespace? (string-ref line (+ -1 len))) (set! len (+ -1 len))) (and idx (do ((idx2 (+ idx 1) (+ idx2 1))) @@ -68,9 +68,9 @@ (let* ((request-uri (cadr request-line)) (len (string-length request-uri))) (and (> len 3) - (string-index request-uri #\?) + (strsrch:string-index request-uri #\?) (substring request-uri - (+ 1 (string-index request-uri #\?)) + (+ 1 (strsrch:string-index request-uri #\?)) (if (eqv? #\/ (string-ref request-uri (+ -1 len))) (+ -1 len) len))))) diff --git a/mklibcat.scm b/mklibcat.scm index e6a0321..d41e2e6 100644 --- a/mklibcat.scm +++ b/mklibcat.scm @@ -87,7 +87,7 @@ (common-list-functions "comlist") (tree "tree") (coerce "coerce") - ;;(format "format") + (format "format") (generic-write "genwrite") (pretty-print "pp") (pprint-file "ppfile") diff --git a/schmooz.scm b/schmooz.scm index f50a397..7bcab97 100644 --- a/schmooz.scm +++ b/schmooz.scm @@ -358,6 +358,39 @@ ((not (and (char? chr) (not (char-whitespace? chr)))) str) (read-char port))) +;;; Output files would be schmoozed +(define schmooz-which-files + (let* ((scheme-file? (filename:match-ci?? "*??scm")) + (txi-file? (filename:match-ci?? "*??txi")) + (texi-file? (let ((tex? (filename:match-ci?? "*??tex")) + (texi? (filename:match-ci?? "*??texi"))) + (lambda (filename) (or (txi-file? filename) + (tex? filename) + (texi? filename))))) + (txi->scm (filename:substitute?? "*txi" "*scm")) + (scm->txi (filename:substitute?? "*scm" "*txi"))) + (define (schmooz-texi-file file) + (call-with-input-file file + (lambda (port) + (do ((pos (find-string-from-port? "@include" port) + (find-string-from-port? "@include" port))) + ((not pos)) + (let ((fname #f)) + (cond ((not (eqv? 1 (fscanf port " %s" fname)))) + ((not (txi-file? fname))) + ((not (file-exists? (txi->scm fname)))) + (else (display (txi->scm fname)) (display " ")))))))) + (lambda files + (for-each (lambda (file) + (define sl (string-length file)) + (cond ((texi-file? file) (schmooz-texi-file file)) + ((scheme-file? file) + (schmooz-scm-file file (scm->txi file))) + (else (schmooz-scm-file + file (string-append file ".txi"))))) + files)))) + + ;;;@ SCHMOOZ files. (define schmooz (let* ((scheme-file? (filename:match-ci?? "*??scm")) diff --git a/slib.html b/slib.html new file mode 100644 index 0000000..b580540 --- /dev/null +++ b/slib.html @@ -0,0 +1,76 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: SLIB</TITLE> + +<META NAME="description" CONTENT="SLIB: SLIB"> +<META NAME="keywords" CONTENT="SLIB: SLIB"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC_Top"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1>SLIB</H1> + +<P> + +<BLOCKQUOTE> +</BLOCKQUOTE> +<P> +</P> +<P> + +<EM>SLIB</EM> is a portable library for the programming language +<EM>Scheme</EM>. It provides a platform independent framework for using +<EM>packages</EM> of Scheme procedures and syntax. As distributed, SLIB +contains useful packages for all Scheme implementations. Its catalog +can be transparently extended to accomodate packages specific to a site, +implementation, user, or directory. +</P> +<P> + +</P> +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC1">1. The Library System</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">How to use and customize.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC13">2. Universal SLIB Procedures</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Provided for all implementations.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC21">3. Scheme Syntax Extension Packages</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC45">4. Textual Conversion Packages</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC88">5. Mathematical Packages</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC140">6. Database Packages</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC183">7. Other Packages</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC277">8. About SLIB</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Install, etc.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_9.html#SEC292">Procedure and Macro Index</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<HR SIZE=1> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_1.html b/slib_1.html new file mode 100644 index 0000000..452374a --- /dev/null +++ b/slib_1.html @@ -0,0 +1,1172 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: The Library System</TITLE> + +<META NAME="description" CONTENT="SLIB: The Library System"> +<META NAME="keywords" CONTENT="SLIB: The Library System"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC1"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC2"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<A NAME="The Library System"></A> +<H1> 1. The Library System </H1> +<!--docid::SEC1::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">SLIB names.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC3">1.2 Require</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC7">1.6 Compiling Scheme</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Feature"></A> +<HR SIZE="6"> +<A NAME="SEC2"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC3"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 1.1 Feature </H2> +<!--docid::SEC2::--> +<P> + +<A NAME="IDX1"></A> +SLIB denotes <EM>features</EM> by symbols. SLIB maintains a list of +features supported by a Scheme <EM>session</EM>. The set of features +<A NAME="IDX2"></A> +provided by a session may change during that session. Some features +are properties of the Scheme implementation being used. The following +<A NAME="IDX3"></A> +<EM>intrinsic feature</EM>s detail what sort of numbers are available +from an implementation: +</P> +<P> + +<UL> +<LI> +'inexact +<LI> +'rational +<LI> +'real +<LI> +'complex +<LI> +'bignum +</UL> +<P> + +SLIB initialization (in `<TT>require.scm</TT>') tests and <EM>provide</EM>s +any of these numeric features which are appropriate. +</P> +<P> + +Other features correspond to the presence of packages of Scheme +procedures or syntax (macros). +</P> +<P> + +<A NAME="IDX4"></A> +</P> +<DL> +<DT><U>Function:</U> <B>provided?</B> <I>feature</I> +<DD>Returns <CODE>#t</CODE> if <VAR>feature</VAR> is present in the current Scheme +session; otherwise <CODE>#f</CODE>. More specifically, <CODE>provided?</CODE> +returns <CODE>#t</CODE> if the symbol <VAR>feature</VAR> is the +<CODE>software-type</CODE> or if <VAR>feature</VAR> has been provided by a module +already loaded; and <CODE>#f</CODE> otherwise. +<P> + +In some implementations <CODE>provided?</CODE> tests whether a module has +been <CODE>require</CODE>d by any module or in any thread; other +implementations will have <CODE>provided?</CODE> reflect only the modules +<CODE>require</CODE>d by that particular session or thread. +</P> +<P> + +To work portably in both scenarios, use <CODE>provided?</CODE> only to test +whether intrinsic properties (like those above) are present. +</P> +<P> + +The <VAR>feature</VAR> argument can also be an expression calling +<CODE>and</CODE>, <CODE>or</CODE>, and <CODE>not</CODE> of features. The boolean result +of the logical question asked by <VAR>feature</VAR> is returned. +</P> +</DL> +<P> + +The generalization of <CODE>provided?</CODE> for arbitrary features and catalog +is <CODE>feature-eval</CODE>: +</P> +<P> + +<A NAME="IDX5"></A> +</P> +<DL> +<DT><U>Function:</U> <B>feature-eval</B> <I>expression provided?</I> +<DD>Evaluates <CODE>and</CODE>, <CODE>or</CODE>, and <CODE>not</CODE> forms in +<VAR>expression</VAR>, using the values returned by calling <VAR>provided?</VAR> +on the leaf symbols. <CODE>feature-eval</CODE> returns the boolean result +of the logical combinations. +</DL> +<P> + +<A NAME="IDX6"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>provide</B> <I>feature</I> +<DD>Informs SLIB that <VAR>feature</VAR> is supported in this session. +</DL> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(provided? 'foo) => #f +(provide 'foo) +(provided? 'foo) => #t +</pre></td></tr></table><P> + +<A NAME="Require"></A> +<HR SIZE="6"> +<A NAME="SEC3"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC2"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC4"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 1.2 Require </H2> +<!--docid::SEC3::--> +<P> + +<A NAME="IDX7"></A> +SLIB creates and maintains a <EM>catalog</EM> mapping features to locations +of files introducing procedures and syntax denoted by those features. +</P> +<P> + +<A NAME="IDX8"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>*catalog*</B> +<DD>Is an association list of features (symbols) and pathnames which will +supply those features. The pathname can be either a string or a pair. +If pathname is a pair then the first element should be a macro feature +symbol, <CODE>source</CODE>, <CODE>compiled</CODE>, or one of the other cases +described in <A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A>. The cdr of the pathname should +be either a string or a list. +</DL> +<P> + +At the beginning of each section of this manual, there is a line like +<CODE>(require '<VAR>feature</VAR>)</CODE>. +<A NAME="IDX9"></A> +The Scheme files comprising SLIB are cataloged so that these feature +names map to the corresponding files. +</P> +<P> + +SLIB provides a form, <CODE>require</CODE>, which loads the files providing +the requested feature. +</P> +<P> + +<A NAME="IDX10"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>require</B> <I>feature</I> +<DD><UL> +<LI> +If <CODE>(provided? <VAR>feature</VAR>)</CODE> is true, +then <CODE>require</CODE> just returns. +<LI> +Otherwise, if <VAR>feature</VAR> is found in the catalog, then the +corresponding files will be loaded and <CODE>(provided? +<VAR>feature</VAR>)</CODE> will henceforth return <CODE>#t</CODE>. That <VAR>feature</VAR> +is thereafter <CODE>provided</CODE>. +<LI> +Otherwise (<VAR>feature</VAR> not found in the catalog), an error is +signaled. +</UL> +</DL> +<P> + +There is a related form <CODE>require-if</CODE>, used primarily for enabling +compilers to statically include modules which would be dynamically +loaded by interpreters. +</P> +<P> + +<A NAME="IDX11"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>require-if</B> <I>condition feature</I> +<DD><P> + +Requires <VAR>feature</VAR> if <VAR>condition</VAR> is true. +</P> +</DL> +<P> + +The <CODE>random</CODE> module uses <CODE>require-if</CODE> to flag +<CODE>object->string</CODE> as a (dynamic) required module. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'byte) +(require 'logical) +(require-if 'compiling 'object->string) +</pre></td></tr></table><P> + +The <CODE>batch</CODE> module uses <CODE>require-if</CODE> to flag +<CODE>posix-time</CODE> as a module to load if the implementation supports +large precision exact integers. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require-if '(and bignum compiling) 'posix-time) +</pre></td></tr></table><P> + +The <CODE>commutative-ring</CODE> module uses <CODE>require-if</CODE> to ensure +that it has an exponentiation routine, regardless of whether the +implementation supports inexact numbers: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require-if '(not inexact) 'logical) ;for integer-expt +(define number^ (if (provided? 'inexact) expt integer-expt)) +</pre></td></tr></table><P> + +The catalog can also be queried using <CODE>slib:in-catalog?</CODE>. +</P> +<P> + +<A NAME="IDX12"></A> +</P> +<DL> +<DT><U>Function:</U> <B>slib:in-catalog?</B> <I>feature</I> +<DD>Returns a <CODE>CDR</CODE> of the catalog entry if one was found for the +symbol <VAR>feature</VAR> in the alist <CODE>*catalog*</CODE> (and transitively +through any symbol aliases encountered). Otherwise, returns +<CODE>#f</CODE>. The format of catalog entries is explained in <A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A>. +</DL> +<P> + +<A NAME="Library Catalogs"></A> +<HR SIZE="6"> +<A NAME="SEC4"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC3"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC5"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 1.3 Library Catalogs </H2> +<!--docid::SEC4::--> +<P> + +Catalog files consist of one or more <EM>association list</EM>s. +<A NAME="IDX13"></A> +In the circumstance where a feature symbol appears in more than one +list, the latter list's association is retrieved. Here are the +supported formats for elements of catalog lists: +</P> +<P> + +</P> +<DL COMPACT> +<DT><CODE>(<VAR>feature</VAR> . <I><symbol></I>)</CODE> +<DD>Redirects to the feature named <I><symbol></I>. +<DT><CODE>(<VAR>feature</VAR> . "<I><path></I>")</CODE> +<DD>Loads file <I><path></I>. +<DT><CODE>(<VAR>feature</VAR> source "<I><path>"</I>)</CODE> +<DD><A NAME="IDX14"></A> +<CODE>slib:load</CODE>s the Scheme source file <I><path></I>. +<DT><CODE>(<VAR>feature</VAR> compiled "<I><path>"</I> <small>...</small>)</CODE> +<DD><A NAME="IDX15"></A> +<CODE>slib:load-compiled</CODE>s the files <I><path></I> <small>...</small>. +<DT><CODE>(<VAR>feature</VAR> aggregate <I><symbol></I> <small>...</small>)</CODE> +<DD><A NAME="IDX16"></A> +<CODE>slib:require</CODE>s the features <I><symbol></I> <small>...</small>. +</DL> +<P> + +The various macro styles first <CODE>require</CODE> the named macro package, +then just load <I><path></I> or load-and-macro-expand <I><path></I> as +appropriate for the implementation. +</P> +<P> + +</P> +<DL COMPACT> +<DT><CODE>(<VAR>feature</VAR> defmacro "<I><path>"</I>)</CODE> +<DD><A NAME="IDX17"></A> +<CODE>defmacro:load</CODE>s the Scheme source file <I><path></I>. +<DT><CODE>(<VAR>feature</VAR> macro-by-example "<I><path>"</I>)</CODE> +<DD><A NAME="IDX18"></A> +<CODE>defmacro:load</CODE>s the Scheme source file <I><path></I>. +</DL> +<P> + +</P> +<DL COMPACT> +<DT><CODE>(<VAR>feature</VAR> macro "<I><path>"</I>)</CODE> +<DD><A NAME="IDX19"></A> +<CODE>macro:load</CODE>s the Scheme source file <I><path></I>. +<DT><CODE>(<VAR>feature</VAR> macros-that-work "<I><path>"</I>)</CODE> +<DD><A NAME="IDX20"></A> +<CODE>macro:load</CODE>s the Scheme source file <I><path></I>. +<DT><CODE>(<VAR>feature</VAR> syntax-case "<I><path>"</I>)</CODE> +<DD><A NAME="IDX21"></A> +<CODE>macro:load</CODE>s the Scheme source file <I><path></I>. +<DT><CODE>(<VAR>feature</VAR> syntactic-closures "<I><path>"</I>)</CODE> +<DD><A NAME="IDX22"></A> +<CODE>macro:load</CODE>s the Scheme source file <I><path></I>. +</DL> +<P> + +<A NAME="Catalog Creation"></A> +<HR SIZE="6"> +<A NAME="SEC5"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC4"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC6"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 1.4 Catalog Creation </H2> +<!--docid::SEC5::--> +<P> + +At the start of an interactive session no catalog is present, but is +created with the first catalog inquiry (such as <CODE>(require +'random)</CODE>). Several sources of catalog information are combined to +produce the catalog: +</P> +<P> + +<UL> +<LI> +standard SLIB packages. +<LI> +additional packages of interest to this site. +<LI> +packages specifically for the variety of Scheme which this +session is running. +<LI> +packages this user wants to always have available. This catalog is the +file `<TT>homecat</TT>' in the user's <EM>HOME</EM> directory. +<A NAME="IDX23"></A> +<LI> +packages germane to working in this (current working) directory. This +catalog is the file `<TT>usercat</TT>' in the directory to which it applies. +One would typically <CODE>cd</CODE> to this directory before starting the +Scheme session. +<LI> +packages which are part of an application program. +</UL> +<P> + +SLIB combines the catalog information which doesn't vary per user into +the file `<TT>slibcat</TT>' in the implementation-vicinity. Therefore +`<TT>slibcat</TT>' needs change only when new software is installed or +compiled. Because the actual pathnames of files can differ from +installation to installation, SLIB builds a separate catalog for each +implementation it is used with. +</P> +<P> + +The definition of <CODE>*SLIB-VERSION*</CODE> in SLIB file +`<TT>require.scm</TT>' is checked against the catalog association of +<CODE>*SLIB-VERSION*</CODE> to ascertain when versions have changed. It is +a reasonable practice to change the definition of +<CODE>*SLIB-VERSION*</CODE> whenever the library is changed. If multiple +implementations of Scheme use SLIB, remember that recompiling one +`<TT>slibcat</TT>' will update only that implementation's catalog. +</P> +<P> + +The compilation scripts of Scheme implementations which work with SLIB +can automatically trigger catalog compilation by deleting +`<TT>slibcat</TT>' or by invoking <CODE>require</CODE> of a special feature: +</P> +<P> + +<A NAME="IDX24"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>require</B> <I>'new-catalog</I> +<DD><A NAME="IDX25"></A> +This will load `<TT>mklibcat</TT>', which compiles and writes a new +`<TT>slibcat</TT>'. +</DL> +<P> + +Another special feature of <CODE>require</CODE> erases SLIB's catalog, +forcing it to be reloaded the next time the catalog is queried. +</P> +<P> + +<A NAME="IDX26"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>require</B> <I>#f</I> +<DD>Removes SLIB's catalog information. This should be done before saving +an executable image so that, when restored, its catalog will be loaded +afresh. +</DL> +<P> + +<A NAME="Catalog Vicinities"></A> +<HR SIZE="6"> +<A NAME="SEC6"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC5"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 1.5 Catalog Vicinities </H2> +<!--docid::SEC6::--> +<P> + +Each file in the table below is descibed in terms of its +file-system independent <EM>vicinity</EM> (see section <A HREF="slib_2.html#SEC14">2.1 Vicinity</A>). The entries +of a catalog in the table override those of catalogs above it in the +table. +</P> +<P> + +</P> +<DL COMPACT> + +<DT><CODE>implementation-vicinity</CODE> `<TT>slibcat</TT>' +<DD><A NAME="IDX27"></A> +This file contains the associations for the packages comprising SLIB, +the `<TT>implcat</TT>' and the `<TT>sitecat</TT>'s. The associations in the +other catalogs override those of the standard catalog. +<P> + +</P> +<DT><CODE>library-vicinity</CODE> `<TT>mklibcat.scm</TT>' +<DD><A NAME="IDX28"></A> +creates `<TT>slibcat</TT>'. +<P> + +</P> +<DT><CODE>library-vicinity</CODE> `<TT>sitecat</TT>' +<DD><A NAME="IDX29"></A> +This file contains the associations specific to an SLIB installation. +<P> + +</P> +<DT><CODE>implementation-vicinity</CODE> `<TT>implcat</TT>' +<DD><A NAME="IDX30"></A> +This file contains the associations specific to an implementation of +Scheme. Different implementations of Scheme should have different +<CODE>implementation-vicinity</CODE>. +<P> + +</P> +<DT><CODE>implementation-vicinity</CODE> `<TT>mkimpcat.scm</TT>' +<DD><A NAME="IDX31"></A> +if present, creates `<TT>implcat</TT>'. +<P> + +</P> +<DT><CODE>implementation-vicinity</CODE> `<TT>sitecat</TT>' +<DD><A NAME="IDX32"></A> +This file contains the associations specific to a Scheme implementation +installation. +<P> + +</P> +<DT><CODE>home-vicinity</CODE> `<TT>homecat</TT>' +<DD><A NAME="IDX33"></A> +This file contains the associations specific to an SLIB user. +<P> + +</P> +<DT><CODE>user-vicinity</CODE> `<TT>usercat</TT>' +<DD><A NAME="IDX34"></A> +This file contains associations affecting only those sessions whose +<EM>working directory</EM> is <CODE>user-vicinity</CODE>. +<P> + +</DL> +<P> + +Here is an example of a `<TT>usercat</TT>' catalog. A program in this +directory can invoke the `<SAMP>run</SAMP>' feature with <CODE>(require 'run)</CODE>. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>;;; "usercat": SLIB catalog additions for SIMSYNCH. -*-scheme-*- +( + (simsynch . "../synch/simsynch.scm") + (run . "../synch/run.scm") + (schlep . "schlep.scm") +) +</pre></td></tr></table><P> + +Copying `<TT>usercat</TT>' to many directories is inconvenient. +Application programs which aren't always run in specially prepared +directories can nonetheless register their features during +initialization. +</P> +<P> + +<A NAME="IDX35"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>catalog:read</B> <I>vicinity catalog</I> +<DD>Reads file named by string <VAR>catalog</VAR> in <VAR>vicinity</VAR>, resolving +all paths relative to <VAR>vicinity</VAR>, and adds those feature +associations to <VAR>*catalog*</VAR>. +<P> + +<CODE>catalog:read</CODE> would typically be used by an application program +having dynamically loadable modules. For instance, to register +factoring and other modules in <VAR>*catalog*</VAR>, JACAL does: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(catalog:read (program-vicinity) "jacalcat") +</pre></td></tr></table><P> + +</P> +</DL> +<P> + +For an application program there are three appropriate venues for +registering its catalog associations: +</P> +<P> + +<UL> +<LI> +in a `<TT>usercat</TT>' file in the directory where the program runs; or +<LI> +in an `<TT>implcat</TT>' file in the <CODE>implementation-vicinity</CODE>; or +<LI> +in an application program directory; loaded by calling +<CODE>catalog:read</CODE>. +</UL> +<P> + +<A NAME="Compiling Scheme"></A> +<HR SIZE="6"> +<A NAME="SEC7"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC6"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC8"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 1.6 Compiling Scheme </H2> +<!--docid::SEC7::--> +<P> + +To use Scheme compilers effectively with SLIB the compiler needs to +know which SLIB modules are to be compiled and which symbols are +exported from those modules. +</P> +<P> + +The procedures in this section automate the extraction of this +information from SLIB modules. They are guaranteed to work on SLIB +modules; to use them on other sources, those sources should follow +SLIB conventions. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC8">1.6.1 Module Conventions</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC10">1.6.3 Module Semantics</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_1.html#SEC12">1.6.5 Module Analysis</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Module Conventions"></A> +<HR SIZE="6"> +<A NAME="SEC8"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC9"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 1.6.1 Module Conventions </H3> +<!--docid::SEC8::--> +<P> + +<UL> +<LI> +All the top-level <CODE>require</CODE> commands have one quoted argument and +are positioned before other Scheme definitions and expressions in the +file. +<LI> +Any conditionally <CODE>require</CODE>d SLIB modules +<A NAME="DOCF1" HREF="slib_fot.html#FOOT1">(1)</A> +also appear at the beginning of their files conditioned on the feature +<A NAME="IDX36"></A> +<CODE>compiling</CODE> using <CODE>require-if</CODE> +(see section <A HREF="slib_1.html#SEC3">require-if</A>). +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'logical) +(require 'multiarg/and-) +(require-if 'compiling 'sort) +(require-if 'compiling 'ciexyz) +</pre></td></tr></table><P> + +</P> +<LI> +Schmooz-style comments preceding a definition, identify that +definition as an exported identifier (see section <A HREF="slib_4.html#SEC87">4.14 Schmooz</A>). For +non-schmooz files, putting `<SAMP>;@</SAMP>' at the beginning of the line +immediately preceding the definition (<CODE>define</CODE>, +<CODE>define-syntax</CODE>, or <CODE>defmacro</CODE>) suffices. +<P> + +<TABLE><tr><td> </td><td class=example><pre>;@ +(define (make-vicinity <pathname>) <pathname>) +</pre></td></tr></table><P> + +</P> +<LI> +Syntax (macro) definitions are grouped at the end of a module file. +<P> + +</P> +<LI> +Modules defining macros do not invoke those macros. SLIB macro +implementations are exempt from this rule. +<P> + +An example of how to expand macro invocations is: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'macros-that-work) +(require 'yasos) +(require 'pprint-file) +(pprint-filter-file "collect.scm" macwork:expand) +</pre></td></tr></table><P> + +</UL> +<P> + +<A NAME="Module Manifests"></A> +<HR SIZE="6"> +<A NAME="SEC9"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC8"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC10"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 1.6.2 Module Manifests </H3> +<!--docid::SEC9::--> +<P> + +<CODE>(require 'manifest)</CODE> +<A NAME="IDX37"></A> +</P> +<P> + +In some of these examples, <VAR>slib:catalog</VAR> is the SLIB part of +the catalog; it is free of compiled and implementation-specific +entries. It would be defined by: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define slib:catalog (cdr (member (assq 'null *catalog*) *catalog*))) +</pre></td></tr></table><P> + +<A NAME="IDX38"></A> +</P> +<DL> +<DT><U>Function:</U> <B>file->requires</B> <I>file provided? catalog</I> +<DD><P> + +Returns a list of the features <CODE>require</CODE>d by <VAR>file</VAR> assuming the +predicate <VAR>provided?</VAR> and association-list <VAR>catalog</VAR>. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(define (provided+? . features) + (lambda (feature) + (or (memq feature features) (provided? feature)))) + +(file->requires "obj2str.scm" (provided+? 'compiling) '()) + => (string-port generic-write) + +(file->requires "obj2str.scm" provided? '()) + => (string-port) +</pre></td></tr></table><P> + +<A NAME="IDX39"></A> +</P> +<DL> +<DT><U>Function:</U> <B>feature->requires</B> <I>feature provided? catalog</I> +<DD><P> + +Returns a list of the features <CODE>require</CODE>d by <VAR>feature</VAR> assuming the +predicate <VAR>provided?</VAR> and association-list <VAR>catalog</VAR>. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(feature->requires 'batch (provided+? 'compiling) *catalog*) + => (tree line-i/o databases parameters string-port + pretty-print common-list-functions posix-time) + +(feature->requires 'batch provided? *catalog*) + => (tree line-i/o databases parameters string-port + pretty-print common-list-functions) + +(feature->requires 'batch provided? '((batch . "batch"))) + => (tree line-i/o databases parameters string-port + pretty-print common-list-functions) +</pre></td></tr></table><P> + +<A NAME="IDX40"></A> +</P> +<DL> +<DT><U>Function:</U> <B>file->loads</B> <I>file</I> +<DD><P> + +Returns a list of strings naming existing files loaded (load +slib:load slib:load-source macro:load defmacro:load syncase:load +synclo:load macwork:load) by <VAR>file</VAR> or any of the files it loads. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(file->loads (in-vicinity (library-vicinity) "scainit.scm")) + => ("/usr/local/lib/slib/scaexpp.scm" + "/usr/local/lib/slib/scaglob.scm" + "/usr/local/lib/slib/scaoutp.scm") +</pre></td></tr></table><P> + +<A NAME="IDX41"></A> +</P> +<DL> +<DT><U>Function:</U> <B>load->path</B> <I>exp</I> +<DD><P> + +Given a <CODE>(load '<expr>)</CODE>, where <expr> is a string or vicinity +stuff), <CODE>(load->path <expr>)</CODE> figures a path to the file. +<CODE>load->path</CODE> returns that path if it names an existing file; otherwise #f. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(load->path '(in-vicinity (library-vicinity) "mklibcat")) + => "/usr/local/lib/slib/mklibcat.scm" +</pre></td></tr></table><P> + +<A NAME="IDX42"></A> +</P> +<DL> +<DT><U>Function:</U> <B>file->definitions</B> <I>file</I> +<DD><P> + +Returns a list of the identifier symbols defined by SLIB (or +SLIB-style) file <VAR>file</VAR>. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(file->definitions "random.scm") + => (*random-state* make-random-state + seed->random-state copy-random-state random + random:chunk) +</pre></td></tr></table><P> + +<A NAME="IDX43"></A> +</P> +<DL> +<DT><U>Function:</U> <B>file->exports</B> <I>file</I> +<DD><P> + +Returns a list of the identifier symbols exported (advertised) by +SLIB (or SLIB-style) file <VAR>file</VAR>. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(file->exports "random.scm") + => (make-random-state seed->random-state + copy-random-state random) + +(file->exports "randinex.scm") + => (random:solid-sphere! random:hollow-sphere! + random:normal-vector! random:normal + random:exp random:uniform) +</pre></td></tr></table><P> + +<A NAME="IDX44"></A> +</P> +<DL> +<DT><U>Function:</U> <B>feature->export-alist</B> <I>feature catalog</I> +<DD><P> + +Returns a list of lists; each sublist holding the name of the file +implementing <VAR>feature</VAR>, and the identifier symbols exported (advertised) by +SLIB (or SLIB-style) feature <VAR>feature</VAR>, in <VAR>catalog</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX45"></A> +</P> +<DL> +<DT><U>Function:</U> <B>feature->exports</B> <I>feature catalog</I> +<DD><P> + +Returns a list of all exports of <VAR>feature</VAR>. +</P> +</DL> +In the case of <CODE>aggregate</CODE> features, more than one file may +have export lists to report: +<P> + +<TABLE><tr><td> </td><td class=example><pre>(feature->export-alist 'r5rs slib:catalog)) + => (("/usr/local/lib/slib/values.scm" + call-with-values values) + ("/usr/local/lib/slib/mbe.scm" + define-syntax macro:expand + macro:load macro:eval) + ("/usr/local/lib/slib/eval.scm" + eval scheme-report-environment + null-environment interaction-environment)) + +(feature->export-alist 'stdio *catalog*) + => (("/usr/local/lib/slib/scanf.scm" + fscanf sscanf scanf scanf-read-list) + ("/usr/local/lib/slib/printf.scm" + sprintf printf fprintf) + ("/usr/local/lib/slib/stdio.scm" + stderr stdout stdin)) + +(feature->exports 'stdio slib:catalog) + => (fscanf sscanf scanf scanf-read-list + sprintf printf fprintf stderr stdout stdin) +</pre></td></tr></table><P> + +<A NAME="Module Semantics"></A> +<HR SIZE="6"> +<A NAME="SEC10"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC9"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC11"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 1.6.3 Module Semantics </H3> +<!--docid::SEC10::--> +<P> + +For the purpose of compiling Scheme code, each top-level +<CODE>require</CODE> makes the identifiers exported by its feature's module +<CODE>defined</CODE> (or defmacroed or defined-syntaxed) within the file +(being compiled) headed with those requires. +</P> +<P> + +Top-level occurrences of <CODE>require-if</CODE> make defined the exports +from the module named by the second argument <EM>if</EM> the +<VAR>feature-expression</VAR> first argument is true in the target +environment. The target feature <CODE>compiling</CODE> should be provided +during this phase of compilation. +</P> +<P> + +Non-top-level SLIB occurences of <CODE>require</CODE> and <CODE>require-if</CODE> +of quoted features can be ignored by compilers. The SLIB modules will +all have top-level constructs for those features. +</P> +<P> + +<A NAME="IDX46"></A> +Note that aggregate catalog entries import more than one module. +Implementations of <CODE>require</CODE> may or may <EM>not</EM> be transitive; +code which uses module exports without requiring the providing module +is in error. +</P> +<P> + +In the SLIB modules <CODE>modular</CODE>, <CODE>batch</CODE>, <CODE>hash</CODE>, +<CODE>common-lisp-time</CODE>, <CODE>commutative-ring</CODE>, <CODE>charplot</CODE>, +<CODE>logical</CODE>, <CODE>common-list-functions</CODE>, <CODE>coerce</CODE> and +<CODE>break</CODE> there is code conditional on features being +<CODE>provided?</CODE>. Most are testing for the presence of features which +are intrinsic to implementations (inexacts, bignums, ...). +</P> +<P> + +In all cases these <CODE>provided?</CODE> tests can be evaluated at +compile-time using <CODE>feature-eval</CODE> +(see section <A HREF="slib_1.html#SEC2">feature-eval</A>). The simplest way to compile these +constructs may be to treat <CODE>provided?</CODE> as a macro. +</P> +<P> + +<A NAME="Top-level Variable References"></A> +<HR SIZE="6"> +<A NAME="SEC11"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC10"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC12"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 1.6.4 Top-level Variable References </H3> +<!--docid::SEC11::--> +<P> + +<CODE>(require 'top-refs)</CODE> +<A NAME="IDX47"></A> +<A NAME="IDX48"></A> +<A NAME="IDX49"></A> +</P> +<P> + +These procedures complement those in <A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A> by +finding the top-level variable references in Scheme source code. +They work by traversing expressions and definitions, keeping track +of bindings encountered. It is certainly possible to foil these +functions, but they return useful information about SLIB source +code. +</P> +<P> + +<A NAME="IDX50"></A> +</P> +<DL> +<DT><U>Function:</U> <B>top-refs</B> <I>obj</I> +<DD><P> + +Returns a list of the top-level variables referenced by the Scheme +expression <VAR>obj</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX51"></A> +</P> +<DL> +<DT><U>Function:</U> <B>top-refs<-file</B> <I>filename</I> +<DD><P> + +<VAR>filename</VAR> should be a string naming an existing file containing Scheme +source code. <CODE>top-refs<-file</CODE> returns a list of the top-level variable references +made by expressions in the file named by <VAR>filename</VAR>. +</P> +<P> + +Code in modules which <VAR>filename</VAR> <CODE>require</CODE>s is not traversed. Code in +files loaded from top-level <EM>is</EM> traversed if the expression +argument to <CODE>load</CODE>, <CODE>slib:load</CODE>, <CODE>slib:load-source</CODE>, +<CODE>macro:load</CODE>, <CODE>defmacro:load</CODE>, <CODE>synclo:load</CODE>, +<CODE>syncase:load</CODE>, or <CODE>macwork:load</CODE> is a literal string +constant or composed of combinations of vicinity functions and +string literal constants; and the resulting file exists (possibly +with ".scm" appended). +</P> +</DL> +The following function parses an <EM>Info</EM> Index. +<A NAME="IDX52"></A> +<A NAME="DOCF2" HREF="slib_fot.html#FOOT2">(2)</A> +<P> + +<A NAME="IDX53"></A> +</P> +<DL> +<DT><U>Function:</U> <B>exports<-info-index</B> <I>file n <small>...</small></I> +<DD><P> + +<VAR>n</VAR> <small>...</small> must be an increasing series of positive integers. +<CODE>exports<-info-index</CODE> returns a list of all the identifiers appearing in the <VAR>n</VAR>th +<small>...</small> (info) indexes of <VAR>file</VAR>. The identifiers have the case that +the implementation's <CODE>read</CODE> uses for symbols. Identifiers +containing spaces (eg. <CODE>close-base on base-table</CODE>) are +<EM>not</EM> included. +</P> +<P> + +Each info index is headed by a `<SAMP>* Menu:</SAMP>' line. To list the +symbols in the first and third info indexes do: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(exports<-info-index "slib.info" 1 3) +</pre></td></tr></table></DL> +<P> + +<A NAME="Module Analysis"></A> +<HR SIZE="6"> +<A NAME="SEC12"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC11"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC7"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 1.6.5 Module Analysis </H3> +<!--docid::SEC12::--> +<P> + +<CODE>(require 'vet)</CODE> +<A NAME="IDX54"></A> +</P> +<P> + +<A NAME="IDX55"></A> +</P> +<DL> +<DT><U>Function:</U> <B>vet-slib</B> +<DD><P> + +Using the procedures in the <CODE>top-refs</CODE> and <CODE>manifest</CODE> +modules, <CODE>vet-slib</CODE> analyzes each SLIB module, reporting about any +procedure or macro defined whether it is: +</P> +<P> + +</P> +<DL COMPACT> + +<DT>orphaned +<DD>defined, not called, not exported; +<DT>missing +<DD>called, not defined, and not exported by its <CODE>require</CODE>d modules; +<DT>undocumented-export +<DD>Exported by module, but no index entry in `<TT>slib.info</TT>'; +<P> + +</DL> +<P> + +And for the library as a whole: +</P> +<P> + +</P> +<DL COMPACT> + +<DT>documented-unexport +<DD>Index entry in `<TT>slib.info</TT>', but no module exports it. +<P> + +</DL> +<P> + +This straightforward analysis caught three full days worth of +never-executed branches, transitive require assumptions, spelling +errors, undocumented procedures, missing procedures, and cyclic +dependencies in SLIB. +</P> +</DL> +<P> + +<A NAME="Universal SLIB Procedures"></A> +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_10.html b/slib_10.html new file mode 100644 index 0000000..6c9e1e5 --- /dev/null +++ b/slib_10.html @@ -0,0 +1,217 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Variable Index</TITLE> + +<META NAME="description" CONTENT="SLIB: Variable Index"> +<META NAME="keywords" CONTENT="SLIB: Variable Index"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC293"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_19.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1> Variable Index </H1> +<!--docid::SEC293::--> +<P> + +This is an alphabetical list of all the global variables in SLIB. +</P> +<P> + +</P> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_10.html#vr_*" style="text-decoration:none"><b>*</b></A> + +<BR> +<A HREF="slib_10.html#vr_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_10.html#vr_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_10.html#vr_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_10.html#vr_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_10.html#vr_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_10.html#vr_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_10.html#vr_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_10.html#vr_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_10.html#vr_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_10.html#vr_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_10.html#vr_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_10.html#vr_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_10.html#vr_U" style="text-decoration:none"><b>U</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_*"></A>*</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX231"><CODE>*argv*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1001"><CODE>*base-table-implementations*</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX8"><CODE>*catalog*</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX355"><CODE>*http:byline*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX273"><CODE>*operating-system*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX233"><CODE>*optarg*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX232"><CODE>*optind*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1563"><CODE>*qp-width*</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX538"><CODE>*random-state*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX901"><CODE>*ruleset*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX184"><CODE>*syn-defs*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX185"><CODE>*syn-ignore-whitespace*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX437"><CODE>*timezone*</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_A"></A>A</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX568"><CODE>atm-hec-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_B"></A>B</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX620"><CODE>bottomedge</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_C"></A>C</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX67"><CODE>char-code-limit</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX581"><CODE>charplot:dimensions</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX817"><CODE>CIEXYZ:A</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX818"><CODE>CIEXYZ:B</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX819"><CODE>CIEXYZ:C</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX816"><CODE>CIEXYZ:D50</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX815"><CODE>CIEXYZ:D65</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX820"><CODE>CIEXYZ:E</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX567"><CODE>crc-08-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX566"><CODE>crc-10-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX565"><CODE>crc-12-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX564"><CODE>crc-16-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX562"><CODE>crc-32-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX563"><CODE>crc-ccitt-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_D"></A>D</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX722"><CODE>D50</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC121">5.9.1.2 White</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX721"><CODE>D65</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC121">5.9.1.2 White</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX438"><CODE>daylight?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1585"><CODE>debug:max-count</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX906"><CODE>distribute*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX907"><CODE>distribute/</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX569"><CODE>dowcrc-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_G"></A>G</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX629"><CODE>graph:dimensions</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX611"><CODE>graphrect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_L"></A>L</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX621"><CODE>leftedge</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_M"></A>M</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX68"><CODE>most-positive-fixnum</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_N"></A>N</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX105"><CODE>nil</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC20">2.5.2 Legacy</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1063"><CODE>number-wt-type</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_P"></A>P</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX610"><CODE>plotrect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX526"><CODE>prime:prngs</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX528"><CODE>prime:trials</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_R"></A>R</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX622"><CODE>rightedge</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_S"></A>S</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX70"><CODE>slib:form-feed</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX69"><CODE>slib:tab</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX214"><CODE>stderr</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC55">4.3.1 stdio</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX212"><CODE>stdin</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC55">4.3.1 stdio</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX213"><CODE>stdout</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC55">4.3.1 stdio</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1064"><CODE>string-wt-type</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_T"></A>T</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX104"><CODE>t</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC20">2.5.2 Legacy</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX191"><CODE>tok:decimal-digits</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX193"><CODE>tok:lower-case</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX192"><CODE>tok:upper-case</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX194"><CODE>tok:whitespaces</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX619"><CODE>topedge</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX439"><CODE>tzname</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="vr_U"></A>U</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX570"><CODE>usb-token-polynomial</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_10.html#vr_*" style="text-decoration:none"><b>*</b></A> + +<BR> +<A HREF="slib_10.html#vr_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_10.html#vr_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_10.html#vr_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_10.html#vr_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_10.html#vr_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_10.html#vr_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_10.html#vr_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_10.html#vr_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_10.html#vr_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_10.html#vr_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_10.html#vr_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_10.html#vr_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_10.html#vr_U" style="text-decoration:none"><b>U</b></A> + +</td></tr></table><P> + +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_11.html b/slib_11.html new file mode 100644 index 0000000..e89cfe5 --- /dev/null +++ b/slib_11.html @@ -0,0 +1,268 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Concept and Feature Index</TITLE> + +<META NAME="description" CONTENT="SLIB: Concept and Feature Index"> +<META NAME="keywords" CONTENT="SLIB: Concept and Feature Index"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC294"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_10.html#SEC293"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_10.html#SEC293"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1> Concept and Feature Index </H1> +<!--docid::SEC294::--> +<P> + +</P> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_A"></A>A</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX16">aggregate</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX46">aggregate</A></TD><TD valign=top><A HREF="slib_1.html#SEC10">1.6.3 Module Semantics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1412">alarm</A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1413">alarm-interrupt</A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1143"><CODE>alist</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX994"><CODE>alist-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1002"><CODE>alist-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1034"><CODE>alist-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX405">ange-ftp</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX692">appearance</A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX699">appearance</A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1094"><CODE>array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1136"><CODE>array-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1145">association function</A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX296">attribute-value</A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX919">Auto-sharing</A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_B"></A>B</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1052">balanced binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX383">base</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX993">base-table</A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX271"><CODE>batch</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX292"><CODE>batch</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1166">binary</A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1167">binary</A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1053">binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1056">binary trees, as discrete maps</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1055">binary trees, as sets</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX172">binding power</A></TD><TD valign=top><A HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1570"><CODE>break</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1572"><CODE>break</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1151"><CODE>byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1153">byte</A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1183"><CODE>byte-number</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_C"></A>C</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX425">calendar time</A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX442">calendar time</A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX441"><CODE>Calendar-Time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX443">caltime</A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX847">canonical</A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX896">careful</A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX7">catalog</A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX13">Catalog File</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1621">certificate</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1622">certificate</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX352"><CODE>cgi</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1330"><CODE>chapter-order</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX580"><CODE>charplot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX583"><CODE>charplot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX749">Chroma</A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX773"><CODE>cie1931</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX771"><CODE>cie1964</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX775"><CODE>ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX725"><CODE>CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX575">cksum-string</A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1385"><CODE>coerce</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1216"><CODE>collect</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1227"><CODE>collect</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX855"><CODE>color-database</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX845"><CODE>color-names</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX241">command line</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX242">command line</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX180"><CODE>commentfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1228"><CODE>common-list-functions</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1285"><CODE>common-list-functions</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC208">7.2.1 Common List Functions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX894"><CODE>commutative-ring</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX15">compiled</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX36">compiling</A></TD><TD valign=top><A HREF="slib_1.html#SEC8">1.6.1 Module Conventions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX444"><CODE>Coordinated Universal Time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1650">copyright</A></TD><TD valign=top><A HREF="slib_8.html#SEC287">8.4 Copyrights</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX561"><CODE>crc</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX573"><CODE>crc</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1632"><CODE>cvs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_D"></A>D</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX977"><CODE>database-commands</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX290"><CODE>databases</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX918"><CODE>databases</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX975"><CODE>databases</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC158">6.1.4.3 Define-tables Example</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX978"><CODE>databases</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX868"><CODE>daylight</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX328"><CODE>db->html</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1564"><CODE>debug</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1565"><CODE>debug</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1573"><CODE>debug</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX17">defmacro</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX114"><CODE>defmacroexpand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC23">3.1.1 Defmacroexpand</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX423"><CODE>defmacroexpand</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX183"><CODE>delim</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1268">dequeues</A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX910"><CODE>determinant</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1375"><CODE>diff</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1609"><CODE>directory</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX559">Discrete Fourier Transform</A></TD><TD valign=top><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1058">discrete maps, using binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1645"><CODE>DrScheme</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1234"><CODE>dynamic</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1468"><CODE>dynamic-wind</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC245">7.4.10 Dynamic-Wind</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_E"></A>E</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX764"><CODE>e-sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1618">emacs</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1620">emacs</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX588">Encapsulated-PostScript</A></TD><TD valign=top><A HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX393">escaped</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX900">Euclidean Domain</A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1470"><CODE>eval</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX102">exchanger</A></TD><TD valign=top><A HREF="slib_2.html#SEC19">2.5.1 Mutual Exclusion</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_10.html#SEC293"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_12.html b/slib_12.html new file mode 100644 index 0000000..521de0f --- /dev/null +++ b/slib_12.html @@ -0,0 +1,346 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Procedure and Macro Index: C</TITLE> + +<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: C"> +<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: C"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_12.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[ << ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Procedure and Macro Index: C</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_C"></A>C</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1239"><CODE>call-with-dynamic-binding</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1401"><CODE>call-with-input-string</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC228">7.3.3 String Ports</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX81"><CODE>call-with-open-ports</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX82"><CODE>call-with-open-ports</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1400"><CODE>call-with-output-string</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC228">7.3.3 String Ports</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX268"><CODE>call-with-tmpnam</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX269"><CODE>call-with-tmpnam</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX270"><CODE>call-with-tmpnam</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1478"><CODE>call-with-values</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC247">7.4.12 Values</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX139"><CODE>capture-syntactic-environment</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC33">3.5.1.2 Transformer Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1509"><CODE>car+cdr</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1049"><CODE>cart-prod-tables on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX338"><CODE>catalog->html</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1012"><CODE>catalog-id on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX35"><CODE>catalog:read</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX468"><CODE>cdna:base-count</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX469"><CODE>cdna:report-base-count</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX361"><CODE>cgi:serve-query</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1335"><CODE>chap:next-string</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1333"><CODE>chap:string<=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1331"><CODE>chap:string<?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1334"><CODE>chap:string>=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1332"><CODE>chap:string>?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX254"><CODE>check-parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX795"><CODE>chromaticity->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX796"><CODE>chromaticity->whitepoint</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX803"><CODE>CIE:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX804"><CODE>CIE:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX807"><CODE>CIE:DE*94</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX808"><CODE>CIE:DE*94</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX727"><CODE>ciexyz->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX840"><CODE>CIEXYZ->e-sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX828"><CODE>CIEXYZ->L*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX829"><CODE>CIEXYZ->L*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX824"><CODE>CIEXYZ->L*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX825"><CODE>CIEXYZ->L*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX822"><CODE>CIEXYZ->RGB709</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX834"><CODE>CIEXYZ->sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX836"><CODE>CIEXYZ->xRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1492"><CODE>circular-list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1494"><CODE>circular-list?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX572"><CODE>cksum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX574"><CODE>cksum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX881"><CODE>clear-sky-color-xyy</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX614"><CODE>clip-to-rect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1008"><CODE>close-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX928"><CODE>close-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1037"><CODE>close-database on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX80"><CODE>close-port</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX961"><CODE>close-table on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX809"><CODE>CMC-DE</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX810"><CODE>CMC-DE</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX811"><CODE>CMC-DE</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX812"><CODE>CMC-DE</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX813"><CODE>CMC:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX814"><CODE>CMC:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX465"><CODE>codons<-cdna</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1387"><CODE>coerce</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1219"><CODE>collection?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX729"><CODE>color->ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX769"><CODE>color->e-srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX739"><CODE>color->l*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX740"><CODE>color->l*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX754"><CODE>color->l*c*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX755"><CODE>color->l*c*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX745"><CODE>color->l*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX746"><CODE>color->l*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX733"><CODE>color->rgb709</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX761"><CODE>color->srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX717"><CODE>color->string</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC120">5.9.1.1 External Representation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX762"><CODE>color->xrgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX850"><CODE>color-dictionaries->lookup</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX851"><CODE>color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX852"><CODE>color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX849"><CODE>color-name->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX848"><CODE>color-name:canonicalize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX712"><CODE>color-precision</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX711"><CODE>color-space</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX713"><CODE>color-white-point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX728"><CODE>color:ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX766"><CODE>color:e-srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX767"><CODE>color:e-srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX768"><CODE>color:e-srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX737"><CODE>color:l*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX738"><CODE>color:l*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX752"><CODE>color:l*c*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX753"><CODE>color:l*c*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX743"><CODE>color:l*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX744"><CODE>color:l*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX821"><CODE>color:linear-transform</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX732"><CODE>color:rgb709</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX759"><CODE>color:srgb</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX708"><CODE>color?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX709"><CODE>color?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX958"><CODE>column-domains on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX957"><CODE>column-foreigns on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX956"><CODE>column-names on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX592"><CODE>column-range</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX959"><CODE>column-types on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX595"><CODE>combine-ranges</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX904"><CODE>combined-rulesets</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX905"><CODE>combined-rulesets</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX327"><CODE>command->p-specs</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX344"><CODE>command:make-editable-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX339"><CODE>command:modify-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX340"><CODE>command:modify-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX341"><CODE>command:modify-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX342"><CODE>command:modify-table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1520"><CODE>concatenate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1521"><CODE>concatenate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1481"><CODE>cond-expand</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC248">7.4.13 SRFI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1487"><CODE>cons*</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1575"><CODE>continue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1576"><CODE>continue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX714"><CODE>convert-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX715"><CODE>convert-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX716"><CODE>convert-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX486"><CODE>copy-bit</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC91">5.1.2 Bit Within Word</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX489"><CODE>copy-bit-field</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1289"><CODE>copy-list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX539"><CODE>copy-random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX540"><CODE>copy-random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1329"><CODE>copy-tree</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1531"><CODE>count</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1374"><CODE>count-newlines</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX576"><CODE>crc16</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX577"><CODE>crc16</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX578"><CODE>crc5</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX579"><CODE>crc5</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX571"><CODE>crc:make-table</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1097"><CODE>create-array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX920"><CODE>create-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1035"><CODE>create-database on relational-system</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX587"><CODE>create-postscript-graph</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1044"><CODE>create-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1045"><CODE>create-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1046"><CODE>create-view on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX908"><CODE>cring:define-rule</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX909"><CODE>cring:define-rule</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX455"><CODE>ctime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX456"><CODE>ctime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1610"><CODE>current-directory</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX84"><CODE>current-error-port</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX189"><CODE>current-input-port</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1174"><CODE>current-input-port</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1171"><CODE>current-output-port</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX426"><CODE>current-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1634"><CODE>cvs-directories</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1633"><CODE>cvs-files</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1636"><CODE>cvs-repository</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1635"><CODE>cvs-root</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1637"><CODE>cvs-set-root!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1638"><CODE>cvs-vet</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[ << ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_13.html b/slib_13.html new file mode 100644 index 0000000..174eb2e --- /dev/null +++ b/slib_13.html @@ -0,0 +1,325 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Procedure and Macro Index: D -- F</TITLE> + +<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: D -- F"> +<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: D -- F"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_13.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_12.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_12.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Procedure and Macro Index: D -- F</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_D"></A>D</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX347"><CODE>db->html-directory</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX348"><CODE>db->html-directory</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX346"><CODE>db->html-files</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX349"><CODE>db->netscape</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX350"><CODE>db->netscape</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC73">4.7.2 HTML databases</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX459"><CODE>decode-universal-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX965"><CODE>define-*commands*</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX169"><CODE>define-access-operation</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX983"><CODE>define-command</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX984"><CODE>define-command</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX932"><CODE>define-domains</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC145">Defining Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX158"><CODE>define-operation</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX159"><CODE>define-predicate</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1553"><CODE>define-record-type</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC262">7.4.13.4 SRFI-9</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX153"><CODE>define-structure</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC38">3.6.2 Note from SLIB maintainer</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX121"><CODE>define-syntax</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC26">3.3.1 Caveat</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX985"><CODE>define-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX986"><CODE>define-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX934"><CODE>define-tables</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC145">Defining Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX113"><CODE>defmacro</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX108"><CODE>defmacro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX115"><CODE>defmacro:expand*</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC23">3.1.1 Defmacroexpand</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX109"><CODE>defmacro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX110"><CODE>defmacro?</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1467"><CODE>delay</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1318"><CODE>delete</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1023"><CODE>delete on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1027"><CODE>delete* on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX973"><CODE>delete-domain on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX77"><CODE>delete-file</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1319"><CODE>delete-if</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1320"><CODE>delete-if-not</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1043"><CODE>delete-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1274"><CODE>dequeue!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1276"><CODE>dequeue-all!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX913"><CODE>determinant</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1383"><CODE>diff:edit-length</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1384"><CODE>diff:edit-length</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1381"><CODE>diff:edits</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1382"><CODE>diff:edits</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1379"><CODE>diff:longest-common-subsequence</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1380"><CODE>diff:longest-common-subsequence</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX427"><CODE>difftime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1612"><CODE>directory-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1613"><CODE>directory-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1614"><CODE>directory-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1221"><CODE>do-elts</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1223"><CODE>do-keys</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX974"><CODE>domain-checker on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1495"><CODE>dotted-list?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1510"><CODE>drop</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1514"><CODE>drop-right</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1515"><CODE>drop-right!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1237"><CODE>dynamic-ref</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1238"><CODE>dynamic-set!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1469"><CODE>dynamic-wind</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC245">7.4.10 Dynamic-Wind</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1236"><CODE>dynamic?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_E"></A>E</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX841"><CODE>e-sRGB->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX765"><CODE>e-srgb->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX844"><CODE>e-sRGB->e-sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX843"><CODE>e-sRGB->sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1506"><CODE>eighth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1627"><CODE>emacs:backup-name</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC273">File Transactions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1231"><CODE>empty?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX460"><CODE>encode-universal-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX461"><CODE>encode-universal-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1273"><CODE>enqueue!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1162"><CODE>equal?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1471"><CODE>eval</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1297"><CODE>every</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1230"><CODE>every?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX53"><CODE>exports<-info-index</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX512"><CODE>extended-euclid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_F"></A>F</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX532"><CODE>factor</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX44"><CODE>feature->export-alist</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX45"><CODE>feature->exports</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX39"><CODE>feature->requires</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX5"><CODE>feature-eval</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX558"><CODE>fft</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX560"><CODE>fft-1</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1503"><CODE>fifth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX856"><CODE>file->color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX857"><CODE>file->color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX42"><CODE>file->definitions</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX43"><CODE>file->exports</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX40"><CODE>file->loads</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX38"><CODE>file->requires</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX76"><CODE>file-exists?</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1624"><CODE>file-lock!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1625"><CODE>file-lock!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1623"><CODE>file-lock-owner</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1626"><CODE>file-unlock!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX262"><CODE>filename:match-ci??</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX261"><CODE>filename:match??</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX266"><CODE>filename:substitute-ci??</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX265"><CODE>filename:substitute??</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX253"><CODE>fill-empty-parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX612"><CODE>fill-rect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1534"><CODE>filter</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC255">Filtering and Partitioning</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1535"><CODE>filter!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC255">Filtering and Partitioning</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1537"><CODE>find</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1303"><CODE>find-if</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1462"><CODE>find-ratio</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1463"><CODE>find-ratio-between</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1369"><CODE>find-string-from-port?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1370"><CODE>find-string-from-port?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1371"><CODE>find-string-from-port?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1372"><CODE>find-string-from-port?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1538"><CODE>find-tail</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1499"><CODE>first</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX155"><CODE>fluid-let</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC39">3.7 Fluid-Let</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1225"><CODE>for-each-elt</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1224"><CODE>for-each-key</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1028"><CODE>for-each-key on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX947"><CODE>for-each-row on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX951"><CODE>for-each-row-in-order on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1466"><CODE>force</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX85"><CODE>force-output</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX86"><CODE>force-output</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX324"><CODE>form:delimited</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX323"><CODE>form:element</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX320"><CODE>form:image</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX321"><CODE>form:reset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX318"><CODE>form:submit</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX319"><CODE>form:submit</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1502"><CODE>fourth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX217"><CODE>fprintf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX228"><CODE>fscanf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_12.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_14.html b/slib_14.html new file mode 100644 index 0000000..315215b --- /dev/null +++ b/slib_14.html @@ -0,0 +1,314 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Procedure and Macro Index: G -- I</TITLE> + +<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: G -- I"> +<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: G -- I"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_14.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Procedure and Macro Index: G -- I</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_G"></A>G</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1217"><CODE>gen-elts</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1218"><CODE>gen-keys</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX408"><CODE>generic-write</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC79">4.11.1 Generic-Write</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX107"><CODE>gentemp</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX936"><CODE>get on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC147">6.1.2 Table Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX943"><CODE>get* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX457"><CODE>get-decoded-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX326"><CODE>get-foreign-choices</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1258"><CODE>get-method</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX458"><CODE>get-universal-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1607"><CODE>getenv</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC269">7.6 System Interface</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX234"><CODE>getopt</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX236"><CODE><CODE>getopt--</CODE></CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC63">4.4.2 Getopt---</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX258"><CODE>getopt->arglist</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX257"><CODE>getopt->parameter-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX401"><CODE>glob-pattern?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX450"><CODE>gmktime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX447"><CODE>gmtime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX893"><CODE>golden-section-search</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC135">5.11 Minimizing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX503"><CODE>gray-code->integer</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX507"><CODE>gray-code<=?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX505"><CODE>gray-code<?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX508"><CODE>gray-code>=?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX506"><CODE>gray-code>?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX846"><CODE>grey</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX628"><CODE>grid-horizontals</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX627"><CODE>grid-verticals</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX454"><CODE>gtime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_H"></A>H</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1307"><CODE>has-duplicates?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1350"><CODE>hash</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1245"><CODE>hash-associator</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1248"><CODE>hash-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1244"><CODE>hash-inquirer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1247"><CODE>hash-map</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1249"><CODE>hash-rehasher</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1246"><CODE>hash-remover</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1348"><CODE>hashq</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1349"><CODE>hashv</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1265"><CODE>heap-extract-max!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1264"><CODE>heap-insert!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1263"><CODE>heap-length</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1357"><CODE>hilbert-coordinates->integer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX586"><CODE>histograph</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX62"><CODE>home-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX370"><CODE>htm-fields</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX367"><CODE>html-for-each</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX380"><CODE>html:anchor</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX295"><CODE>html:atval</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX382"><CODE>html:base</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX306"><CODE>html:body</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX317"><CODE>html:buttons</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX330"><CODE>html:caption</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX331"><CODE>html:caption</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX313"><CODE>html:checkbox</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX309"><CODE>html:comment</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX325"><CODE>html:delimited-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX345"><CODE>html:editable-row-converter</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX310"><CODE>html:form</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX303"><CODE>html:head</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX304"><CODE>html:head</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX305"><CODE>html:head</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX332"><CODE>html:heading</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX312"><CODE>html:hidden</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX333"><CODE>html:href-heading</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX300"><CODE>html:http-equiv</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX384"><CODE>html:isindex</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX381"><CODE>html:link</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX334"><CODE>html:linked-row-converter</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX299"><CODE>html:meta</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX301"><CODE>html:meta-refresh</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX302"><CODE>html:meta-refresh</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX297"><CODE>html:plain</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX307"><CODE>html:pre</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX368"><CODE>html:read-title</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX369"><CODE>html:read-title</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX316"><CODE>html:select</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX329"><CODE>html:table</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX314"><CODE>html:text</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX315"><CODE>html:text-area</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX354"><CODE>http:content</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX356"><CODE>http:error-page</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX357"><CODE>http:forwarding-page</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX353"><CODE>http:header</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX358"><CODE>http:serve-query</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_I"></A>I</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX141"><CODE>identifier=?</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC34">3.5.1.3 Identifiers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX140"><CODE>identifier?</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC34">3.5.1.3 Identifiers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX101"><CODE>identity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC18">2.5 Miscellany</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1195"><CODE>ieee-byte-collate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1193"><CODE>ieee-byte-collate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1196"><CODE>ieee-byte-decollate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1194"><CODE>ieee-byte-decollate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1189"><CODE>ieee-double->bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1188"><CODE>ieee-float->bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX60"><CODE>implementation-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX599"><CODE>in-graphic-context</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX65"><CODE>in-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1571"><CODE>init-debug</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1185"><CODE>integer->bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX502"><CODE>integer->gray-code</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1356"><CODE>integer->hilbert-coordinates</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX495"><CODE>integer->list</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX496"><CODE>integer->list</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1192"><CODE>integer-byte-collate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1191"><CODE>integer-byte-collate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX492"><CODE>integer-expt</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX491"><CODE>integer-length</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX885"><CODE>integer-sqrt</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1475"><CODE>interaction-environment</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX962"><CODE>interpolate-from-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC154">6.1.3 Database Interpolation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1292"><CODE>intersection</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1489"><CODE>iota</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1490"><CODE>iota</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1491"><CODE>iota</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX952"><CODE>isam-next on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX953"><CODE>isam-next on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX954"><CODE>isam-prev on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX955"><CODE>isam-prev on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_13.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_15.html b/slib_15.html new file mode 100644 index 0000000..0c14c47 --- /dev/null +++ b/slib_15.html @@ -0,0 +1,367 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Procedure and Macro Index: J -- M</TITLE> + +<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: J -- M"> +<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: J -- M"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_15.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Procedure and Macro Index: J -- M</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_J"></A>J</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX527"><CODE>jacobi-symbol</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_K"></A>K</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1416"><CODE>kill-process!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1011"><CODE>kill-table on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_L"></A>L</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX830"><CODE>L*a*b*->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX831"><CODE>L*a*b*->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX736"><CODE>l*a*b*->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX832"><CODE>L*a*b*->L*C*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX802"><CODE>L*a*b*:DE*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX751"><CODE>l*c*h->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX833"><CODE>L*C*h->L*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX805"><CODE>L*C*h:DE*94</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX806"><CODE>L*C*h:DE*94</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX826"><CODE>L*u*v*->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX827"><CODE>L*u*v*->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX742"><CODE>l*u*v*->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX888"><CODE>laguerre:find-polynomial-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX887"><CODE>laguerre:find-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1312"><CODE>last</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1518"><CODE>last</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX106"><CODE>last-pair</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC20">2.5.2 Legacy</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1519"><CODE>length+</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX59"><CODE>library-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX651"><CODE>light:ambient</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX652"><CODE>light:ambient</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX656"><CODE>light:beam</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX657"><CODE>light:beam</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX658"><CODE>light:beam</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX659"><CODE>light:beam</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX653"><CODE>light:directional</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX654"><CODE>light:directional</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX655"><CODE>light:directional</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX660"><CODE>light:point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX661"><CODE>light:point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX662"><CODE>light:point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX663"><CODE>light:point</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX664"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX665"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX666"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX667"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX668"><CODE>light:spot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC113">Light Sources</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1288"><CODE>list*</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1161"><CODE>list->bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX497"><CODE>list->integer</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1449"><CODE>list->string</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1452"><CODE>list->vector</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1488"><CODE>list-copy</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1542"><CODE>list-index</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1300"><CODE>list-of??</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1301"><CODE>list-of??</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1302"><CODE>list-of??</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX935"><CODE>list-table-definition</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC146">Listing Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1486"><CODE>list-tabulate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1447"><CODE>list-tail</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1498"><CODE>list=</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX41"><CODE>load->path</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX777"><CODE>load-ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX853"><CODE>load-color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX854"><CODE>load-color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX448"><CODE>localtime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX449"><CODE>localtime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX478"><CODE>logand</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX485"><CODE>logbit?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC91">5.1.2 Bit Within Word</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX484"><CODE>logcount</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX487"><CODE>logical:ones</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX493"><CODE>logical:rotate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX479"><CODE>logior</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX481"><CODE>lognot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX483"><CODE>logtest</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX480"><CODE>logxor</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_M"></A>M</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX118"><CODE>macro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX126"><CODE>macro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX133"><CODE>macro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX145"><CODE>macro:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX117"><CODE>macro:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX124"><CODE>macro:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX131"><CODE>macro:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX143"><CODE>macro:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX119"><CODE>macro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX128"><CODE>macro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX135"><CODE>macro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX147"><CODE>macro:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX112"><CODE>macroexpand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX111"><CODE>macroexpand-1</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX127"><CODE>macwork:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX125"><CODE>macwork:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX129"><CODE>macwork:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1004"><CODE>make-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1156"><CODE>make-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1157"><CODE>make-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX710"><CODE>make-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX976"><CODE>make-command-server</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC160">6.1.4.5 Command Service</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1611"><CODE>make-directory</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1235"><CODE>make-dynamic</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX103"><CODE>make-exchanger</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC19">2.5.1 Mutual Exclusion</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1253"><CODE>make-generic-method</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1254"><CODE>make-generic-predicate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1020"><CODE>make-getter on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1021"><CODE>make-getter-1 on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1242"><CODE>make-hash-table</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1262"><CODE>make-heap</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1018"><CODE>make-key->list on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1017"><CODE>make-key-extractor on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1015"><CODE>make-keyifier-1 on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1286"><CODE>make-list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1287"><CODE>make-list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1016"><CODE>make-list-keyifier on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1255"><CODE>make-method!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1031"><CODE>make-nexter on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1251"><CODE>make-object</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX248"><CODE>make-parameter-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1256"><CODE>make-predicate!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1032"><CODE>make-prever on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1465"><CODE>make-promise</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1022"><CODE>make-putter on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX364"><CODE>make-query-alist-command-server</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX365"><CODE>make-query-alist-command-server</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1269"><CODE>make-queue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX542"><CODE>make-random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX543"><CODE>make-random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1280"><CODE>make-record-type</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1033"><CODE>make-relational-system</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX902"><CODE>make-ruleset</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX903"><CODE>make-ruleset</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1124"><CODE>make-shared-array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1359"><CODE>make-sierpinski-indexer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC221">7.2.7.2 Sierpinski Curve</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX861"><CODE>make-slib-color-name-db</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX138"><CODE>make-syntactic-closure</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC33">3.5.1.2 Transformer Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1009"><CODE>make-table on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX373"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX374"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX375"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX376"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX377"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX378"><CODE>make-uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX56"><CODE>make-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1065"><CODE>make-wt-tree</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1062"><CODE>make-wt-tree-type</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1532"><CODE>map!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC254">Fold and Unfold</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1220"><CODE>map-elts</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1029"><CODE>map-key on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1222"><CODE>map-keys</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1201"><CODE>matfile:load</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1200"><CODE>matfile:read</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX912"><CODE>matrix->array</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX911"><CODE>matrix->lists</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX916"><CODE>matrix:inverse</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX915"><CODE>matrix:product</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX929"><CODE>mdbm:report</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1544"><CODE>member</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1545"><CODE>member</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1295"><CODE>member-if</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1338"><CODE>merge</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1339"><CODE>merge!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX451"><CODE>mktime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX452"><CODE>mktime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX510"><CODE>mod</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX522"><CODE>modular:*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX520"><CODE>modular:+</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX521"><CODE>modular:-</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX523"><CODE>modular:expt</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX518"><CODE>modular:invert</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX517"><CODE>modular:invertable?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX519"><CODE>modular:negate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX515"><CODE>modular:normalize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX514"><CODE>modulus->integer</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX464"><CODE>mrna<-cdna</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX287"><CODE>must-be-first</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX288"><CODE>must-be-last</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_14.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_16.html b/slib_16.html new file mode 100644 index 0000000..b47a0fa --- /dev/null +++ b/slib_16.html @@ -0,0 +1,311 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Procedure and Macro Index: N -- P</TITLE> + +<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: N -- P"> +<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: N -- P"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_16.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Procedure and Macro Index: N -- P</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_N"></A>N</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX462"><CODE>ncbi:read-dna-sequence</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX463"><CODE>ncbi:read-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1316"><CODE>nconc</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX884"><CODE>newton:find-integer-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX886"><CODE>newton:find-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1507"><CODE>ninth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1497"><CODE>not-pair?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1298"><CODE>notany</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1299"><CODE>notevery</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1317"><CODE>nreverse</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1314"><CODE>nthcdr</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX400"><CODE>null-directory?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1473"><CODE>null-environment</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1474"><CODE>null-environment</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1496"><CODE>null-list?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_O"></A>O</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX160"><CODE>object</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX411"><CODE>object->limited-string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX410"><CODE>object->string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX161"><CODE>object-with-ancestors</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1252"><CODE>object?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX428"><CODE>offset-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1005"><CODE>open-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX966"><CODE>open-command-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX967"><CODE>open-command-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX970"><CODE>open-command-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX968"><CODE>open-command-database!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX969"><CODE>open-command-database!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX971"><CODE>open-command-database!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX923"><CODE>open-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX924"><CODE>open-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1036"><CODE>open-database on relational-system</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX922"><CODE>open-database!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX78"><CODE>open-file</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1168"><CODE>open-file</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX930"><CODE>open-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC144">Opening Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1010"><CODE>open-table on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1042"><CODE>open-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX931"><CODE>open-table!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC144">Opening Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX162"><CODE>operate-as</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1322"><CODE>or?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1030"><CODE>ordered-for-each-key on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX289"><CODE>os->batch-dialect</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX613"><CODE>outline-rect</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX89"><CODE>output-port-height</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX90"><CODE>output-port-height</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX87"><CODE>output-port-width</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX88"><CODE>output-port-width</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX880"><CODE>overcast-sky-color-xyy</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_P"></A>P</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX467"><CODE>p<-cdna</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX593"><CODE>pad-range</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1533"><CODE>pair-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC254">Fold and Unfold</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX255"><CODE>parameter-list->arglist</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX252"><CODE>parameter-list-expand</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX249"><CODE>parameter-list-ref</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX403"><CODE>parse-ftp-address</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1536"><CODE>partition</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC255">Filtering and Partitioning</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX609"><CODE>partition-page</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX396"><CODE>path->uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX57"><CODE>pathname->vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX582"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX584"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX585"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX630"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX631"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX632"><CODE>plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX598"><CODE>plot-column</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC106">5.7.2.2 Drawing the Graph</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1215"><CODE>pnm:array-write</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1211"><CODE>pnm:image-file->array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1213"><CODE>pnm:image-file->array</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1203"><CODE>pnm:type-dimensions</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX79"><CODE>port?</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1309"><CODE>position</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX418"><CODE>pprint-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX419"><CODE>pprint-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX420"><CODE>pprint-filter-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX421"><CODE>pprint-filter-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX207"><CODE>prec:commentfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX186"><CODE>prec:define-grammar</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX200"><CODE>prec:delim</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX203"><CODE>prec:infix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX209"><CODE>prec:inmatchfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX199"><CODE>prec:make-led</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX198"><CODE>prec:make-nud</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX208"><CODE>prec:matchfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX204"><CODE>prec:nary</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX201"><CODE>prec:nofix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX187"><CODE>prec:parse</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX188"><CODE>prec:parse</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX205"><CODE>prec:postfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX202"><CODE>prec:prefix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX206"><CODE>prec:prestfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1144"><CODE>predicate->asso</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1241"><CODE>predicate->hash</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1243"><CODE>predicate->hash-asso</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1019"><CODE>present? on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX413"><CODE>pretty-print</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX414"><CODE>pretty-print</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX415"><CODE>pretty-print->string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX416"><CODE>pretty-print->string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX960"><CODE>primary-limit on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX529"><CODE>prime?</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX530"><CODE>primes<</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX531"><CODE>primes></CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX163"><CODE>print</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1586"><CODE>print-call-stack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1587"><CODE>print-call-stack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX216"><CODE>printf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1415"><CODE>process:schedule!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX58"><CODE>program-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1047"><CODE>project-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1493"><CODE>proper-list?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC251">Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX466"><CODE>protein<-cdna</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX6"><CODE>provide</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX4"><CODE>provided?</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_15.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_17.html b/slib_17.html new file mode 100644 index 0000000..5ab1a62 --- /dev/null +++ b/slib_17.html @@ -0,0 +1,461 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Procedure and Macro Index: Q -- S</TITLE> + +<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: Q -- S"> +<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: Q -- S"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_17.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Procedure and Macro Index: Q -- S</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_Q"></A>Q</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1560"><CODE>qp</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1561"><CODE>qpn</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1562"><CODE>qpr</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1271"><CODE>queue-empty?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1277"><CODE>queue-front</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1275"><CODE>queue-pop!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1272"><CODE>queue-push!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1278"><CODE>queue-rear</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1270"><CODE>queue?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_R"></A>R</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX536"><CODE>random</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX537"><CODE>random</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX547"><CODE>random:exp</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX548"><CODE>random:exp</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX553"><CODE>random:hollow-sphere!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX554"><CODE>random:hollow-sphere!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX549"><CODE>random:normal</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX550"><CODE>random:normal</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX551"><CODE>random:normal-vector!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX552"><CODE>random:normal-vector!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX555"><CODE>random:solid-sphere!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX556"><CODE>random:solid-sphere!</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX545"><CODE>random:uniform</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX546"><CODE>random:uniform</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1461"><CODE>rationalize</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1172"><CODE>read-byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1173"><CODE>read-byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1175"><CODE>read-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1176"><CODE>read-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX239"><CODE>read-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX240"><CODE>read-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1403"><CODE>read-line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1404"><CODE>read-line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1405"><CODE>read-line!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1406"><CODE>read-line!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX244"><CODE>read-options-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1551"><CODE>receive</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC261">7.4.13.3 SRFI-8</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1283"><CODE>record-accessor</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1281"><CODE>record-constructor</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1284"><CODE>record-modifier</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1282"><CODE>record-predicate</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1226"><CODE>reduce</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1310"><CODE>reduce</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1311"><CODE>reduce-init</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX511"><CODE>rem</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1304"><CODE>remove</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1539"><CODE>remove</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1540"><CODE>remove!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1308"><CODE>remove-duplicates</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1305"><CODE>remove-if</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1306"><CODE>remove-if-not</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX250"><CODE>remove-parameter</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX168"><CODE>remove-setter-for</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1556"><CODE>repl:quit</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1555"><CODE>repl:top-level</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX267"><CODE>replace-suffix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX10"><CODE>require</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX24"><CODE>require</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX26"><CODE>require</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX11"><CODE>require-if</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX867"><CODE>resene</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC132">The Short List</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1048"><CODE>restrict-table on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1522"><CODE>reverse!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX823"><CODE>RGB709->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX731"><CODE>rgb709->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX941"><CODE>row:delete on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX946"><CODE>row:delete* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX937"><CODE>row:insert on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX948"><CODE>row:insert* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX940"><CODE>row:remove on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX945"><CODE>row:remove* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX939"><CODE>row:retrieve on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX944"><CODE>row:retrieve* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX938"><CODE>row:update on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX949"><CODE>row:update* on relational-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX624"><CODE>rule-horizontal</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX623"><CODE>rule-vertical</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_S"></A>S</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX865"><CODE>saturate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC132">The Short List</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX227"><CODE>scanf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX224"><CODE>scanf-read-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX225"><CODE>scanf-read-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX226"><CODE>scanf-read-list</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX646"><CODE>scene:overcast</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX647"><CODE>scene:overcast</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX640"><CODE>scene:panorama</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX642"><CODE>scene:sky-and-dirt</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX643"><CODE>scene:sky-and-grass</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX641"><CODE>scene:sphere</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX644"><CODE>scene:sun</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX645"><CODE>scene:sun</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX648"><CODE>scene:viewpoint</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX649"><CODE>scene:viewpoint</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX650"><CODE>scene:viewpoints</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1472"><CODE>scheme-report-environment</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX472"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX473"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX474"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX475"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX890"><CODE>secant:find-bracketed-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX889"><CODE>secant:find-root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1500"><CODE>second</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX541"><CODE>seed->random-state</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX166"><CODE>set</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX600"><CODE>set-color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1293"><CODE>set-difference</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX601"><CODE>set-font</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX606"><CODE>set-glyphsize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX603"><CODE>set-linedash</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX604"><CODE>set-linedash</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX605"><CODE>set-linedash</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX602"><CODE>set-linewidth</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX165"><CODE>setter</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1233"><CODE>Setter</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX596"><CODE>setup-plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX597"><CODE>setup-plot</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1505"><CODE>seventh</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1418"><CODE>si:conversion-factor</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC234">7.3.6.3 Unit Symbols</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1066"><CODE>singleton-wt-tree</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1504"><CODE>sixth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX164"><CODE>size</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1232"><CODE>size</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX882"><CODE>sky-color-xyy</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX97"><CODE>slib:error</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX94"><CODE>slib:eval</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX95"><CODE>slib:eval-load</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX98"><CODE>slib:exit</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX99"><CODE>slib:exit</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX12"><CODE>slib:in-catalog?</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX93"><CODE>slib:load</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX92"><CODE>slib:load-compiled</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX91"><CODE>slib:load-source</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX73"><CODE>slib:report</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX74"><CODE>slib:report</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX75"><CODE>slib:report</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX72"><CODE>slib:report-version</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX96"><CODE>slib:warn</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX594"><CODE>snap-range</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX71"><CODE>software-type</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX873"><CODE>solar-declination</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX872"><CODE>solar-hour</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX874"><CODE>solar-polar</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX703"><CODE>solid:arrow</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX704"><CODE>solid:arrow</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX683"><CODE>solid:basrelief</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX684"><CODE>solid:basrelief</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX685"><CODE>solid:basrelief</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX669"><CODE>solid:box</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX670"><CODE>solid:box</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX701"><CODE>solid:center-array-of</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX702"><CODE>solid:center-pile-of</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX700"><CODE>solid:center-row-of</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC116">Aggregating Objects</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX686"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX687"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX688"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX689"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX690"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX691"><CODE>solid:color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX675"><CODE>solid:cone</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX676"><CODE>solid:cone</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX671"><CODE>solid:cylinder</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX672"><CODE>solid:cylinder</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX673"><CODE>solid:disk</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX674"><CODE>solid:disk</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX681"><CODE>solid:ellipsoid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX682"><CODE>solid:ellipsoid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX677"><CODE>solid:pyramid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX678"><CODE>solid:pyramid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX707"><CODE>solid:rotation</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC117">Spatial Transformations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX706"><CODE>solid:scale</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC117">Spatial Transformations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX679"><CODE>solid:sphere</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX680"><CODE>solid:sphere</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC114">Object Primitives</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX693"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX694"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX695"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX696"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX697"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX698"><CODE>solid:texture</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC115">Surface Attributes</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX705"><CODE>solid:translation</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC117">Spatial Transformations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX927"><CODE>solidify-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1040"><CODE>solidify-database on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1296"><CODE>some</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1340"><CODE>sort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1341"><CODE>sort!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1337"><CODE>sorted?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1361"><CODE>soundex</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC222">7.2.8 Soundex</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1543"><CODE>span</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX782"><CODE>spectrum->chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX783"><CODE>spectrum->chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX780"><CODE>spectrum->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX781"><CODE>spectrum->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX778"><CODE>spectrum->XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX779"><CODE>spectrum->XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1516"><CODE>split-at</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1517"><CODE>split-at!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX218"><CODE>sprintf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX219"><CODE>sprintf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX220"><CODE>sprintf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX835"><CODE>sRGB->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX758"><CODE>srgb->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX842"><CODE>sRGB->e-sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX838"><CODE>sRGB->xRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX229"><CODE>sscanf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1592"><CODE>stack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1593"><CODE>stack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1568"><CODE>stack-all</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1604"><CODE>stackf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1605"><CODE>stackf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX718"><CODE>string->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC120">5.9.1.1 External Representation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1448"><CODE>string->list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1391"><CODE>string-capitalize</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1394"><CODE>string-capitalize!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1395"><CODE>string-ci->symbol</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1450"><CODE>string-copy</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1390"><CODE>string-downcase</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1393"><CODE>string-downcase!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1451"><CODE>string-fill!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1363"><CODE>string-index</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1364"><CODE>string-index-ci</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX286"><CODE>string-join</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1437"><CODE>string-null?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1365"><CODE>string-reverse-index</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1366"><CODE>string-reverse-index-ci</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1373"><CODE>string-subst</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1389"><CODE>string-upcase</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1392"><CODE>string-upcase!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1397"><CODE>StudlyCapsExpand</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1398"><CODE>StudlyCapsExpand</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX66"><CODE>sub-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1132"><CODE>subarray</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1133"><CODE>subarray0</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1294"><CODE>subset?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1325"><CODE>subst</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1328"><CODE>subst</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1326"><CODE>substq</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1368"><CODE>substring-ci?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1436"><CODE>substring-fill!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1434"><CODE>substring-move-left!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1435"><CODE>substring-move-right!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1179"><CODE>substring-read!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1180"><CODE>substring-read!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1181"><CODE>substring-write</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1182"><CODE>substring-write</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1367"><CODE>substring?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1327"><CODE>substv</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX878"><CODE>sunlight-ciexyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX876"><CODE>sunlight-spectrum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX877"><CODE>sunlight-xyz</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1014"><CODE>supported-key-type? on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC169">6.2.1.3 Base Field Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1013"><CODE>supported-type? on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC169">6.2.1.3 Base Field Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1396"><CODE>symbol-append</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX513"><CODE>symmetric:modulus</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1007"><CODE>sync-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX926"><CODE>sync-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1039"><CODE>sync-database on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX146"><CODE>syncase:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX144"><CODE>syncase:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX148"><CODE>syncase:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX152"><CODE>syncase:sanity-check</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX134"><CODE>synclo:eval</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX132"><CODE>synclo:expand</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX136"><CODE>synclo:load</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX122"><CODE>syntax-rules</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC26">3.3.1 Caveat</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1608"><CODE>system</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC269">7.6 System Interface</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1409"><CODE>system->line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1410"><CODE>system->line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_16.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_18.html b/slib_18.html new file mode 100644 index 0000000..0c816db --- /dev/null +++ b/slib_18.html @@ -0,0 +1,331 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Procedure and Macro Index: T -- W</TITLE> + +<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: T -- W"> +<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: T -- W"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_18.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_19.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_19.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Procedure and Macro Index: T -- W</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_T"></A>T</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX336"><CODE>table->linked-html</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX337"><CODE>table->linked-page</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1041"><CODE>table-exists? on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX335"><CODE>table-name->filename</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC71">4.7 HTML Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1511"><CODE>take</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1512"><CODE>take!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1513"><CODE>take-right</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX791"><CODE>temperature->chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX790"><CODE>temperature->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX789"><CODE>temperature->XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1508"><CODE>tenth</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1501"><CODE>third</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC252">Selectors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX431"><CODE>time-zone</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX617"><CODE>title-bottom</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX618"><CODE>title-bottom</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX615"><CODE>title-top</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX616"><CODE>title-top</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX83"><CODE>tmpnam</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX195"><CODE>tok:bump-column</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX190"><CODE>tok:char-group</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC50">4.1.4 Token definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX50"><CODE>top-refs</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX51"><CODE>top-refs<-file</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1345"><CODE>topological-sort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1588"><CODE>trace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1589"><CODE>trace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1566"><CODE>trace-all</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1600"><CODE>tracef</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1601"><CODE>tracef</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1590"><CODE>track</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1591"><CODE>track</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1567"><CODE>track-all</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1602"><CODE>trackf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1603"><CODE>trackf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1628"><CODE>transact-file-replacement</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC273">File Transactions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1629"><CODE>transact-file-replacement</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC273">File Transactions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1630"><CODE>transact-file-replacement</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC273">File Transactions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1432"><CODE>transcript-off</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC238">7.4.3 Transcripts</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1431"><CODE>transcript-on</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC238">7.4.3 Transcripts</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX137"><CODE>transformer</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC33">3.5.1.2 Transformer Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX914"><CODE>transpose</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX283"><CODE>truncate-up-to</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX284"><CODE>truncate-up-to</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX285"><CODE>truncate-up-to</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1344"><CODE>tsort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1386"><CODE>type-of</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX432"><CODE>tz:params</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX433"><CODE>tz:std-offset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX434"><CODE>tzset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX435"><CODE>tzset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX436"><CODE>tzset</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_U"></A>U</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1579"><CODE>unbreak</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1580"><CODE>unbreak</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1583"><CODE>unbreakf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1291"><CODE>union</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1257"><CODE>unmake-method!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC199">7.1.14 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1598"><CODE>unstack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1599"><CODE>unstack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1594"><CODE>untrace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1595"><CODE>untrace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1606"><CODE>untracef</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1596"><CODE>untrack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1597"><CODE>untrack</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1526"><CODE>unzip1</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1527"><CODE>unzip2</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1528"><CODE>unzip3</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1529"><CODE>unzip4</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1530"><CODE>unzip5</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX385"><CODE>uri->tree</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX386"><CODE>uri->tree</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX389"><CODE>uri:decode-query</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX379"><CODE>uri:make-path</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX395"><CODE>uri:path->keys</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX388"><CODE>uri:split-fields</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX394"><CODE>uric:decode</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX391"><CODE>uric:encode</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX858"><CODE>url->color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX859"><CODE>url->color-dictionary</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1631"><CODE>user-email-address</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC274">Identification</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX61"><CODE>user-vicinity</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_V"></A>V</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1477"><CODE>values</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC247">7.4.12 Values</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1453"><CODE>vector->list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1454"><CODE>vector-fill!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX55"><CODE>vet-slib</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC12">1.6.5 Module Analysis</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX64"><CODE>vicinity:suffix?</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX636"><CODE>vrml</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX637"><CODE>vrml-append</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX638"><CODE>vrml-to-file</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_W"></A>W</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX785"><CODE>wavelength->chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX786"><CODE>wavelength->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX784"><CODE>wavelength->XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX589"><CODE>whole-page</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX608"><CODE>whole-page</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1428"><CODE>with-input-from-file</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC237">7.4.2 With-File</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1429"><CODE>with-output-to-file</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC237">7.4.2 With-File</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX982"><CODE>within-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX639"><CODE>world:info</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX963"><CODE>wrap-command-interface</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1006"><CODE>write-base on base-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1169"><CODE>write-byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1170"><CODE>write-byte</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1177"><CODE>write-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1178"><CODE>write-bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX925"><CODE>write-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1038"><CODE>write-database on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1407"><CODE>write-line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1408"><CODE>write-line</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1070"><CODE>wt-tree/add</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1071"><CODE>wt-tree/add!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1074"><CODE>wt-tree/delete</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1075"><CODE>wt-tree/delete!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1092"><CODE>wt-tree/delete-min</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1093"><CODE>wt-tree/delete-min!</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1080"><CODE>wt-tree/difference</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1068"><CODE>wt-tree/empty?</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1083"><CODE>wt-tree/fold</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1084"><CODE>wt-tree/for-each</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1085"><CODE>wt-tree/index</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1086"><CODE>wt-tree/index-datum</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1087"><CODE>wt-tree/index-pair</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1079"><CODE>wt-tree/intersection</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1073"><CODE>wt-tree/lookup</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1072"><CODE>wt-tree/member?</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1089"><CODE>wt-tree/min</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1090"><CODE>wt-tree/min-datum</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1091"><CODE>wt-tree/min-pair</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1088"><CODE>wt-tree/rank</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1082"><CODE>wt-tree/set-equal?</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1069"><CODE>wt-tree/size</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1076"><CODE>wt-tree/split<</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1077"><CODE>wt-tree/split></CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1081"><CODE>wt-tree/subset?</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1078"><CODE>wt-tree/union</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_17.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_19.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_19.html b/slib_19.html new file mode 100644 index 0000000..07b5563 --- /dev/null +++ b/slib_19.html @@ -0,0 +1,214 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Procedure and Macro Index: X -- Z</TITLE> + +<META NAME="description" CONTENT="SLIB: Procedure and Macro Index: X -- Z"> +<META NAME="keywords" CONTENT="SLIB: Procedure and Macro Index: X -- Z"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_19.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_10.html#SEC293"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Procedure and Macro Index: X -- Z</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_X"></A>X</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX626"><CODE>x-axis</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1485"><CODE>xcons</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC250">Constructors</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX837"><CODE>xRGB->CIEXYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX763"><CODE>xrgb->color</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX839"><CODE>xRGB->sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX799"><CODE>xyY->XYZ</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX800"><CODE>xyY:normalize-colors</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX801"><CODE>xyY:normalize-colors</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX794"><CODE>XYZ->chromaticity</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX798"><CODE>XYZ->xyY</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX792"><CODE>XYZ:normalize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX793"><CODE>XYZ:normalize-colors</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_Y"></A>Y</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX625"><CODE>y-axis</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_Z"></A>Z</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX879"><CODE>zenith-xyy</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1525"><CODE>zip</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P> + +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_18.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_2.html b/slib_2.html new file mode 100644 index 0000000..ef8c059 --- /dev/null +++ b/slib_2.html @@ -0,0 +1,824 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Universal SLIB Procedures</TITLE> + +<META NAME="description" CONTENT="SLIB: Universal SLIB Procedures"> +<META NAME="keywords" CONTENT="SLIB: Universal SLIB Procedures"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC13"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC12"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC14"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_1.html#SEC1"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1> 2. Universal SLIB Procedures </H1> +<!--docid::SEC13::--> +<P> + +The procedures described in these sections are supported by all +implementations as part of the `<SAMP>*.init</SAMP>' files or by +`<TT>require.scm</TT>'. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Pathname Management</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC15">2.2 Configuration</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Characteristics of Scheme Implementation</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC16">2.3 Input/Output</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Things not provided by the Scheme specs.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC17">2.4 System</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">LOADing, EVALing, ERRORing, and EXITing</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_2.html#SEC18">2.5 Miscellany</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Vicinity"></A> +<HR SIZE="6"> +<A NAME="SEC14"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC15"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 2.1 Vicinity </H2> +<!--docid::SEC14::--> +<P> + +A vicinity is a descriptor for a place in the file system. Vicinities +hide from the programmer the concepts of host, volume, directory, and +version. Vicinities express only the concept of a file environment +where a file name can be resolved to a file in a system independent +manner. Vicinities can even be used on <EM>flat</EM> file systems (which +have no directory structure) by having the vicinity express constraints +on the file name. On most systems a vicinity would be a string. All of +these procedures are file system dependent. +</P> +<P> + +These procedures are provided by all implementations. +</P> +<P> + +<A NAME="IDX56"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-vicinity</B> <I>dirpath</I> +<DD>Returns <VAR>dirpath</VAR> as a vicinity for use as first argument to +<CODE>in-vicinity</CODE>. +</DL> +<P> + +<A NAME="IDX57"></A> +</P> +<DL> +<DT><U>Function:</U> <B>pathname->vicinity</B> <I>path</I> +<DD>Returns the vicinity containing <VAR>path</VAR>. +<TABLE><tr><td> </td><td class=example><pre>(pathname->vicinity "/usr/local/lib/scm/Link.scm") + => "/usr/local/lib/scm/" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX58"></A> +</P> +<DL> +<DT><U>Function:</U> <B>program-vicinity</B> +<DD>Returns the vicinity of the currently loading Scheme code. For an +interpreter this would be the directory containing source code. For a +compiled system (with multiple files) this would be the directory where +the object or executable files are. If no file is currently loading it +the result is undefined. <STRONG>Warning:</STRONG> <CODE>program-vicinity</CODE> can +return incorrect values if your program escapes back into a +<CODE>load</CODE>. +</DL> +<P> + +<A NAME="IDX59"></A> +</P> +<DL> +<DT><U>Function:</U> <B>library-vicinity</B> +<DD>Returns the vicinity of the shared Scheme library. +</DL> +<P> + +<A NAME="IDX60"></A> +</P> +<DL> +<DT><U>Function:</U> <B>implementation-vicinity</B> +<DD>Returns the vicinity of the underlying Scheme implementation. This +vicinity will likely contain startup code and messages and a compiler. +</DL> +<P> + +<A NAME="IDX61"></A> +</P> +<DL> +<DT><U>Function:</U> <B>user-vicinity</B> +<DD>Returns the vicinity of the current directory of the user. On most +systems this is `<TT>""</TT>' (the empty string). +</DL> +<P> + +<A NAME="IDX62"></A> +</P> +<DL> +<DT><U>Function:</U> <B>home-vicinity</B> +<DD>Returns the vicinity of the user's <EM>HOME</EM> directory, the directory +<A NAME="IDX63"></A> +which typically contains files which customize a computer environment +for a user. If scheme is running without a user (eg. a daemon) or if +this concept is meaningless for the platform, then <CODE>home-vicinity</CODE> +returns <CODE>#f</CODE>. +</DL> +<P> + +<A NAME="IDX64"></A> +</P> +<DL> +<DT><U>Function:</U> <B>vicinity:suffix?</B> <I>chr</I> +<DD>Returns the `<SAMP>#t</SAMP>' if <VAR>chr</VAR> is a vicinity suffix character; and +<CODE>#f</CODE> otherwise. Typical vicinity suffixes are `<SAMP>/</SAMP>', +`<SAMP>:</SAMP>', and `<SAMP>\</SAMP>', +</DL> +<P> + +<A NAME="IDX65"></A> +</P> +<DL> +<DT><U>Function:</U> <B>in-vicinity</B> <I>vicinity filename</I> +<DD>Returns a filename suitable for use by <CODE>slib:load</CODE>, +<CODE>slib:load-source</CODE>, <CODE>slib:load-compiled</CODE>, +<CODE>open-input-file</CODE>, <CODE>open-output-file</CODE>, etc. The returned +filename is <VAR>filename</VAR> in <VAR>vicinity</VAR>. <CODE>in-vicinity</CODE> should +allow <VAR>filename</VAR> to override <VAR>vicinity</VAR> when <VAR>filename</VAR> is +an absolute pathname and <VAR>vicinity</VAR> is equal to the value of +<CODE>(user-vicinity)</CODE>. The behavior of <CODE>in-vicinity</CODE> when +<VAR>filename</VAR> is absolute and <VAR>vicinity</VAR> is not equal to the value +of <CODE>(user-vicinity)</CODE> is unspecified. For most systems +<CODE>in-vicinity</CODE> can be <CODE>string-append</CODE>. +</DL> +<P> + +<A NAME="IDX66"></A> +</P> +<DL> +<DT><U>Function:</U> <B>sub-vicinity</B> <I>vicinity name</I> +<DD>Returns the vicinity of <VAR>vicinity</VAR> restricted to <VAR>name</VAR>. This +is used for large systems where names of files in subsystems could +conflict. On systems with directory structure <CODE>sub-vicinity</CODE> will +return a pathname of the subdirectory <VAR>name</VAR> of +<VAR>vicinity</VAR>. +</DL> +<P> + +<A NAME="Configuration"></A> +<HR SIZE="6"> +<A NAME="SEC15"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC14"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC16"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 2.2 Configuration </H2> +<!--docid::SEC15::--> +<P> + +These constants and procedures describe characteristics of the Scheme +and underlying operating system. They are provided by all +implementations. +</P> +<P> + +<A NAME="IDX67"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>char-code-limit</B> +<DD>An integer 1 larger that the largest value which can be returned by +<CODE>char->integer</CODE>. +</DL> +<P> + +<A NAME="IDX68"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>most-positive-fixnum</B> +<DD>In implementations which support integers of practically unlimited size, +<VAR>most-positive-fixnum</VAR> is a large exact integer within the range of +exact integers that may result from computing the length of a list, +vector, or string. +<P> + +In implementations which do not support integers of practically +unlimited size, <VAR>most-positive-fixnum</VAR> is the largest exact integer +that may result from computing the length of a list, vector, or string. +</P> +</DL> +<P> + +<A NAME="IDX69"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>slib:tab</B> +<DD>The tab character. +</DL> +<P> + +<A NAME="IDX70"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>slib:form-feed</B> +<DD>The form-feed character. +</DL> +<P> + +<A NAME="IDX71"></A> +</P> +<DL> +<DT><U>Function:</U> <B>software-type</B> +<DD>Returns a symbol denoting the generic operating system type. For +instance, <CODE>unix</CODE>, <CODE>vms</CODE>, <CODE>macos</CODE>, <CODE>amiga</CODE>, or +<CODE>ms-dos</CODE>. +</DL> +<P> + +<A NAME="IDX72"></A> +</P> +<DL> +<DT><U>Function:</U> <B>slib:report-version</B> +<DD>Displays the versions of SLIB and the underlying Scheme implementation +and the name of the operating system. An unspecified value is returned. +<P> + +<TABLE><tr><td> </td><td class=example><pre>(slib:report-version) => slib "3a1" on scm "5b1" on unix +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX73"></A> +</P> +<DL> +<DT><U>Function:</U> <B>slib:report</B> +<DD>Displays the information of <CODE>(slib:report-version)</CODE> followed by +almost all the information neccessary for submitting a problem report. +An unspecified value is returned. +<P> + +<A NAME="IDX74"></A> +<DT><U>Function:</U> <B>slib:report</B> <I>#t</I> +<DD>provides a more verbose listing. +</P> +<P> + +<A NAME="IDX75"></A> +<DT><U>Function:</U> <B>slib:report</B> <I>filename</I> +<DD>Writes the report to file `<TT>filename</TT>'. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(slib:report) +=> +slib "3a1" on scm "5b1" on unix +(implementation-vicinity) is "/usr/local/lib/scm/" +(library-vicinity) is "/usr/local/lib/slib/" +(scheme-file-suffix) is ".scm" +loaded *features* : + trace alist qp sort + common-list-functions macro values getopt + compiled +implementation *features* : + bignum complex real rational + inexact vicinity ed getenv + tmpnam abort transcript with-file + ieee-p1178 r4rs rev4-optional-procedures hash + object-hash delay eval dynamic-wind + multiarg-apply multiarg/and- logical defmacro + string-port source current-time record + rev3-procedures rev2-procedures sun-dl string-case + array dump char-ready? full-continuation + system +implementation *catalog* : + (i/o-extensions compiled "/usr/local/lib/scm/ioext.so") + ... +</pre></td></tr></table></DL> +<P> + +<A NAME="Input/Output"></A> +<HR SIZE="6"> +<A NAME="SEC16"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC15"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC17"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 2.3 Input/Output </H2> +<!--docid::SEC16::--> +<P> + +These procedures are provided by all implementations. +</P> +<P> + +<A NAME="IDX76"></A> +</P> +<DL> +<DT><U>Function:</U> <B>file-exists?</B> <I>filename</I> +<DD>Returns <CODE>#t</CODE> if the specified file exists. Otherwise, returns +<CODE>#f</CODE>. If the underlying implementation does not support this +feature then <CODE>#f</CODE> is always returned. +</DL> +<P> + +<A NAME="IDX77"></A> +</P> +<DL> +<DT><U>Function:</U> <B>delete-file</B> <I>filename</I> +<DD>Deletes the file specified by <VAR>filename</VAR>. If <VAR>filename</VAR> can not +be deleted, <CODE>#f</CODE> is returned. Otherwise, <CODE>#t</CODE> is +returned. +</DL> +<P> + +<A NAME="IDX78"></A> +</P> +<DL> +<DT><U>Function:</U> <B>open-file</B> <I>filename modes</I> +<DD><VAR>filename</VAR> should be a string naming a file. <CODE>open-file</CODE> +returns a port depending on the symbol <VAR>modes</VAR>: +<P> + +</P> +<DL COMPACT> +<DT>r +<DD>an input port capable of delivering characters from the file. +<DT>rb +<DD>a <EM>binary</EM> input port capable of delivering characters from the file. +<DT>w +<DD>an output port capable of writing characters to a new file by that name. +<DT>wb +<DD>a <EM>binary</EM> output port capable of writing characters to a new file +by that name. +</DL> +<P> + +If an implementation does not distinguish between binary and non-binary +files, then it must treat rb as r and wb as w. +</P> +<P> + +If the file cannot be opened, either #f is returned or an error is +signalled. For output, if a file with the given name already exists, +the effect is unspecified. +</P> +</DL> +<P> + +<A NAME="IDX79"></A> +</P> +<DL> +<DT><U>Function:</U> <B>port?</B> <I>obj</I> +<DD>Returns <TT>#t</TT> if <VAR>obj</VAR> is an input or output port, otherwise +returns <TT>#f</TT>. +</DL> +<P> + +<A NAME="IDX80"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>close-port</B> <I>port</I> +<DD>Closes the file associated with <VAR>port</VAR>, rendering the <VAR>port</VAR> +incapable of delivering or accepting characters. +<P> + +<CODE>close-file</CODE> has no effect if the file has already been closed. +The value returned is unspecified. +</P> +</DL> +<P> + +<A NAME="IDX81"></A> +</P> +<DL> +<DT><U>Function:</U> <B>call-with-open-ports</B> <I>proc ports <small>...</small></I> +<DD><A NAME="IDX82"></A> +<DT><U>Function:</U> <B>call-with-open-ports</B> <I>ports <small>...</small> proc</I> +<DD><VAR>Proc</VAR> should be a procedure that accepts as many arguments as there +are <VAR>ports</VAR> passed to <CODE>call-with-open-ports</CODE>. +<CODE>call-with-open-ports</CODE> calls <VAR>proc</VAR> with <VAR>ports</VAR> <small>...</small>. +If <VAR>proc</VAR> returns, then the ports are closed automatically and the +value yielded by the <VAR>proc</VAR> is returned. If <VAR>proc</VAR> does not +return, then the ports will not be closed automatically unless it is +possible to prove that the ports will never again be used for a read or +write operation. +</DL> +<P> + +<A NAME="IDX83"></A> +</P> +<DL> +<DT><U>Function:</U> <B>tmpnam</B> +<DD>Returns a pathname for a file which will likely not be used by any other +process. Successive calls to <CODE>(tmpnam)</CODE> will return different +pathnames. +</DL> +<P> + +<A NAME="IDX84"></A> +</P> +<DL> +<DT><U>Function:</U> <B>current-error-port</B> +<DD>Returns the current port to which diagnostic and error output is +directed. +</DL> +<P> + +<A NAME="IDX85"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>force-output</B> +<DD><A NAME="IDX86"></A> +<DT><U>Procedure:</U> <B>force-output</B> <I>port</I> +<DD>Forces any pending output on <VAR>port</VAR> to be delivered to the output +device and returns an unspecified value. The <VAR>port</VAR> argument may be +omitted, in which case it defaults to the value returned by +<CODE>(current-output-port)</CODE>. +</DL> +<P> + +<A NAME="IDX87"></A> +</P> +<DL> +<DT><U>Function:</U> <B>output-port-width</B> +<DD><A NAME="IDX88"></A> +<DT><U>Function:</U> <B>output-port-width</B> <I>port</I> +<DD><P> + +Returns the width of <VAR>port</VAR>, which defaults to +<CODE>(current-output-port)</CODE> if absent. If the width cannot be +determined 79 is returned. +</P> +</DL> +<P> + +<A NAME="IDX89"></A> +</P> +<DL> +<DT><U>Function:</U> <B>output-port-height</B> +<DD><A NAME="IDX90"></A> +<DT><U>Function:</U> <B>output-port-height</B> <I>port</I> +<DD><P> + +Returns the height of <VAR>port</VAR>, which defaults to +<CODE>(current-output-port)</CODE> if absent. If the height cannot be +determined 24 is returned. +</P> +</DL> +<P> + +<A NAME="System"></A> +<HR SIZE="6"> +<A NAME="SEC17"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC16"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC18"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 2.4 System </H2> +<!--docid::SEC17::--> +<P> + +These procedures are provided by all implementations. +</P> +<P> + +<A NAME="IDX91"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>slib:load-source</B> <I>name</I> +<DD>Loads a file of Scheme source code from <VAR>name</VAR> with the default +filename extension used in SLIB. For instance if the filename extension +used in SLIB is `<TT>.scm</TT>' then <CODE>(slib:load-source "foo")</CODE> will +load from file `<TT>foo.scm</TT>'. +</DL> +<P> + +<A NAME="IDX92"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>slib:load-compiled</B> <I>name</I> +<DD>On implementations which support separtely loadable compiled modules, +loads a file of compiled code from <VAR>name</VAR> with the implementation's +filename extension for compiled code appended. +</DL> +<P> + +<A NAME="IDX93"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>slib:load</B> <I>name</I> +<DD>Loads a file of Scheme source or compiled code from <VAR>name</VAR> with the +appropriate suffixes appended. If both source and compiled code are +present with the appropriate names then the implementation will load +just one. It is up to the implementation to choose which one will be +loaded. +<P> + +If an implementation does not support compiled code then +<CODE>slib:load</CODE> will be identical to <CODE>slib:load-source</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX94"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>slib:eval</B> <I>obj</I> +<DD><CODE>eval</CODE> returns the value of <VAR>obj</VAR> evaluated in the current top +level environment. <A HREF="slib_7.html#SEC246">7.4.11 Eval</A> provides a more general evaluation +facility. +</DL> +<P> + +<A NAME="IDX95"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>slib:eval-load</B> <I>filename eval</I> +<DD><VAR>filename</VAR> should be a string. If filename names an existing file, +the Scheme source code expressions and definitions are read from the +file and <VAR>eval</VAR> called with them sequentially. The +<CODE>slib:eval-load</CODE> procedure does not affect the values returned by +<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>. +</DL> +<P> + +<A NAME="IDX96"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>slib:warn</B> <I>arg1 arg2 <small>...</small></I> +<DD>Outputs a warning message containing the arguments. +</DL> +<P> + +<A NAME="IDX97"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>slib:error</B> <I>arg1 arg2 <small>...</small></I> +<DD>Outputs an error message containing the arguments, aborts evaluation of +the current form and responds in a system dependent way to the error. +Typical responses are to abort the program or to enter a read-eval-print +loop. +</DL> +<P> + +<A NAME="IDX98"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>slib:exit</B> <I>n</I> +<DD><A NAME="IDX99"></A> +<DT><U>Procedure:</U> <B>slib:exit</B> +<DD>Exits from the Scheme session returning status <VAR>n</VAR> to the system. +If <VAR>n</VAR> is omitted or <CODE>#t</CODE>, a success status is returned to the +system (if possible). If <VAR>n</VAR> is <CODE>#f</CODE> a failure is returned to +the system (if possible). If <VAR>n</VAR> is an integer, then <VAR>n</VAR> is +returned to the system (if possible). If the Scheme session cannot exit +an unspecified value is returned from <CODE>slib:exit</CODE>. +</DL> +<P> + +<A NAME="IDX100"></A> +</P> +<DL> +<DT><U>Function:</U> <B>browse-url</B> <I>url</I> +<DD>Web browsers have become so ubiquitous that programming languagues +should support a uniform interface to them. +<P> + +If a `<SAMP>netscape</SAMP>' browser is running, <CODE>browse-url</CODE> causes the +browser to display the page specified by string <VAR>url</VAR> and returns +#t. +</P> +<P> + +If the browser is not running, <CODE>browse-url</CODE> starts a browser +displaying the argument <VAR>url</VAR>. If the browser starts as a +background job, <CODE>browse-url</CODE> returns #t immediately; if the +browser starts as a foreground job, then <CODE>browse-url</CODE> returns #t +when the browser exits; otherwise it returns #f. +</P> +</DL> +<P> + +<A NAME="Miscellany"></A> +<HR SIZE="6"> +<A NAME="SEC18"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC17"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC19"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 2.5 Miscellany </H2> +<!--docid::SEC18::--> +<P> + +These procedures are provided by all implementations. +</P> +<P> + +<A NAME="IDX101"></A> +</P> +<DL> +<DT><U>Function:</U> <B>identity</B> <I>x</I> +<DD><VAR>identity</VAR> returns its argument. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(identity 3) + => 3 +(identity '(foo bar)) + => (foo bar) +(map identity <VAR>lst</VAR>) + == (copy-list <VAR>lst</VAR>) +</pre></td></tr></table></DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC19"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC18"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC20"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 2.5.1 Mutual Exclusion </H3> +<!--docid::SEC19::--> +<P> + +An <EM>exchanger</EM> is a procedure of one argument regulating mutually +<A NAME="IDX102"></A> +exclusive access to a resource. When a exchanger is called, its current +content is returned, while being replaced by its argument in an atomic +operation. +</P> +<P> + +<A NAME="IDX103"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-exchanger</B> <I>obj</I> +<DD><P> + +Returns a new exchanger with the argument <VAR>obj</VAR> as its initial +content. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define queue (make-exchanger (list a))) +</pre></td></tr></table><P> + +A queue implemented as an exchanger holding a list can be protected from +reentrant execution thus: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define (pop queue) + (let ((lst #f)) + (dynamic-wind + (lambda () (set! lst (queue #f))) + (lambda () (and lst (not (null? lst)) + (let ((ret (car lst))) + (set! lst (cdr lst)) + ret))) + (lambda () (and lst (queue lst)))))) + +(pop queue) => a + +(pop queue) => #f +</pre></td></tr></table></DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC20"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC19"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 2.5.2 Legacy </H3> +<!--docid::SEC20::--> +<P> + +The following procedures were present in Scheme until R4RS +(see section `Language changes' in <CITE>Revised(4) Scheme</CITE>). +They are provided by all SLIB implementations. +</P> +<P> + +<A NAME="IDX104"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>t</B> +<DD>Derfined as <CODE>#t</CODE>. +</DL> +<P> + +<A NAME="IDX105"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>nil</B> +<DD>Defined as <CODE>#f</CODE>. +</DL> +<P> + +<A NAME="IDX106"></A> +</P> +<DL> +<DT><U>Function:</U> <B>last-pair</B> <I>l</I> +<DD>Returns the last pair in the list <VAR>l</VAR>. Example: +<TABLE><tr><td> </td><td class=example><pre>(last-pair (cons 1 2)) + => (1 . 2) +(last-pair '(1 2)) + => (2) + == (cons 2 '()) +</pre></td></tr></table></DL> +<P> + +<A NAME="Scheme Syntax Extension Packages"></A> +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_20.html b/slib_20.html new file mode 100644 index 0000000..ab7663e --- /dev/null +++ b/slib_20.html @@ -0,0 +1,294 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Concept and Feature Index: F -- P</TITLE> + +<META NAME="description" CONTENT="SLIB: Concept and Feature Index: F -- P"> +<META NAME="keywords" CONTENT="SLIB: Concept and Feature Index: F -- P"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_20.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Concept and Feature Index: F -- P</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_F"></A>F</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX524"><CODE>factor</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX9"><CODE>feature</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC3">1.2 Require</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1651"><CODE>feature</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC291">8.5 About this manual</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX557"><CODE>fft</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX402">File Transfer Protocol</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1616">file-lock</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1617">file-lock</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX259"><CODE>filename</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX154"><CODE>fluid-let</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC39">3.7 Fluid-Let</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX311">form</A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX210"><CODE>format</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_G"></A>G</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX726">gamut</A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX407"><CODE>generic-write</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC79">4.11.1 Generic-Write</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX406">getit</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX230"><CODE>getopt</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX235"><CODE>getopt</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC62">4.4.1 Getopt</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX981"><CODE>getopt</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX256"><CODE>getopt-parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX979"><CODE>getopt-parameters</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX260"><CODE>glob</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC67">4.4.6 Filenames</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX293"><CODE>glob</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX501">Gray code</A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1648"><CODE>Guile</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_H"></A>H</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1347"><CODE>hash</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1240"><CODE>hash-table</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1353">Hilbert</A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1351"><CODE>hilbert-fill</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX23">HOME</A></TD><TD valign=top><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX63">HOME</A></TD><TD valign=top><A HREF="slib_2.html#SEC14">2.1 Vicinity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX33">homecat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX366"><CODE>html-for-each</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC75">4.9 Parsing HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX294"><CODE>html-form</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX351"><CODE>http</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX750">Hue</A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_I"></A>I</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX757"><CODE>ICC Profile</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX30">implcat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1190">indexed-sequential-access-method</A></TD><TD valign=top><A HREF="slib_7.html#SEC191">Byte Collation Order</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX176"><CODE>infix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX52">Info</A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX182"><CODE>inmatchfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1639">install</A></TD><TD valign=top><A HREF="slib_8.html#SEC278">8.1 Installation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1640">installation</A></TD><TD valign=top><A HREF="slib_8.html#SEC278">8.1 Installation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX3">intrinsic feature</A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX950">ISAM</A></TD><TD valign=top><A HREF="slib_6.html#SEC151">6.1.2.4 Indexed Sequential Access Methods</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_L"></A>L</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX734"><CODE>L*a*b*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX747"><CODE>L*C*h</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX741"><CODE>L*u*v*</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX197">Left Denotation, led</A></TD><TD valign=top><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX735">Lightness</A></TD><TD valign=top><A HREF="slib_5.html#SEC124">Perceptual Uniformity</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX748">Lightness</A></TD><TD valign=top><A HREF="slib_5.html#SEC125">Cylindrical Coordinates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1402"><CODE>line-i</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1484">list-processing library</A></TD><TD valign=top><A HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1061"><CODE>load-option</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX476"><CODE>logical</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC89">5.1 Bit-Twiddling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX477"><CODE>logical</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC89">5.1 Bit-Twiddling</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_M"></A>M</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX116"><CODE>macro</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1557"><CODE>macro</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX120"><CODE>macro-by-example</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC25">3.3 Macro by Example</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX123"><CODE>macros-that-work</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX37"><CODE>manifest</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1025">match</A></TD><TD valign=top><A HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX942">match-keys</A></TD><TD valign=top><A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1024">match-keys</A></TD><TD valign=top><A HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX181"><CODE>matchfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1197"><CODE>matfile</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1198"><CODE>matlab</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1417"><CODE>metric-units</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC231">7.3.6 Metric Units</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX891"><CODE>minimize</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC135">5.11 Minimizing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX221">minimum field width (<CODE>printf</CODE>)</A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1647"><CODE>MIT Scheme</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX31">mkimpcat.scm</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX28">mklibcat.scm</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX509"><CODE>modular</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1455"><CODE>multiarg</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1458"><CODE>multiarg-apply</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC242">7.4.7 Multi-argument Apply</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1646"><CODE>MzScheme</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_N"></A>N</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX177"><CODE>nary</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX25">new-catalog</A></TD><TD valign=top><A HREF="slib_1.html#SEC5">1.4 Catalog Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX174"><CODE>nofix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX343">null</A></TD><TD valign=top><A HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX196">Null Denotation, nud</A></TD><TD valign=top><A HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_O"></A>O</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1250"><CODE>object</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC197">7.1.12 Macroless Object System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1259"><CODE>object</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC200">7.1.15 Examples</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1260"><CODE>object</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC203">7.1.15.3 Inverter code</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX409"><CODE>object->string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX156"><CODE>oop</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC40">3.8 Yasos</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1060">option, run-time-loadable</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX245">options file</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX246">options file</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_P"></A>P</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX247"><CODE>parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX291"><CODE>parameters</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX980"><CODE>parameters</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX170"><CODE>parse</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC46">4.1 Precedence Parsing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1205">pbm</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1206">pbm-raw</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1352">Peano</A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1355">Peano-Hilbert Space-Filling Curve</A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1207">pgm</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1208">pgm-raw</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX298">plain-text</A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1644"><CODE>PLT Scheme</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1202"><CODE>pnm</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1204">portable bitmap graphics</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1212">portable bitmap graphics</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1214">portable bitmap graphics</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX440"><CODE>posix-time</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX178"><CODE>postfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1209">ppm</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1210">ppm-raw</A></TD><TD valign=top><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX417"><CODE>pprint-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX422"><CODE>pprint-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX308">PRE</A></TD><TD valign=top><A HREF="slib_4.html#SEC69">4.5 HTML</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX171"><CODE>precedence</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC46">4.1 Precedence Parsing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX222">precision (<CODE>printf</CODE>)</A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX175"><CODE>prefix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX179"><CODE>prestfix</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC48">4.1.2 Rule Types</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX412"><CODE>pretty-print</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX525"><CODE>primes</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX215"><CODE>printf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1261"><CODE>priority-queue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX534">PRNG</A></TD><TD valign=top><A HREF="slib_5.html#SEC97">5.4 Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1411"><CODE>process</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1464"><CODE>promise</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_21.html b/slib_21.html new file mode 100644 index 0000000..7dae586 --- /dev/null +++ b/slib_21.html @@ -0,0 +1,271 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Concept and Feature Index: Q -- U</TITLE> + +<META NAME="description" CONTENT="SLIB: Concept and Feature Index: Q -- U"> +<META NAME="keywords" CONTENT="SLIB: Concept and Feature Index: Q -- U"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_21.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_22.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_22.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Concept and Feature Index: Q -- U</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_Q"></A>Q</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX237"><CODE>qp</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC63">4.4.2 Getopt---</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1559"><CODE>qp</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX360">query-string</A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX363">query-string</A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1266"><CODE>queue</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_R"></A>R</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1419"><CODE>r2rs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1421"><CODE>r3rs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1649"><CODE>r3rs</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC285">8.3 Coding Guidelines</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1423"><CODE>r4rs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1425"><CODE>r5rs</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX535"><CODE>random</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX544"><CODE>random-inexact</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX590">range</A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX591">range</A></TD><TD valign=top><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1460"><CODE>rationalize</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX238"><CODE>read-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1279"><CODE>record</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX607">rectangle</A></TD><TD valign=top><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX917"><CODE>relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC141">6.1 Relational Database</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX921">relational-system</A></TD><TD valign=top><A HREF="slib_6.html#SEC143">Database Sharing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX150"><CODE>repl</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1554"><CODE>repl</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1558"><CODE>repl</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX862">Resene</A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX866"><CODE>resene</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC132">The Short List</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX322">reset</A></TD><TD valign=top><A HREF="slib_4.html#SEC70">4.6 HTML Forms</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1433"><CODE>rev2-procedures</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1446"><CODE>rev4-optional-procedures</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX730"><CODE>RGB709</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX895">ring, commutative</A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX533">RNG</A></TD><TD valign=top><A HREF="slib_5.html#SEC97">5.4 Random Numbers</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX883"><CODE>root</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1059">run-time-loadable option</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX999"><CODE>rwb-isam</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_S"></A>S</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX864"><CODE>saturate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC132">The Short List</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX223"><CODE>scanf</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX398">scheme</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1480">Scheme Request For Implementation</A></TD><TD valign=top><A HREF="slib_7.html#SEC248">7.4.13 SRFI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1643"><CODE>Scheme48</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX471"><CODE>schmooz</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC87">4.14 Schmooz</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1641"><CODE>SCM</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX898"><CODE>self-set</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1376">Sequence Comparison</A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX387">Server-based Naming Authority</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX2">session</A></TD><TD valign=top><A HREF="slib_1.html#SEC2">1.1 Feature</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1057">sets, using binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX243">shell</A></TD><TD valign=top><A HREF="slib_4.html#SEC64">4.4.3 Command Line</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1358"><CODE>sierpinski</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC221">7.2.7.2 Sierpinski Curve</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX29">sitecat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX32">sitecat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX871"><CODE>sky</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX27">slibcat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX634"><CODE>solid</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX635"><CODE>solid-modeling</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX633"><CODE>solids</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1336"><CODE>sort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1360"><CODE>soundex</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC222">7.2.8 Soundex</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX14">source</A></TD><TD valign=top><A HREF="slib_1.html#SEC4">1.3 Library Catalogs</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1354">Space-Filling</A></TD><TD valign=top><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1199">sparse</A></TD><TD valign=top><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX770">Spectral Tristimulus Values</A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1378">spiff</A></TD><TD valign=top><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1479"><CODE>srfi</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC248">7.4.13 SRFI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1483">SRFI-1</A></TD><TD valign=top><A HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1482"><CODE>srfi-1</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1548"><CODE>srfi-2</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC260">7.4.13.2 SRFI-2</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1550"><CODE>srfi-8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC261">7.4.13.3 SRFI-8</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1552"><CODE>srfi-9</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC262">7.4.13.4 SRFI-9</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX756"><CODE>sRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX211"><CODE>stdio</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC55">4.3.1 stdio</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1388"><CODE>string-case</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1399"><CODE>string-port</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC228">7.3.3 String Ports</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1362"><CODE>string-search</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1131"><CODE>subarray</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX870"><CODE>sun</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX869"><CODE>sunlight</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX516">symmetric</A></TD><TD valign=top><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX130"><CODE>syntactic-closures</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX173">syntax tree</A></TD><TD valign=top><A HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX142"><CODE>syntax-case</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX149"><CODE>syntax-case</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX151"><CODE>syntax-case</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_T"></A>T</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX424">time</A></TD><TD valign=top><A HREF="slib_4.html#SEC82">4.12 Time and Date</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX430"><CODE>time-zone</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX48">top-level variable references</A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX47"><CODE>top-refs</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1342"><CODE>topological-sort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1584"><CODE>trace</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1615"><CODE>transact</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC271">7.6.2 Transactions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1430"><CODE>transcript</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC238">7.4.3 Transcripts</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1324"><CODE>tree</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1051">trees, balanced binary</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX723">tristimulus</A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX724">tristimulus</A></TD><TD valign=top><A HREF="slib_5.html#SEC123">Measurement-based Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1343"><CODE>tsort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1346"><CODE>tsort</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX875">turbidity</A></TD><TD valign=top><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX429"><CODE>TZ-string</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC83">4.12.1 Time Zone</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_U"></A>U</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX372">Uniform Resource Identifiers</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX404">Uniform Resource Locator</A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX899">Unique Factorization</A></TD><TD valign=top><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX392">unsafe</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX371"><CODE>uri</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX359">URI</A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX362">URI</A></TD><TD valign=top><A HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX390">URI</A></TD><TD valign=top><A HREF="slib_4.html#SEC76">4.10 URI</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX34">usercat</A></TD><TD valign=top><A HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX446">UTC</A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_20.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_22.html"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_22.html b/slib_22.html new file mode 100644 index 0000000..6be8cda --- /dev/null +++ b/slib_22.html @@ -0,0 +1,180 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Concept and Feature Index: V -- Y</TITLE> + +<META NAME="description" CONTENT="SLIB: Concept and Feature Index: V -- Y"> +<META NAME="keywords" CONTENT="SLIB: Concept and Feature Index: V -- Y"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_22.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ > ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_11.html#SEC294"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2 ALIGN="Left">Concept and Feature Index: V -- Y</H2> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_V"></A>V</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1476"><CODE>values</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC247">7.4.12 Values</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX49">variable references</A></TD><TD valign=top><A HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_1.html#IDX54"><CODE>vet</CODE></A></TD><TD valign=top><A HREF="slib_1.html#SEC12">1.6.5 Module Analysis</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_8.html#IDX1642"><CODE>VSCM</CODE></A></TD><TD valign=top><A HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_W"></A>W</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX998">WB</A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX996"><CODE>wb-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1054">weight-balanced binary trees</A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX860">wget</A></TD><TD valign=top><A HREF="slib_5.html#SEC131">Dictionary Creation</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX719">white point</A></TD><TD valign=top><A HREF="slib_5.html#SEC121">5.9.1.2 White</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX720">white point</A></TD><TD valign=top><A HREF="slib_5.html#SEC121">5.9.1.2 White</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1026">wild-card</A></TD><TD valign=top><A HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1427"><CODE>with-file</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC237">7.4.2 With-File</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1619">Word</A></TD><TD valign=top><A HREF="slib_7.html#SEC272">File Locking</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1050"><CODE>wt-tree</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_X"></A>X</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX760"><CODE>xRGB</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC126">Digital Color Spaces</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX797">xyY</A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="cp_Y"></A>Y</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX157"><CODE>yasos</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC40">3.8 Yasos</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_11.html#cp_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_11.html#cp_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_11.html#cp_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_11.html#cp_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_11.html#cp_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_20.html#cp_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_20.html#cp_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_20.html#cp_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_20.html#cp_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_20.html#cp_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_20.html#cp_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_20.html#cp_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_20.html#cp_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_20.html#cp_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_21.html#cp_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_21.html#cp_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_21.html#cp_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_21.html#cp_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_21.html#cp_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_22.html#cp_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_22.html#cp_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_22.html#cp_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_22.html#cp_Y" style="text-decoration:none"><b>Y</b></A> + +</td></tr></table><P> + +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_21.html"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_3.html b/slib_3.html new file mode 100644 index 0000000..0f0e6e9 --- /dev/null +++ b/slib_3.html @@ -0,0 +1,2013 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Scheme Syntax Extension Packages</TITLE> + +<META NAME="description" CONTENT="SLIB: Scheme Syntax Extension Packages"> +<META NAME="keywords" CONTENT="SLIB: Scheme Syntax Extension Packages"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC21"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC20"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC22"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_2.html#SEC13"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1> 3. Scheme Syntax Extension Packages </H1> +<!--docid::SEC21::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC22">3.1 Defmacro</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Supported by all implementations</TD></TR> +<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP"> +</TH></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC24">3.2 R4RS Macros</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'macro</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC25">3.3 Macro by Example</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'macro-by-example</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC27">3.4 Macros That Work</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'macros-that-work</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'syntactic-closures</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'syntax-case</TD></TR> +<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP"> +</TH></TR> +<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP">Syntax extensions (macros) included with SLIB. +</TH></TR> +<TR><TH COLSPAN="3" ALIGN="left" VALIGN="TOP"> +</TH></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC39">3.7 Fluid-Let</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'fluid-let</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC40">3.8 Yasos</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'yasos, 'oop, 'collect</TD></TR> +</TABLE> +<P> + +<A NAME="Defmacro"></A> +<HR SIZE="6"> +<A NAME="SEC22"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC23"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 3.1 Defmacro </H2> +<!--docid::SEC22::--> +<P> + +Defmacros are supported by all implementations. +</P> +<P> + +<A NAME="IDX107"></A> +</P> +<DL> +<DT><U>Function:</U> <B>gentemp</B> +<DD>Returns a new (interned) symbol each time it is called. The symbol +names are implementation-dependent +<TABLE><tr><td> </td><td class=example><pre>(gentemp) => scm:G0 +(gentemp) => scm:G1 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX108"></A> +</P> +<DL> +<DT><U>Function:</U> <B>defmacro:eval</B> <I>e</I> +<DD>Returns the <CODE>slib:eval</CODE> of expanding all defmacros in scheme +expression <VAR>e</VAR>. +</DL> +<P> + +<A NAME="IDX109"></A> +</P> +<DL> +<DT><U>Function:</U> <B>defmacro:load</B> <I>filename</I> +<DD><VAR>filename</VAR> should be a string. If filename names an existing file, +the <CODE>defmacro:load</CODE> procedure reads Scheme source code expressions +and definitions from the file and evaluates them sequentially. These +source code expressions and definitions may contain defmacro +definitions. The <CODE>macro:load</CODE> procedure does not affect the values +returned by <CODE>current-input-port</CODE> and +<CODE>current-output-port</CODE>. +</DL> +<P> + +<A NAME="IDX110"></A> +</P> +<DL> +<DT><U>Function:</U> <B>defmacro?</B> <I>sym</I> +<DD>Returns <CODE>#t</CODE> if <VAR>sym</VAR> has been defined by <CODE>defmacro</CODE>, +<CODE>#f</CODE> otherwise. +</DL> +<P> + +<A NAME="IDX111"></A> +</P> +<DL> +<DT><U>Function:</U> <B>macroexpand-1</B> <I>form</I> +<DD><A NAME="IDX112"></A> +<DT><U>Function:</U> <B>macroexpand</B> <I>form</I> +<DD>If <VAR>form</VAR> is a macro call, <CODE>macroexpand-1</CODE> will expand the +macro call once and return it. A <VAR>form</VAR> is considered to be a macro +call only if it is a cons whose <CODE>car</CODE> is a symbol for which a +<CODE>defmacro</CODE> has been defined. +<P> + +<CODE>macroexpand</CODE> is similar to <CODE>macroexpand-1</CODE>, but repeatedly +expands <VAR>form</VAR> until it is no longer a macro call. +</P> +</DL> +<P> + +<A NAME="IDX113"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>defmacro</B> <I>name lambda-list form <small>...</small></I> +<DD>When encountered by <CODE>defmacro:eval</CODE>, <CODE>defmacro:macroexpand*</CODE>, +or <CODE>defmacro:load</CODE> defines a new macro which will henceforth be +expanded when encountered by <CODE>defmacro:eval</CODE>, +<CODE>defmacro:macroexpand*</CODE>, or <CODE>defmacro:load</CODE>. +</DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC23"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC22"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC24"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.1.1 Defmacroexpand </H3> +<!--docid::SEC23::--> +<CODE>(require 'defmacroexpand)</CODE> +<A NAME="IDX114"></A> +<P> + +<A NAME="IDX115"></A> +</P> +<DL> +<DT><U>Function:</U> <B>defmacro:expand*</B> <I>e</I> +<DD>Returns the result of expanding all defmacros in scheme expression +<VAR>e</VAR>. +</DL> +<P> + +<A NAME="R4RS Macros"></A> +<HR SIZE="6"> +<A NAME="SEC24"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC23"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC25"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 3.2 R4RS Macros </H2> +<!--docid::SEC24::--> +<P> + +<CODE>(require 'macro)</CODE> is the appropriate call if you want R4RS +<A NAME="IDX116"></A> +high-level macros but don't care about the low level implementation. If +an SLIB R4RS macro implementation is already loaded it will be used. +Otherwise, one of the R4RS macros implemetations is loaded. +</P> +<P> + +The SLIB R4RS macro implementations support the following uniform +interface: +</P> +<P> + +<A NAME="IDX117"></A> +</P> +<DL> +<DT><U>Function:</U> <B>macro:expand</B> <I>sexpression</I> +<DD>Takes an R4RS expression, macro-expands it, and returns the result of +the macro expansion. +</DL> +<P> + +<A NAME="IDX118"></A> +</P> +<DL> +<DT><U>Function:</U> <B>macro:eval</B> <I>sexpression</I> +<DD>Takes an R4RS expression, macro-expands it, evals the result of the +macro expansion, and returns the result of the evaluation. +</DL> +<P> + +<A NAME="IDX119"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>macro:load</B> <I>filename</I> +<DD><VAR>filename</VAR> should be a string. If filename names an existing file, +the <CODE>macro:load</CODE> procedure reads Scheme source code expressions and +definitions from the file and evaluates them sequentially. These source +code expressions and definitions may contain macro definitions. The +<CODE>macro:load</CODE> procedure does not affect the values returned by +<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>. +</DL> +<P> + +<A NAME="Macro by Example"></A> +<HR SIZE="6"> +<A NAME="SEC25"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC24"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC26"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 3.3 Macro by Example </H2> +<!--docid::SEC25::--> +<P> + +<CODE>(require 'macro-by-example)</CODE> +<A NAME="IDX120"></A> +</P> +<P> + +A vanilla implementation of <CITE>Macro by Example</CITE> (Eugene Kohlbecker, +R4RS) by Dorai Sitaram, (dorai @ cs.rice.edu) using <CODE>defmacro</CODE>. +</P> +<P> + +<UL> + +<LI> +generating hygienic global <CODE>define-syntax</CODE> Macro-by-Example macros +<STRONG>cheaply</STRONG>. +<P> + +</P> +<LI> +can define macros which use <CODE>...</CODE>. +<P> + +</P> +<LI> +needn't worry about a lexical variable in a macro definition +clashing with a variable from the macro use context +<P> + +</P> +<LI> +don't suffer the overhead of redefining the repl if <CODE>defmacro</CODE> +natively supported (most implementations) +<P> + +</UL> +<HR SIZE="6"> +<A NAME="SEC26"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC25"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC27"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.3.1 Caveat </H3> +<!--docid::SEC26::--> +These macros are not referentially transparent (see section `Macros' in <CITE>Revised(4) Scheme</CITE>). Lexically scoped macros (i.e., <CODE>let-syntax</CODE> +and <CODE>letrec-syntax</CODE>) are not supported. In any case, the problem +of referential transparency gains poignancy only when <CODE>let-syntax</CODE> +and <CODE>letrec-syntax</CODE> are used. So you will not be courting +large-scale disaster unless you're using system-function names as local +variables with unintuitive bindings that the macro can't use. However, +if you must have the full <CITE>r4rs</CITE> macro functionality, look to the +more featureful (but also more expensive) versions of syntax-rules +available in slib <A HREF="slib_3.html#SEC27">3.4 Macros That Work</A>, <A HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A>, and +<A HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A>. +<P> + +<A NAME="IDX121"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>define-syntax</B> <I>keyword transformer-spec</I> +<DD>The <VAR>keyword</VAR> is an identifier, and the <VAR>transformer-spec</VAR> +should be an instance of <CODE>syntax-rules</CODE>. +<P> + +The top-level syntactic environment is extended by binding the +<VAR>keyword</VAR> to the specified transformer. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define-syntax let* + (syntax-rules () + ((let* () body1 body2 ...) + (let () body1 body2 ...)) + ((let* ((name1 val1) (name2 val2) ...) + body1 body2 ...) + (let ((name1 val1)) + (let* (( name2 val2) ...) + body1 body2 ...))))) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX122"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>syntax-rules</B> <I>literals syntax-rule <small>...</small></I> +<DD><VAR>literals</VAR> is a list of identifiers, and each <VAR>syntax-rule</VAR> +should be of the form +<P> + +<CODE>(<VAR>pattern</VAR> <VAR>template</VAR>)</CODE> +</P> +<P> + +where the <VAR>pattern</VAR> and <VAR>template</VAR> are as in the grammar above. +</P> +<P> + +An instance of <CODE>syntax-rules</CODE> produces a new macro transformer by +specifying a sequence of hygienic rewrite rules. A use of a macro whose +keyword is associated with a transformer specified by +<CODE>syntax-rules</CODE> is matched against the patterns contained in the +<VAR>syntax-rule</VAR>s, beginning with the leftmost <VAR>syntax-rule</VAR>. +When a match is found, the macro use is trancribed hygienically +according to the template. +</P> +<P> + +Each pattern begins with the keyword for the macro. This keyword is not +involved in the matching and is not considered a pattern variable or +literal identifier. +</P> +</DL> +<P> + +<A NAME="Macros That Work"></A> +<HR SIZE="6"> +<A NAME="SEC27"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC26"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC28"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 3.4 Macros That Work </H2> +<!--docid::SEC27::--> +<P> + +<CODE>(require 'macros-that-work)</CODE> +<A NAME="IDX123"></A> +</P> +<P> + +<CITE>Macros That Work</CITE> differs from the other R4RS macro +implementations in that it does not expand derived expression types to +primitive expression types. +</P> +<P> + +<A NAME="IDX124"></A> +</P> +<DL> +<DT><U>Function:</U> <B>macro:expand</B> <I>expression</I> +<DD><A NAME="IDX125"></A> +<DT><U>Function:</U> <B>macwork:expand</B> <I>expression</I> +<DD>Takes an R4RS expression, macro-expands it, and returns the result of +the macro expansion. +</DL> +<P> + +<A NAME="IDX126"></A> +</P> +<DL> +<DT><U>Function:</U> <B>macro:eval</B> <I>expression</I> +<DD><A NAME="IDX127"></A> +<DT><U>Function:</U> <B>macwork:eval</B> <I>expression</I> +<DD><CODE>macro:eval</CODE> returns the value of <VAR>expression</VAR> in the current +top level environment. <VAR>expression</VAR> can contain macro definitions. +Side effects of <VAR>expression</VAR> will affect the top level +environment. +</DL> +<P> + +<A NAME="IDX128"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>macro:load</B> <I>filename</I> +<DD><A NAME="IDX129"></A> +<DT><U>Procedure:</U> <B>macwork:load</B> <I>filename</I> +<DD><VAR>filename</VAR> should be a string. If filename names an existing file, +the <CODE>macro:load</CODE> procedure reads Scheme source code expressions and +definitions from the file and evaluates them sequentially. These source +code expressions and definitions may contain macro definitions. The +<CODE>macro:load</CODE> procedure does not affect the values returned by +<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>. +</DL> +<P> + +References: +</P> +<P> + +The <CITE>Revised^4 Report on the Algorithmic Language Scheme</CITE> Clinger +and Rees [editors]. To appear in LISP Pointers. Also available as a +technical report from the University of Oregon, MIT AI Lab, and +Cornell. +</P> +<P> + +<center> + Macros That Work. Clinger and Rees. POPL '91. +</center> +</P> +<P> + +The supported syntax differs from the R4RS in that vectors are allowed +as patterns and as templates and are not allowed as pattern or template +data. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>transformer spec ==> (syntax-rules literals rules) + +rules ==> () + | (rule . rules) + +rule ==> (pattern template) + +pattern ==> pattern_var ; a symbol not in literals + | symbol ; a symbol in literals + | () + | (pattern . pattern) + | (ellipsis_pattern) + | #(pattern*) ; extends R4RS + | #(pattern* ellipsis_pattern) ; extends R4RS + | pattern_datum + +template ==> pattern_var + | symbol + | () + | (template2 . template2) + | #(template*) ; extends R4RS + | pattern_datum + +template2 ==> template + | ellipsis_template + +pattern_datum ==> string ; no vector + | character + | boolean + | number + +ellipsis_pattern ==> pattern ... + +ellipsis_template ==> template ... + +pattern_var ==> symbol ; not in literals + +literals ==> () + | (symbol . literals) +</pre></td></tr></table><P> + +<HR SIZE="6"> +<A NAME="SEC28"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC27"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC29"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.4.1 Definitions </H3> +<!--docid::SEC28::--> +<P> + +</P> +<DL COMPACT> + +<DT>Scope of an ellipsis +<DD>Within a pattern or template, the scope of an ellipsis (<CODE>...</CODE>) is +the pattern or template that appears to its left. +<P> + +</P> +<DT>Rank of a pattern variable +<DD>The rank of a pattern variable is the number of ellipses within whose +scope it appears in the pattern. +<P> + +</P> +<DT>Rank of a subtemplate +<DD>The rank of a subtemplate is the number of ellipses within whose scope +it appears in the template. +<P> + +</P> +<DT>Template rank of an occurrence of a pattern variable +<DD>The template rank of an occurrence of a pattern variable within a +template is the rank of that occurrence, viewed as a subtemplate. +<P> + +</P> +<DT>Variables bound by a pattern +<DD>The variables bound by a pattern are the pattern variables that appear +within it. +<P> + +</P> +<DT>Referenced variables of a subtemplate +<DD>The referenced variables of a subtemplate are the pattern variables that +appear within it. +<P> + +</P> +<DT>Variables opened by an ellipsis template +<DD>The variables opened by an ellipsis template are the referenced pattern +variables whose rank is greater than the rank of the ellipsis template. +<P> + +</DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC29"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC28"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC30"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.4.2 Restrictions </H3> +<!--docid::SEC29::--> +<P> + +No pattern variable appears more than once within a pattern. +</P> +<P> + +For every occurrence of a pattern variable within a template, the +template rank of the occurrence must be greater than or equal to the +pattern variable's rank. +</P> +<P> + +Every ellipsis template must open at least one variable. +</P> +<P> + +For every ellipsis template, the variables opened by an ellipsis +template must all be bound to sequences of the same length. +</P> +<P> + +The compiled form of a <VAR>rule</VAR> is +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>rule ==> (pattern template inserted) + +pattern ==> pattern_var + | symbol + | () + | (pattern . pattern) + | ellipsis_pattern + | #(pattern) + | pattern_datum + +template ==> pattern_var + | symbol + | () + | (template2 . template2) + | #(pattern) + | pattern_datum + +template2 ==> template + | ellipsis_template + +pattern_datum ==> string + | character + | boolean + | number + +pattern_var ==> #(V symbol rank) + +ellipsis_pattern ==> #(E pattern pattern_vars) + +ellipsis_template ==> #(E template pattern_vars) + +inserted ==> () + | (symbol . inserted) + +pattern_vars ==> () + | (pattern_var . pattern_vars) + +rank ==> exact non-negative integer +</pre></td></tr></table><P> + +where V and E are unforgeable values. +</P> +<P> + +The pattern variables associated with an ellipsis pattern are the +variables bound by the pattern, and the pattern variables associated +with an ellipsis template are the variables opened by the ellipsis +template. +</P> +<P> + +If the template contains a big chunk that contains no pattern variables +or inserted identifiers, then the big chunk will be copied +unnecessarily. That shouldn't matter very often. +</P> +<P> + +<A NAME="Syntactic Closures"></A> +<HR SIZE="6"> +<A NAME="SEC30"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC29"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC31"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 3.5 Syntactic Closures </H2> +<!--docid::SEC30::--> +<P> + +<CODE>(require 'syntactic-closures)</CODE> +<A NAME="IDX130"></A> +</P> +<P> + +<A NAME="IDX131"></A> +</P> +<DL> +<DT><U>Function:</U> <B>macro:expand</B> <I>expression</I> +<DD><A NAME="IDX132"></A> +<DT><U>Function:</U> <B>synclo:expand</B> <I>expression</I> +<DD>Returns scheme code with the macros and derived expression types of +<VAR>expression</VAR> expanded to primitive expression types. +</DL> +<P> + +<A NAME="IDX133"></A> +</P> +<DL> +<DT><U>Function:</U> <B>macro:eval</B> <I>expression</I> +<DD><A NAME="IDX134"></A> +<DT><U>Function:</U> <B>synclo:eval</B> <I>expression</I> +<DD><CODE>macro:eval</CODE> returns the value of <VAR>expression</VAR> in the current +top level environment. <VAR>expression</VAR> can contain macro definitions. +Side effects of <VAR>expression</VAR> will affect the top level +environment. +</DL> +<P> + +<A NAME="IDX135"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>macro:load</B> <I>filename</I> +<DD><A NAME="IDX136"></A> +<DT><U>Procedure:</U> <B>synclo:load</B> <I>filename</I> +<DD><VAR>filename</VAR> should be a string. If filename names an existing file, +the <CODE>macro:load</CODE> procedure reads Scheme source code expressions and +definitions from the file and evaluates them sequentially. These +source code expressions and definitions may contain macro definitions. +The <CODE>macro:load</CODE> procedure does not affect the values returned by +<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>. +</DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC31"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC30"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC32"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.5.1 Syntactic Closure Macro Facility </H3> +<!--docid::SEC31::--> +<P> + +<center> + A Syntactic Closures Macro Facility +</center> +<center> + by Chris Hanson +</center> +<center> + 9 November 1991 +</center> +</P> +<P> + +This document describes <EM>syntactic closures</EM>, a low-level macro +facility for the Scheme programming language. The facility is an +alternative to the low-level macro facility described in the +<CITE>Revised^4 Report on Scheme.</CITE> This document is an addendum to that +report. +</P> +<P> + +The syntactic closures facility extends the BNF rule for +<VAR>transformer spec</VAR> to allow a new keyword that introduces a +low-level macro transformer: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre><VAR>transformer spec</VAR> := (transformer <VAR>expression</VAR>) +</pre></td></tr></table><P> + +Additionally, the following procedures are added: +<TABLE><tr><td> </td><td class=example><pre>make-syntactic-closure +capture-syntactic-environment +identifier? +identifier=? +</pre></td></tr></table><P> + +The description of the facility is divided into three parts. The first +part defines basic terminology. The second part describes how macro +transformers are defined. The third part describes the use of +<EM>identifiers</EM>, which extend the syntactic closure mechanism to be +compatible with <CODE>syntax-rules</CODE>. +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC32"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC31"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC33"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 3.5.1.1 Terminology </H4> +<!--docid::SEC32::--> +<P> + +This section defines the concepts and data types used by the syntactic +closures facility. +</P> +<P> + +<UL> + +<LI><EM>Forms</EM> are the syntactic entities out of which programs are +recursively constructed. A form is any expression, any definition, any +syntactic keyword, or any syntactic closure. The variable name that +appears in a <CODE>set!</CODE> special form is also a form. Examples of +forms: +<P> + +<TABLE><tr><td> </td><td class=example><pre>17 +#t +car +(+ x 4) +(lambda (x) x) +(define pi 3.14159) +if +define +</pre></td></tr></table><P> + +</P> +<LI>An <EM>alias</EM> is an alternate name for a given symbol. It can +appear anywhere in a form that the symbol could be used, and when quoted +it is replaced by the symbol; however, it does not satisfy the predicate +<CODE>symbol?</CODE>. Macro transformers rarely distinguish symbols from +aliases, referring to both as identifiers. +<P> + +</P> +<LI>A <EM>syntactic</EM> environment maps identifiers to their +meanings. More precisely, it determines whether an identifier is a +syntactic keyword or a variable. If it is a keyword, the meaning is an +interpretation for the form in which that keyword appears. If it is a +variable, the meaning identifies which binding of that variable is +referenced. In short, syntactic environments contain all of the +contextual information necessary for interpreting the meaning of a +particular form. +<P> + +</P> +<LI>A <EM>syntactic closure</EM> consists of a form, a syntactic +environment, and a list of identifiers. All identifiers in the form +take their meaning from the syntactic environment, except those in the +given list. The identifiers in the list are to have their meanings +determined later. A syntactic closure may be used in any context in +which its form could have been used. Since a syntactic closure is also +a form, it may not be used in contexts where a form would be illegal. +For example, a form may not appear as a clause in the cond special form. +A syntactic closure appearing in a quoted structure is replaced by its +form. +<P> + +</UL> +<P> + +<HR SIZE="6"> +<A NAME="SEC33"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC32"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC34"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 3.5.1.2 Transformer Definition </H4> +<!--docid::SEC33::--> +<P> + +This section describes the <CODE>transformer</CODE> special form and the +procedures <CODE>make-syntactic-closure</CODE> and +<CODE>capture-syntactic-environment</CODE>. +</P> +<P> + +<A NAME="IDX137"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>transformer</B> <I>expression</I> +<DD><P> + +Syntax: It is an error if this syntax occurs except as a +<VAR>transformer spec</VAR>. +</P> +<P> + +Semantics: The <VAR>expression</VAR> is evaluated in the standard transformer +environment to yield a macro transformer as described below. This macro +transformer is bound to a macro keyword by the special form in which the +<CODE>transformer</CODE> expression appears (for example, +<CODE>let-syntax</CODE>). +</P> +<P> + +A <EM>macro transformer</EM> is a procedure that takes two arguments, a +form and a syntactic environment, and returns a new form. The first +argument, the <EM>input form</EM>, is the form in which the macro keyword +occurred. The second argument, the <EM>usage environment</EM>, is the +syntactic environment in which the input form occurred. The result of +the transformer, the <EM>output form</EM>, is automatically closed in the +<EM>transformer environment</EM>, which is the syntactic environment in +which the <CODE>transformer</CODE> expression occurred. +</P> +<P> + +For example, here is a definition of a push macro using +<CODE>syntax-rules</CODE>: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define-syntax push + (syntax-rules () + ((push item list) + (set! list (cons item list))))) +</pre></td></tr></table><P> + +Here is an equivalent definition using <CODE>transformer</CODE>: +<TABLE><tr><td> </td><td class=example><pre>(define-syntax push + (transformer + (lambda (exp env) + (let ((item + (make-syntactic-closure env '() (cadr exp))) + (list + (make-syntactic-closure env '() (caddr exp)))) + `(set! ,list (cons ,item ,list)))))) +</pre></td></tr></table><P> + +In this example, the identifiers <CODE>set!</CODE> and <CODE>cons</CODE> are closed +in the transformer environment, and thus will not be affected by the +meanings of those identifiers in the usage environment +<CODE>env</CODE>. +</P> +<P> + +Some macros may be non-hygienic by design. For example, the following +defines a loop macro that implicitly binds <CODE>exit</CODE> to an escape +procedure. The binding of <CODE>exit</CODE> is intended to capture free +references to <CODE>exit</CODE> in the body of the loop, so <CODE>exit</CODE> must +be left free when the body is closed: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define-syntax loop + (transformer + (lambda (exp env) + (let ((body (cdr exp))) + `(call-with-current-continuation + (lambda (exit) + (let f () + ,@(map (lambda (exp) + (make-syntactic-closure env '(exit) + exp)) + body) + (f)))))))) +</pre></td></tr></table><P> + +To assign meanings to the identifiers in a form, use +<CODE>make-syntactic-closure</CODE> to close the form in a syntactic +environment. +</P> +</DL> +<P> + +<A NAME="IDX138"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-syntactic-closure</B> <I>environment free-names form</I> +<DD><P> + +<VAR>environment</VAR> must be a syntactic environment, <VAR>free-names</VAR> must +be a list of identifiers, and <VAR>form</VAR> must be a form. +<CODE>make-syntactic-closure</CODE> constructs and returns a syntactic closure +of <VAR>form</VAR> in <VAR>environment</VAR>, which can be used anywhere that +<VAR>form</VAR> could have been used. All the identifiers used in +<VAR>form</VAR>, except those explicitly excepted by <VAR>free-names</VAR>, obtain +their meanings from <VAR>environment</VAR>. +</P> +<P> + +Here is an example where <VAR>free-names</VAR> is something other than the +empty list. It is instructive to compare the use of <VAR>free-names</VAR> in +this example with its use in the <CODE>loop</CODE> example above: the examples +are similar except for the source of the identifier being left +free. +<TABLE><tr><td> </td><td class=example><pre>(define-syntax let1 + (transformer + (lambda (exp env) + (let ((id (cadr exp)) + (init (caddr exp)) + (exp (cadddr exp))) + `((lambda (,id) + ,(make-syntactic-closure env (list id) exp)) + ,(make-syntactic-closure env '() init)))))) +</pre></td></tr></table><P> + +<CODE>let1</CODE> is a simplified version of <CODE>let</CODE> that only binds a +single identifier, and whose body consists of a single expression. When +the body expression is syntactically closed in its original syntactic +environment, the identifier that is to be bound by <CODE>let1</CODE> must be +left free, so that it can be properly captured by the <CODE>lambda</CODE> in +the output form. +</P> +<P> + +To obtain a syntactic environment other than the usage environment, use +<CODE>capture-syntactic-environment</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX139"></A> +</P> +<DL> +<DT><U>Function:</U> <B>capture-syntactic-environment</B> <I>procedure</I> +<DD><P> + +<CODE>capture-syntactic-environment</CODE> returns a form that will, when +transformed, call <VAR>procedure</VAR> on the current syntactic environment. +<VAR>procedure</VAR> should compute and return a new form to be transformed, +in that same syntactic environment, in place of the form. +</P> +<P> + +An example will make this clear. Suppose we wanted to define a simple +<CODE>loop-until</CODE> keyword equivalent to +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define-syntax loop-until + (syntax-rules () + ((loop-until id init test return step) + (letrec ((loop + (lambda (id) + (if test return (loop step))))) + (loop init))))) +</pre></td></tr></table><P> + +The following attempt at defining <CODE>loop-until</CODE> has a subtle bug: +<TABLE><tr><td> </td><td class=example><pre>(define-syntax loop-until + (transformer + (lambda (exp env) + (let ((id (cadr exp)) + (init (caddr exp)) + (test (cadddr exp)) + (return (cadddr (cdr exp))) + (step (cadddr (cddr exp))) + (close + (lambda (exp free) + (make-syntactic-closure env free exp)))) + `(letrec ((loop + (lambda (,id) + (if ,(close test (list id)) + ,(close return (list id)) + (loop ,(close step (list id))))))) + (loop ,(close init '()))))))) +</pre></td></tr></table><P> + +This definition appears to take all of the proper precautions to prevent +unintended captures. It carefully closes the subexpressions in their +original syntactic environment and it leaves the <CODE>id</CODE> identifier +free in the <CODE>test</CODE>, <CODE>return</CODE>, and <CODE>step</CODE> expressions, so +that it will be captured by the binding introduced by the <CODE>lambda</CODE> +expression. Unfortunately it uses the identifiers <CODE>if</CODE> and +<CODE>loop</CODE> within that <CODE>lambda</CODE> expression, so if the user of +<CODE>loop-until</CODE> just happens to use, say, <CODE>if</CODE> for the +identifier, it will be inadvertently captured. +</P> +<P> + +The syntactic environment that <CODE>if</CODE> and <CODE>loop</CODE> want to be +exposed to is the one just outside the <CODE>lambda</CODE> expression: before +the user's identifier is added to the syntactic environment, but after +the identifier loop has been added. +<CODE>capture-syntactic-environment</CODE> captures exactly that environment +as follows: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define-syntax loop-until + (transformer + (lambda (exp env) + (let ((id (cadr exp)) + (init (caddr exp)) + (test (cadddr exp)) + (return (cadddr (cdr exp))) + (step (cadddr (cddr exp))) + (close + (lambda (exp free) + (make-syntactic-closure env free exp)))) + `(letrec ((loop + ,(capture-syntactic-environment + (lambda (env) + `(lambda (,id) + (,(make-syntactic-closure env '() `if) + ,(close test (list id)) + ,(close return (list id)) + (,(make-syntactic-closure env '() + `loop) + ,(close step (list id))))))))) + (loop ,(close init '()))))))) +</pre></td></tr></table><P> + +In this case, having captured the desired syntactic environment, it is +convenient to construct syntactic closures of the identifiers <CODE>if</CODE> +and the <CODE>loop</CODE> and use them in the body of the +<CODE>lambda</CODE>. +</P> +<P> + +A common use of <CODE>capture-syntactic-environment</CODE> is to get the +transformer environment of a macro transformer: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(transformer + (lambda (exp env) + (capture-syntactic-environment + (lambda (transformer-env) + ...)))) +</pre></td></tr></table></DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC34"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC33"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC35"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 3.5.1.3 Identifiers </H4> +<!--docid::SEC34::--> +<P> + +This section describes the procedures that create and manipulate +identifiers. Previous syntactic closure proposals did not have an +identifier data type -- they just used symbols. The identifier data +type extends the syntactic closures facility to be compatible with the +high-level <CODE>syntax-rules</CODE> facility. +</P> +<P> + +As discussed earlier, an identifier is either a symbol or an +<EM>alias</EM>. An alias is implemented as a syntactic closure whose +<EM>form</EM> is an identifier: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(make-syntactic-closure env '() 'a) + => an <EM>alias</EM> +</pre></td></tr></table><P> + +Aliases are implemented as syntactic closures because they behave just +like syntactic closures most of the time. The difference is that an +alias may be bound to a new value (for example by <CODE>lambda</CODE> or +<CODE>let-syntax</CODE>); other syntactic closures may not be used this way. +If an alias is bound, then within the scope of that binding it is looked +up in the syntactic environment just like any other identifier. +</P> +<P> + +Aliases are used in the implementation of the high-level facility +<CODE>syntax-rules</CODE>. A macro transformer created by <CODE>syntax-rules</CODE> +uses a template to generate its output form, substituting subforms of +the input form into the template. In a syntactic closures +implementation, all of the symbols in the template are replaced by +aliases closed in the transformer environment, while the output form +itself is closed in the usage environment. This guarantees that the +macro transformation is hygienic, without requiring the transformer to +know the syntactic roles of the substituted input subforms. +</P> +<P> + +<A NAME="IDX140"></A> +</P> +<DL> +<DT><U>Function:</U> <B>identifier?</B> <I>object</I> +<DD>Returns <CODE>#t</CODE> if <VAR>object</VAR> is an identifier, otherwise returns +<CODE>#f</CODE>. Examples: +<P> + +<TABLE><tr><td> </td><td class=example><pre>(identifier? 'a) + => #t +(identifier? (make-syntactic-closure env '() 'a)) + => #t +(identifier? "a") + => #f +(identifier? #\a) + => #f +(identifier? 97) + => #f +(identifier? #f) + => #f +(identifier? '(a)) + => #f +(identifier? '#(a)) + => #f +</pre></td></tr></table><P> + +The predicate <CODE>eq?</CODE> is used to determine if two identifers are +"the same". Thus <CODE>eq?</CODE> can be used to compare identifiers +exactly as it would be used to compare symbols. Often, though, it is +useful to know whether two identifiers "mean the same thing". For +example, the <CODE>cond</CODE> macro uses the symbol <CODE>else</CODE> to identify +the final clause in the conditional. A macro transformer for +<CODE>cond</CODE> cannot just look for the symbol <CODE>else</CODE>, because the +<CODE>cond</CODE> form might be the output of another macro transformer that +replaced the symbol <CODE>else</CODE> with an alias. Instead the transformer +must look for an identifier that "means the same thing" in the usage +environment as the symbol <CODE>else</CODE> means in the transformer +environment. +</P> +</DL> +<P> + +<A NAME="IDX141"></A> +</P> +<DL> +<DT><U>Function:</U> <B>identifier=?</B> <I>environment1 identifier1 environment2 identifier2</I> +<DD><VAR>environment1</VAR> and <VAR>environment2</VAR> must be syntactic +environments, and <VAR>identifier1</VAR> and <VAR>identifier2</VAR> must be +identifiers. <CODE>identifier=?</CODE> returns <CODE>#t</CODE> if the meaning of +<VAR>identifier1</VAR> in <VAR>environment1</VAR> is the same as that of +<VAR>identifier2</VAR> in <VAR>environment2</VAR>, otherwise it returns <CODE>#f</CODE>. +Examples: +<P> + +<TABLE><tr><td> </td><td class=example><pre>(let-syntax + ((foo + (transformer + (lambda (form env) + (capture-syntactic-environment + (lambda (transformer-env) + (identifier=? transformer-env 'x env 'x))))))) + (list (foo) + (let ((x 3)) + (foo)))) + => (#t #f) +</pre></td></tr></table><P> + +<TABLE><tr><td> </td><td class=example><pre>(let-syntax ((bar foo)) + (let-syntax + ((foo + (transformer + (lambda (form env) + (capture-syntactic-environment + (lambda (transformer-env) + (identifier=? transformer-env 'foo + env (cadr form)))))))) + (list (foo foo) + (foobar)))) + => (#f #t) +</pre></td></tr></table></DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC35"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC34"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC36"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 3.5.1.4 Acknowledgements </H4> +<!--docid::SEC35::--> +<P> + +The syntactic closures facility was invented by Alan Bawden and Jonathan +Rees. The use of aliases to implement <CODE>syntax-rules</CODE> was invented +by Alan Bawden (who prefers to call them <EM>synthetic names</EM>). Much +of this proposal is derived from an earlier proposal by Alan +Bawden. +</P> +<P> + +<A NAME="Syntax-Case Macros"></A> +<HR SIZE="6"> +<A NAME="SEC36"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC35"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC37"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 3.6 Syntax-Case Macros </H2> +<!--docid::SEC36::--> +<P> + +<CODE>(require 'syntax-case)</CODE> +<A NAME="IDX142"></A> +</P> +<P> + +<A NAME="IDX143"></A> +</P> +<DL> +<DT><U>Function:</U> <B>macro:expand</B> <I>expression</I> +<DD><A NAME="IDX144"></A> +<DT><U>Function:</U> <B>syncase:expand</B> <I>expression</I> +<DD>Returns scheme code with the macros and derived expression types of +<VAR>expression</VAR> expanded to primitive expression types. +</DL> +<P> + +<A NAME="IDX145"></A> +</P> +<DL> +<DT><U>Function:</U> <B>macro:eval</B> <I>expression</I> +<DD><A NAME="IDX146"></A> +<DT><U>Function:</U> <B>syncase:eval</B> <I>expression</I> +<DD><CODE>macro:eval</CODE> returns the value of <VAR>expression</VAR> in the current +top level environment. <VAR>expression</VAR> can contain macro definitions. +Side effects of <VAR>expression</VAR> will affect the top level +environment. +</DL> +<P> + +<A NAME="IDX147"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>macro:load</B> <I>filename</I> +<DD><A NAME="IDX148"></A> +<DT><U>Procedure:</U> <B>syncase:load</B> <I>filename</I> +<DD><VAR>filename</VAR> should be a string. If filename names an existing file, +the <CODE>macro:load</CODE> procedure reads Scheme source code expressions and +definitions from the file and evaluates them sequentially. These +source code expressions and definitions may contain macro definitions. +The <CODE>macro:load</CODE> procedure does not affect the values returned by +<CODE>current-input-port</CODE> and <CODE>current-output-port</CODE>. +</DL> +<P> + +This is version 2.1 of <CODE>syntax-case</CODE>, the low-level macro facility +proposed and implemented by Robert Hieb and R. Kent Dybvig. +</P> +<P> + +This version is further adapted by Harald Hanche-Olsen +<hanche @ imf.unit.no> to make it compatible with, and easily usable +with, SLIB. Mainly, these adaptations consisted of: +</P> +<P> + +<UL> +<LI> +Removing white space from `<TT>expand.pp</TT>' to save space in the +distribution. This file is not meant for human readers anyway<small>...</small> +<P> + +</P> +<LI> +Removed a couple of Chez scheme dependencies. +<P> + +</P> +<LI> +Renamed global variables used to minimize the possibility of name +conflicts. +<P> + +</P> +<LI> +Adding an SLIB-specific initialization file. +<P> + +</P> +<LI> +Removing a couple extra files, most notably the documentation (but see +below). +</UL> +<P> + +If you wish, you can see exactly what changes were done by reading the +shell script in the file `<TT>syncase.sh</TT>'. +</P> +<P> + +The two PostScript files were omitted in order to not burden the SLIB +distribution with them. If you do intend to use <CODE>syntax-case</CODE>, +however, you should get these files and print them out on a PostScript +printer. They are available with the original <CODE>syntax-case</CODE> +distribution by anonymous FTP in +`<TT>cs.indiana.edu:/pub/scheme/syntax-case</TT>'. +</P> +<P> + +In order to use syntax-case from an interactive top level, execute: +<TABLE><tr><td> </td><td class=example><pre>(require 'syntax-case) +<A NAME="IDX149"></A>(require 'repl) +<A NAME="IDX150"></A>(repl:top-level macro:eval) +</pre></td></tr></table>See the section Repl (see section <A HREF="slib_7.html#SEC264">7.5.1 Repl</A>) for more information. +<P> + +To check operation of syntax-case get +`<TT>cs.indiana.edu:/pub/scheme/syntax-case</TT>', and type +<TABLE><tr><td> </td><td class=example><pre>(require 'syntax-case) +<A NAME="IDX151"></A><A NAME="IDX152"></A>(syncase:sanity-check) +</pre></td></tr></table><P> + +Beware that <CODE>syntax-case</CODE> takes a long time to load -- about 20s on +a SPARCstation SLC (with SCM) and about 90s on a Macintosh SE/30 (with +Gambit). +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC37"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC36"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC38"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.6.1 Notes </H3> +<!--docid::SEC37::--> +<P> + +All R4RS syntactic forms are defined, including <CODE>delay</CODE>. Along +with <CODE>delay</CODE> are simple definitions for <CODE>make-promise</CODE> (into +which <CODE>delay</CODE> expressions expand) and <CODE>force</CODE>. +</P> +<P> + +<CODE>syntax-rules</CODE> and <CODE>with-syntax</CODE> (described in <CITE>TR356</CITE>) +are defined. +</P> +<P> + +<CODE>syntax-case</CODE> is actually defined as a macro that expands into +calls to the procedure <CODE>syntax-dispatch</CODE> and the core form +<CODE>syntax-lambda</CODE>; do not redefine these names. +</P> +<P> + +Several other top-level bindings not documented in TR356 are created: +<UL> +<LI>the "hooks" in `<TT>hooks.ss</TT>' +<LI>the <CODE>build-</CODE> procedures in `<TT>output.ss</TT>' +<LI><CODE>expand-syntax</CODE> (the expander) +</UL> +<P> + +The syntax of define has been extended to allow <CODE>(define <VAR>id</VAR>)</CODE>, +which assigns <VAR>id</VAR> to some unspecified value. +</P> +<P> + +We have attempted to maintain R4RS compatibility where possible. The +incompatibilities should be confined to `<TT>hooks.ss</TT>'. Please let us +know if there is some incompatibility that is not flagged as such. +</P> +<P> + +Send bug reports, comments, suggestions, and questions to Kent Dybvig +(dyb @ iuvax.cs.indiana.edu). +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC38"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC37"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC39"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.6.2 Note from SLIB maintainer </H3> +<!--docid::SEC38::--> +<P> + +<CODE>(require 'structure)</CODE> +</P> +<P> + +<A NAME="IDX153"></A> +Included with the <CODE>syntax-case</CODE> files was `<TT>structure.scm</TT>' +which defines a macro <CODE>define-structure</CODE>. I have no +documentation for this macro; it is not used by any other code in +SLIB. +</P> +<P> + +<A NAME="Fluid-Let"></A> +<HR SIZE="6"> +<A NAME="SEC39"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC38"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 3.7 Fluid-Let </H2> +<!--docid::SEC39::--> +<P> + +<CODE>(require 'fluid-let)</CODE> +<A NAME="IDX154"></A> +</P> +<P> + +<A NAME="IDX155"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>fluid-let</B> <I><CODE>(<VAR>bindings</VAR> <small>...</small>)</CODE> <VAR>forms</VAR><small>...</small></I> +<DD></DL> +<TABLE><tr><td> </td><td class=example><pre>(fluid-let ((<VAR>variable</VAR> <VAR>init</VAR>) <small>...</small>) + <VAR>expression</VAR> <VAR>expression</VAR> <small>...</small>) +</pre></td></tr></table><P> + +The <VAR>init</VAR>s are evaluated in the current environment (in some +unspecified order), the current values of the <VAR>variable</VAR>s are saved, +the results are assigned to the <VAR>variable</VAR>s, the <VAR>expression</VAR>s +are evaluated sequentially in the current environment, the +<VAR>variable</VAR>s are restored to their original values, and the value of +the last <VAR>expression</VAR> is returned. +</P> +<P> + +The syntax of this special form is similar to that of <CODE>let</CODE>, but +<CODE>fluid-let</CODE> temporarily rebinds existing <VAR>variable</VAR>s. Unlike +<CODE>let</CODE>, <CODE>fluid-let</CODE> creates no new bindings; instead it +<EM>assigns</EM> the values of each <VAR>init</VAR> to the binding (determined +by the rules of lexical scoping) of its corresponding +<VAR>variable</VAR>. +</P> +<P> + +<A NAME="Yasos"></A> +<HR SIZE="6"> +<A NAME="SEC40"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC39"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC41"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 3.8 Yasos </H2> +<!--docid::SEC40::--> +<P> + +<CODE>(require 'oop)</CODE> or <CODE>(require 'yasos)</CODE> +<A NAME="IDX156"></A> +<A NAME="IDX157"></A> +</P> +<P> + +`Yet Another Scheme Object System' is a simple object system for Scheme +based on the paper by Norman Adams and Jonathan Rees: <CITE>Object +Oriented Programming in Scheme</CITE>, Proceedings of the 1988 ACM Conference +on LISP and Functional Programming, July 1988 [ACM #552880]. +</P> +<P> + +Another reference is: +</P> +<P> + +Ken Dickey. +<A HREF="ftp://ftp.cs.indiana.edu/pub/scheme-repository/doc/pubs/swob.txt"> +Scheming with Objects +</A> +<CITE>AI Expert</CITE> Volume 7, Number 10 (October 1992), pp. 24-33. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC41">3.8.1 Terms</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Definitions and disclaimer.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC42">3.8.2 Interface</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">The Yasos macros and procedures.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Dylan-like setters in Yasos.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_3.html#SEC44">3.8.4 Examples</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Usage of Yasos and setters.</TD></TR> +</TABLE> +<P> + +<A NAME="Yasos terms"></A> +<HR SIZE="6"> +<A NAME="SEC41"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC42"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.8.1 Terms </H3> +<!--docid::SEC41::--> +<P> + +</P> +<DL COMPACT> +<DT><EM>Object</EM> +<DD>Any Scheme data object. +<P> + +</P> +<DT><EM>Instance</EM> +<DD>An instance of the OO system; an <EM>object</EM>. +<P> + +</P> +<DT><EM>Operation</EM> +<DD>A <VAR>method</VAR>. +</DL> +<P> + +</P> +<DL COMPACT> +<DT><EM>Notes:</EM> +<DD>The object system supports multiple inheritance. An instance can +inherit from 0 or more ancestors. In the case of multiple inherited +operations with the same identity, the operation used is that from the +first ancestor which contains it (in the ancestor <CODE>let</CODE>). An +operation may be applied to any Scheme data object--not just instances. +As code which creates instances is just code, there are no <EM>classes</EM> +and no meta-<VAR>anything</VAR>. Method dispatch is by a procedure call a la +CLOS rather than by <CODE>send</CODE> syntax a la Smalltalk. +<P> + +</P> +<DT><EM>Disclaimer:</EM> +<DD>There are a number of optimizations which can be made. This +implementation is expository (although performance should be quite +reasonable). See the L&FP paper for some suggestions. +</DL> +<P> + +<A NAME="Yasos interface"></A> +<HR SIZE="6"> +<A NAME="SEC42"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC41"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC43"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.8.2 Interface </H3> +<!--docid::SEC42::--> +<P> + +<A NAME="IDX158"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>define-operation</B> <I><CODE>(</CODE>opname self arg <small>...</small><CODE>)</CODE> <VAR>default-body</VAR></I> +<DD>Defines a default behavior for data objects which don't handle the +operation <VAR>opname</VAR>. The default behavior (for an empty +<VAR>default-body</VAR>) is to generate an error. +</DL> +<P> + +<A NAME="IDX159"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>define-predicate</B> <I>opname?</I> +<DD>Defines a predicate <VAR>opname?</VAR>, usually used for determining the +<EM>type</EM> of an object, such that <CODE>(<VAR>opname?</VAR> <VAR>object</VAR>)</CODE> +returns <CODE>#t</CODE> if <VAR>object</VAR> has an operation <VAR>opname?</VAR> and +<CODE>#f</CODE> otherwise. +</DL> +<P> + +<A NAME="IDX160"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>object</B> <I><CODE>((<VAR>name</VAR> <VAR>self</VAR> <VAR>arg</VAR> <small>...</small>) <VAR>body</VAR>)</CODE> <small>...</small></I> +<DD>Returns an object (an instance of the object system) with operations. +Invoking <CODE>(<VAR>name</VAR> <VAR>object</VAR> <VAR>arg</VAR> <small>...</small></CODE> executes the +<VAR>body</VAR> of the <VAR>object</VAR> with <VAR>self</VAR> bound to <VAR>object</VAR> and +with argument(s) <VAR>arg</VAR><small>...</small>. +</DL> +<P> + +<A NAME="IDX161"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>object-with-ancestors</B> <I><CODE>((</CODE>ancestor1 init1<CODE>)</CODE> <small>...</small><CODE>)</CODE> operation <small>...</small></I> +<DD>A <CODE>let</CODE>-like form of <CODE>object</CODE> for multiple inheritance. It +returns an object inheriting the behaviour of <VAR>ancestor1</VAR> etc. An +operation will be invoked in an ancestor if the object itself does not +provide such a method. In the case of multiple inherited operations +with the same identity, the operation used is the one found in the first +ancestor in the ancestor list. +</DL> +<P> + +<A NAME="IDX162"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>operate-as</B> <I>component operation self arg <small>...</small></I> +<DD>Used in an operation definition (of <VAR>self</VAR>) to invoke the +<VAR>operation</VAR> in an ancestor <VAR>component</VAR> but maintain the object's +identity. Also known as "send-to-super". +</DL> +<P> + +<A NAME="IDX163"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>print</B> <I>obj port</I> +<DD>A default <CODE>print</CODE> operation is provided which is just <CODE>(format +<VAR>port</VAR> <VAR>obj</VAR>)</CODE> (see section <A HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A>) for non-instances and prints +<VAR>obj</VAR> preceded by `<SAMP>#<INSTANCE></SAMP>' for instances. +</DL> +<P> + +<A NAME="IDX164"></A> +</P> +<DL> +<DT><U>Function:</U> <B>size</B> <I>obj</I> +<DD>The default method returns the number of elements in <VAR>obj</VAR> if it is +a vector, string or list, <CODE>2</CODE> for a pair, <CODE>1</CODE> for a character +and by default id an error otherwise. Objects such as collections +(see section <A HREF="slib_7.html#SEC194">7.1.9 Collections</A>) may override the default in an obvious way. +</DL> +<P> + +<A NAME="Setters"></A> +<HR SIZE="6"> +<A NAME="SEC43"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC42"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC44"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.8.3 Setters </H3> +<!--docid::SEC43::--> +<P> + +<EM>Setters</EM> implement <EM>generalized locations</EM> for objects +associated with some sort of mutable state. A <EM>getter</EM> operation +retrieves a value from a generalized location and the corresponding +setter operation stores a value into the location. Only the getter is +named -- the setter is specified by a procedure call as below. (Dylan +uses special syntax.) Typically, but not necessarily, getters are +access operations to extract values from Yasos objects (see section <A HREF="slib_3.html#SEC40">3.8 Yasos</A>). +Several setters are predefined, corresponding to getters <CODE>car</CODE>, +<CODE>cdr</CODE>, <CODE>string-ref</CODE> and <CODE>vector-ref</CODE> e.g., <CODE>(setter +car)</CODE> is equivalent to <CODE>set-car!</CODE>. +</P> +<P> + +This implementation of setters is similar to that in Dylan(TM) +(<CITE>Dylan: An object-oriented dynamic language</CITE>, Apple Computer +Eastern Research and Technology). Common LISP provides similar +facilities through <CODE>setf</CODE>. +</P> +<P> + +<A NAME="IDX165"></A> +</P> +<DL> +<DT><U>Function:</U> <B>setter</B> <I>getter</I> +<DD>Returns the setter for the procedure <VAR>getter</VAR>. E.g., since +<CODE>string-ref</CODE> is the getter corresponding to a setter which is +actually <CODE>string-set!</CODE>: +<TABLE><tr><td> </td><td class=example><pre>(define foo "foo") +((setter string-ref) foo 0 #\F) ; set element 0 of foo +foo => "Foo" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX166"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>set</B> <I>place new-value</I> +<DD>If <VAR>place</VAR> is a variable name, <CODE>set</CODE> is equivalent to +<CODE>set!</CODE>. Otherwise, <VAR>place</VAR> must have the form of a procedure +call, where the procedure name refers to a getter and the call indicates +an accessible generalized location, i.e., the call would return a value. +The return value of <CODE>set</CODE> is usually unspecified unless used with a +setter whose definition guarantees to return a useful value. +<TABLE><tr><td> </td><td class=example><pre>(set (string-ref foo 2) #\O) ; generalized location with getter +foo => "FoO" +(set foo "foo") ; like set! +foo => "foo" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX167"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>add-setter</B> <I>getter setter</I> +<DD>Add procedures <VAR>getter</VAR> and <VAR>setter</VAR> to the (inaccessible) list +of valid setter/getter pairs. <VAR>setter</VAR> implements the store +operation corresponding to the <VAR>getter</VAR> access operation for the +relevant state. The return value is unspecified. +</DL> +<P> + +<A NAME="IDX168"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>remove-setter-for</B> <I>getter</I> +<DD>Removes the setter corresponding to the specified <VAR>getter</VAR> from the +list of valid setters. The return value is unspecified. +</DL> +<P> + +<A NAME="IDX169"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>define-access-operation</B> <I>getter-name</I> +<DD>Shorthand for a Yasos <CODE>define-operation</CODE> defining an operation +<VAR>getter-name</VAR> that objects may support to return the value of some +mutable state. The default operation is to signal an error. The return +value is unspecified. +</DL> +<P> + +<A NAME="Yasos examples"></A> +<HR SIZE="6"> +<A NAME="SEC44"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC43"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC40"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 3.8.4 Examples </H3> +<!--docid::SEC44::--> +<P> + +<TABLE><tr><td> </td><td class=example><pre>;;; These definitions for PRINT and SIZE are +;;; already supplied by +(require 'yasos) + +(define-operation (print obj port) + (format port + (if (instance? obj) "#<instance>" "~s") + obj)) + +(define-operation (size obj) + (cond + ((vector? obj) (vector-length obj)) + ((list? obj) (length obj)) + ((pair? obj) 2) + ((string? obj) (string-length obj)) + ((char? obj) 1) + (else + (slib:error "Operation not supported: size" obj)))) + +(define-predicate cell?) +(define-operation (fetch obj)) +(define-operation (store! obj newValue)) + +(define (make-cell value) + (object + ((cell? self) #t) + ((fetch self) value) + ((store! self newValue) + (set! value newValue) + newValue) + ((size self) 1) + ((print self port) + (format port "#<Cell: ~s>" (fetch self))))) + +(define-operation (discard obj value) + (format #t "Discarding ~s~%" value)) + +(define (make-filtered-cell value filter) + (object-with-ancestors + ((cell (make-cell value))) + ((store! self newValue) + (if (filter newValue) + (store! cell newValue) + (discard self newValue))))) + +(define-predicate array?) +(define-operation (array-ref array index)) +(define-operation (array-set! array index value)) + +(define (make-array num-slots) + (let ((anArray (make-vector num-slots))) + (object + ((array? self) #t) + ((size self) num-slots) + ((array-ref self index) + (vector-ref anArray index)) + ((array-set! self index newValue) + (vector-set! anArray index newValue)) + ((print self port) + (format port "#<Array ~s>" (size self)))))) + +(define-operation (position obj)) +(define-operation (discarded-value obj)) + +(define (make-cell-with-history value filter size) + (let ((pos 0) (most-recent-discard #f)) + (object-with-ancestors + ((cell (make-filtered-call value filter)) + (sequence (make-array size))) + ((array? self) #f) + ((position self) pos) + ((store! self newValue) + (operate-as cell store! self newValue) + (array-set! self pos newValue) + (set! pos (+ pos 1))) + ((discard self value) + (set! most-recent-discard value)) + ((discarded-value self) most-recent-discard) + ((print self port) + (format port "#<Cell-with-history ~s>" + (fetch self)))))) + +(define-access-operation fetch) +(add-setter fetch store!) +(define foo (make-cell 1)) +(print foo #f) +=> "#<Cell: 1>" +(set (fetch foo) 2) +=> +(print foo #f) +=> "#<Cell: 2>" +(fetch foo) +=> 2 +</pre></td></tr></table><P> + +<A NAME="Textual Conversion Packages"></A> +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_4.html b/slib_4.html new file mode 100644 index 0000000..4aa89a0 --- /dev/null +++ b/slib_4.html @@ -0,0 +1,5157 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Textual Conversion Packages</TITLE> + +<META NAME="description" CONTENT="SLIB: Textual Conversion Packages"> +<META NAME="keywords" CONTENT="SLIB: Textual Conversion Packages"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC45"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC44"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC46"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_3.html#SEC21"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC47"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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> </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> </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> </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> </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> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC48"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC49"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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> </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> </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> </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> </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> </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> </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> </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> </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> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC50"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </td><td class=example><pre>(set! *syn-defs* '()) +</pre></td></tr></table>or +<P> + +<TABLE><tr><td> </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> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC51"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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>"0123456789"</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 +("ABCDEFGHIJKLMNOPQRSTUVWXYZ"). +</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 +("abcdefghijklmnopqrstuvwxyz"). +</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC52"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC53"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC54"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> + +<A NAME="format"></A> +<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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC55"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC56"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC57"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> + +<A NAME="printf"></A> +<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> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC58"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC59"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC60"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC61"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC62"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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> </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> </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> </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> </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> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC63"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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>"-"</CODE>, <CODE>getopt</CODE> returns <CODE>#f</CODE> without changing +<VAR>*optind*</VAR>. If <CODE>(vector-ref argv *optind*)</CODE> is the string +<CODE>"--"</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>"--"</CODE> can be used to delimit the end of the +options; <CODE>#f</CODE> is returned, and <CODE>"--"</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> </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 ":a:b:cd") +(let loop ((opt (getopt (length argv) argv opts))) + (case opt + ((#\a) (print "option a: " *optarg*)) + ((#\b) (print "option b: " *optarg*)) + ((#\c) (print "option c")) + ((#\d) (print "option d")) + ((#\?) (print "error" getopt:opt)) + ((#\:) (print "missing arg" getopt:opt)) + ((#f) (if (< *optind* (length argv)) + (print "argv[" *optind* "]=" + (list-ref argv *optind*))) + (set! *optind* (+ *optind* 1)))) + (if (< *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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC64"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </td><td class=example><pre>(define opts ":-:b:") +(define *argv* '("foo" "-b9" "--f1" "--2=" "--g3=35234.342" "--")) +(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 "9" +3 "f1" #f +4 "2" "" +5 "g3" "35234.342" +5 #f "35234.342" +</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC65"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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>"</SAMP>' +<DD>The characters up to the next unescaped <KBD>"</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC66"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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->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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC67"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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->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->arglist</B> <I>optnames positions arities types defaulters checks aliases desc <small>...</small></I> +<DD><P> + +Like <CODE>getopt->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> </td><td class=example><pre>(begin + (set! *optind* 1) + (set! *argv* '("cmd" "-?") + (getopt->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) + '(("flag" flag) + ("f" flag) + ("Flag" flag2) + ("B" flag3) + ("optional" number) + ("o" number) + ("nary1" symbols) + ("N" symbols) + ("nary" symbols) + ("n" symbols) + ("single" string) + ("s" string) + ("a" num2) + ("Abs" num3)))) +-| +Usage: cmd [OPTION ARGUMENT ...] ... + + -f, --flag + -o, --optional=<number> + -n, --nary=<symbols> ... + -N, --nary1=<symbols> ... + -s, --single=<string> + --Flag + -B + -a <num2> ... + --Abs=<num3> ... + +ERROR: getopt->parameter-list "unrecognized option" "-?" +</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC68"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </td><td class=example><pre>((filename:substitute?? "scm_[0-9]*.html" "scm5c4_??.htm") + "scm_10.html") +=> "scm5c4_10.htm" +((filename:substitute?? "??" "beg?mid?end") "AZ") +=> "begAmidZend" +((filename:substitute?? "*na*" "?NA?") "banana") +=> "banaNA" +((filename:substitute?? "?*?" (lambda (s1 s2 s3) (string-append s3 s1))) + "ABZ") +=> "ZA" +</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> </td><td class=example><pre>(replace-suffix "/usr/local/lib/slib/batch.scm" ".scm" ".c") +=> "/usr/local/lib/slib/batch.c" +</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC69"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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> </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->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> </td><td class=example><pre>(truncate-up-to "/usr/local/lib/slib/batch.scm" "/") +=> "batch.scm" +</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->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->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> </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->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 + "my-batch" + (lambda (batch-port) + (adjoin-parameters! my-parameters (list 'batch-port batch-port)) + (and + (batch:comment my-parameters + "================ Write file with C program.") + (batch:rename-file my-parameters "hello.c" "hello.c~") + (batch:lines->file my-parameters "hello.c" + "#include <stdio.h>" + "int main(int argc, char **argv)" + "{" + " printf(\"hello world\\n\");" + " return 0;" + "}" ) + (batch:command my-parameters "cc" "-c" "hello.c") + (batch:command my-parameters "cc" "-o" "hello" + (replace-suffix "hello.c" ".c" ".o")) + (batch:command my-parameters "hello") + (batch:delete-file my-parameters "hello") + (batch:delete-file my-parameters "hello.c") + (batch:delete-file my-parameters "hello.o") + (batch:delete-file my-parameters "my-batch") + ))) +</pre></td></tr></table><P> + +Produces the file `<TT>my-batch</TT>': +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>#! /bin/sh +# "my-batch" 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 <stdio.h>'>>hello.c +echo 'int main(int argc, char **argv)'>>hello.c +echo '{'>>hello.c +echo ' printf("hello world\n");'>>hello.c +echo ' return 0;'>>hello.c +echo '}'>>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> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC70"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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><META +NAME="<VAR>name</VAR>" CONTENT="<VAR>content</VAR>"></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><META +HTTP-EQUIV="<VAR>name</VAR>" CONTENT="<VAR>content</VAR>"></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><HEAD></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><tag></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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC71"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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->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->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->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> </td><td class=example><pre>(require (in-vicinity (implementation-vicinity) "build.scm")) +(call-with-output-file "buildscm.html" + (lambda (port) + (display + (string-append + (html:head 'commands) + (html:body + (sprintf #f "<H2>%s:</H2><BLOCKQUOTE>%s</BLOCKQUOTE>\\n" + (html:plain 'build) + (html:plain ((comtab 'get 'documentation) 'build))) + (html:form + 'post + (or "http://localhost:8081/buildscm" "/cgi-bin/build.cgi") + (apply html:delimited-list + (apply map form:delimited + (command->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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC72"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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->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->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->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->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->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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC73"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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->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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC74"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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->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->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->html-directory</B> <I>db dir index-filename</I> +<DD><P> + +<A NAME="IDX348"></A> +<DT><U>Function:</U> <B>db->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->html-directory</CODE> creates sub-directory <VAR>dir</VAR> if neccessary, and calls +<CODE>(db->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->netscape</B> <I>db dir index-filename</I> +<DD><P> + +<A NAME="IDX350"></A> +<DT><U>Function:</U> <B>db->netscape</B> <I>db dir</I> +<DD><CODE>db->netscape</CODE> is just like <CODE>db->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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC75"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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>"POST"</SAMP>' or `<SAMP>"GET"</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> </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 "r")) + (oport (duplicate-port port "w"))) + (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>"POST"</SAMP>' +or `<SAMP>"GET"</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC76"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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><</SAMP>' and `<SAMP>></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><</SAMP>' and +`<SAMP>></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>#\<</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->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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC78"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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><A HREF="#<VAR>name</VAR>"></SAMP>' will link to this point. +<P> + +<TABLE><tr><td> </td><td class=example><pre>(html:anchor "(section 7)") +=> +"<A NAME=\"(section%207)\"></A>" +</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> </td><td class=example><pre>(html:link (make-uri "(section 7)") "section 7") +=> +"<A HREF=\"#(section%207)\">section 7</A>" +</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->tree</B> <I>uri-reference base-tree</I> +<DD><P> + +<A NAME="IDX386"></A> +<DT><U>Function:</U> <B>uri->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->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> </td><td class=example><pre>(uri->tree "http://www.ics.uci.edu/pub/ietf/uri/#Related") +=> +(http "www.ics.uci.edu" ("" "pub" "ietf" "uri" "") #f "Related") +</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->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->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->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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC79"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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> </TD><TD ALIGN="left" VALIGN="TOP">'object->string</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A></TD><TD> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC80"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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 > 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> </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> </td><td class=example><pre><VAR>display-string</VAR> == +(lambda (s) (for-each write-char (string->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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC81"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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->string)</CODE> +<A NAME="IDX409"></A> +</P> +<P> + +<A NAME="IDX410"></A> +</P> +<DL> +<DT><U>Function:</U> <B>object->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->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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC82"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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->string</B> <I>obj</I> +<DD><A NAME="IDX416"></A> +<DT><U>Procedure:</U> <B>pretty-print->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> </td><td class=example><pre>(pretty-print->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))) +=> +"((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)) +" +(pretty-print->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) +=> +"((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> + +<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> </td><td class=example><pre>(require 'pprint-file) +<A NAME="IDX422"></A>(require 'defmacroexpand) +<A NAME="IDX423"></A>(defmacro:load "my-macros.scm") +(pprint-filter-file "code.scm" defmacro:expand* "exp-code.scm") +</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC83"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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> </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> </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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC84"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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><pathname></I></TT> +<DD>If the first character of <I><pathname></I> is `<SAMP>/</SAMP>', then +<I><pathname></I> specifies the absolute pathname of a tzfile(5) format +time-zone file. Otherwise, <I><pathname></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><std></I><I><offset></I></TT> +<DD>The string <I><std></I> consists of 3 or more alphabetic characters. +<I><offset></I> specifies the time difference from GMT. The <I><offset></I> +is positive if the local time zone is west of the Prime Meridian and +negative if it is east. <I><offset></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><std></I><I><offset></I><I><dst></I></TT> +<DD><I><dst></I> is the at least 3 alphabetic characters naming the local +daylight-savings-time. +<DT><TT><I><std></I><I><offset></I><I><dst></I><I><doffset></I></TT> +<DD><I><doffset></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><date></I>/<I><time></I>,<I><date></I>/<I><time></I></TT> +<DD>The <I><time></I>s are specified like the <I><offset></I>s above, except that +leading `<SAMP>+</SAMP>' and `<SAMP>-</SAMP>' are not allowed. +<P> + +Each <I><date></I> has one of the formats: +</P> +<P> + +</P> +<DL COMPACT> +<DT><TT>J<I><day></I></TT> +<DD>specifies the Julian day with <I><day></I> between 1 and 365. February 29 +is never counted and cannot be referenced. +<DT><TT><I><day></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><month></I>.<I><week></I>.<I><day></I></TT> +<DD>This specifies day <I><day></I> (0 <= <I><day></I> <= 6) of week <I><week></I> (1 +<= <I><week></I> <= 5) of month <I><month></I> (1 <= <I><month></I> <= 12). Week +1 is the first week in which day d occurs and week 5 is the last week in +which day <I><day></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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC85"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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> </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>"Wed Jun 30 21:49:08 1993"</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC86"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC87"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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<-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<-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<-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<-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"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </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"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</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 (<identifier> <arg> ...) <expression>)</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> </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> </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"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_5.html b/slib_5.html new file mode 100644 index 0000000..b3ef4b8 --- /dev/null +++ b/slib_5.html @@ -0,0 +1,6100 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Mathematical Packages</TITLE> + +<META NAME="description" CONTENT="SLIB: Mathematical Packages"> +<META NAME="keywords" CONTENT="SLIB: Mathematical Packages"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC88"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC87"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC89"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_4.html#SEC45"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1> 5. Mathematical Packages </H1> +<!--docid::SEC88::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC89">5.1 Bit-Twiddling</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'logical</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'modular</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC96">5.3 Prime Numbers</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'factor</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC97">5.4 Random Numbers</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'random</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'fft</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'crc</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC102">5.7 Graphing</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC112">5.8 Solid Modeling</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">VRML97</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC118">5.9 Color</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC134">5.10 Root Finding</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'root</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC135">5.11 Minimizing</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'minimize</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC136">5.12 Commutative Rings</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'commutative-ring</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'determinant</TD></TR> +</TABLE> +<P> + +<A NAME="Bit-Twiddling"></A> +<HR SIZE="6"> +<A NAME="SEC89"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC90"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.1 Bit-Twiddling </H2> +<!--docid::SEC89::--> +<P> + +<CODE>(require 'logical)</CODE> +<A NAME="IDX476"></A> +</P> +<P> + +The bit-twiddling functions are made available through the use of the +<CODE>logical</CODE> package. <CODE>logical</CODE> is loaded by inserting +<CODE>(require 'logical)</CODE> before the code that uses these +<A NAME="IDX477"></A> +functions. These functions behave as though operating on integers +in two's-complement representation. +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC90"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC89"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC91"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.1.1 Bitwise Operations </H3> +<!--docid::SEC90::--> +<P> + +<A NAME="IDX478"></A> +</P> +<DL> +<DT><U>Function:</U> <B>logand</B> <I>n1 n1</I> +<DD>Returns the integer which is the bit-wise AND of the two integer +arguments. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(number->string (logand #b1100 #b1010) 2) + => "1000" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX479"></A> +</P> +<DL> +<DT><U>Function:</U> <B>logior</B> <I>n1 n2</I> +<DD>Returns the integer which is the bit-wise OR of the two integer +arguments. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(number->string (logior #b1100 #b1010) 2) + => "1110" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX480"></A> +</P> +<DL> +<DT><U>Function:</U> <B>logxor</B> <I>n1 n2</I> +<DD>Returns the integer which is the bit-wise XOR of the two integer +arguments. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(number->string (logxor #b1100 #b1010) 2) + => "110" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX481"></A> +</P> +<DL> +<DT><U>Function:</U> <B>lognot</B> <I>n</I> +<DD>Returns the integer which is the 2s-complement of the integer argument. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(number->string (lognot #b10000000) 2) + => "-10000001" +(number->string (lognot #b0) 2) + => "-1" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX482"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bitwise-if</B> <I>mask n0 n1</I> +<DD>Returns an integer composed of some bits from integer <VAR>n0</VAR> and some +from integer <VAR>n1</VAR>. A bit of the result is taken from <VAR>n0</VAR> if the +corresponding bit of integer <VAR>mask</VAR> is 1 and from <VAR>n1</VAR> if that bit +of <VAR>mask</VAR> is 0. +</DL> +<P> + +<A NAME="IDX483"></A> +</P> +<DL> +<DT><U>Function:</U> <B>logtest</B> <I>j k</I> +<DD><TABLE><tr><td> </td><td class=example><pre>(logtest j k) == (not (zero? (logand j k))) + +(logtest #b0100 #b1011) => #f +(logtest #b0100 #b0111) => #t +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX484"></A> +</P> +<DL> +<DT><U>Function:</U> <B>logcount</B> <I>n</I> +<DD>Returns the number of bits in integer <VAR>n</VAR>. If integer is positive, +the 1-bits in its binary representation are counted. If negative, the +0-bits in its two's-complement binary representation are counted. If 0, +0 is returned. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(logcount #b10101010) + => 4 +(logcount 0) + => 0 +(logcount -2) + => 1 +</pre></td></tr></table></DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC91"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC90"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC92"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.1.2 Bit Within Word </H3> +<!--docid::SEC91::--> +<P> + +<A NAME="IDX485"></A> +</P> +<DL> +<DT><U>Function:</U> <B>logbit?</B> <I>index j</I> +<DD><TABLE><tr><td> </td><td class=example><pre>(logbit? index j) == (logtest (integer-expt 2 index) j) + +(logbit? 0 #b1101) => #t +(logbit? 1 #b1101) => #f +(logbit? 2 #b1101) => #t +(logbit? 3 #b1101) => #t +(logbit? 4 #b1101) => #f +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX486"></A> +</P> +<DL> +<DT><U>Function:</U> <B>copy-bit</B> <I>index from bit</I> +<DD>Returns an integer the same as <VAR>from</VAR> except in the <VAR>index</VAR>th bit, +which is 1 if <VAR>bit</VAR> is <CODE>#t</CODE> and 0 if <VAR>bit</VAR> is <CODE>#f</CODE>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(number->string (copy-bit 0 0 #t) 2) => "1" +(number->string (copy-bit 2 0 #t) 2) => "100" +(number->string (copy-bit 2 #b1111 #f) 2) => "1011" +</pre></td></tr></table></DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC92"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC91"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC93"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.1.3 Fields of Bits </H3> +<!--docid::SEC92::--> +<P> + +<A NAME="IDX487"></A> +</P> +<DL> +<DT><U>Function:</U> <B>logical:ones</B> <I>n</I> +<DD>Returns the smallest non-negative integer having <VAR>n</VAR> binary ones. +</DL> +<P> + +<A NAME="IDX488"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bit-field</B> <I>n start end</I> +<DD>Returns the integer composed of the <VAR>start</VAR> (inclusive) through +<VAR>end</VAR> (exclusive) bits of <VAR>n</VAR>. The <VAR>start</VAR>th bit becomes +the 0-th bit in the result. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(number->string (bit-field #b1101101010 0 4) 2) + => "1010" +(number->string (bit-field #b1101101010 4 9) 2) + => "10110" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX489"></A> +</P> +<DL> +<DT><U>Function:</U> <B>copy-bit-field</B> <I>to start end from</I> +<DD>Returns an integer the same as <VAR>to</VAR> except possibly in the +<VAR>start</VAR> (inclusive) through <VAR>end</VAR> (exclusive) bits, which are +the same as those of <VAR>from</VAR>. The 0-th bit of <VAR>from</VAR> becomes the +<VAR>start</VAR>th bit of the result. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(number->string (copy-bit-field #b1101101010 0 4 0) 2) + => "1101100000" +(number->string (copy-bit-field #b1101101010 0 4 -1) 2) + => "1101101111" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX490"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ash</B> <I>n count</I> +<DD>Returns an integer equivalent to +<CODE>(inexact->exact (floor (* <VAR>n</VAR> (expt 2 <VAR>count</VAR>))))</CODE>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(number->string (ash #b1 3) 2) + => "1000" +(number->string (ash #b1010 -1) 2) + => "101" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX491"></A> +</P> +<DL> +<DT><U>Function:</U> <B>integer-length</B> <I>n</I> +<DD>Returns the number of bits neccessary to represent <VAR>n</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(integer-length #b10101010) + => 8 +(integer-length 0) + => 0 +(integer-length #b1111) + => 4 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX492"></A> +</P> +<DL> +<DT><U>Function:</U> <B>integer-expt</B> <I>n k</I> +<DD>Returns <VAR>n</VAR> raised to the non-negative integer exponent <VAR>k</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(integer-expt 2 5) + => 32 +(integer-expt -3 3) + => -27 +</pre></td></tr></table></DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC93"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC92"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC94"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.1.4 Bit order and Lamination </H3> +<!--docid::SEC93::--> +<P> + +<A NAME="IDX493"></A> +</P> +<DL> +<DT><U>Function:</U> <B>logical:rotate</B> <I>k count len</I> +<DD>Returns the low-order <VAR>len</VAR> bits of <VAR>k</VAR> cyclically permuted +<VAR>count</VAR> bits towards high-order. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(number->string (logical:rotate #b0100 3 4) 2) +=> "10" +(number->string (logical:rotate #b0100 -1 4) 2) +=> "10" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX494"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bit-reverse</B> <I>k n</I> +<DD>Returns the low-order <VAR>k</VAR> bits of <VAR>n</VAR> with the bit order +reversed. The low-order bit of <VAR>n</VAR> is the high order bit of the +returned value. +<P> + +<TABLE><tr><td> </td><td class=example><pre>(number->string (bit-reverse 8 #xa7) 16) + => "e5" +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX495"></A> +</P> +<DL> +<DT><U>Function:</U> <B>integer->list</B> <I>k len</I> +<DD><A NAME="IDX496"></A> +<DT><U>Function:</U> <B>integer->list</B> <I>k</I> +<DD><CODE>integer->list</CODE> returns a list of <VAR>len</VAR> booleans corresponding +to each bit of the given integer. #t is coded for each 1; #f for 0. +The <VAR>len</VAR> argument defaults to <CODE>(integer-length <VAR>k</VAR>)</CODE>. +<P> + +<A NAME="IDX497"></A> +<DT><U>Function:</U> <B>list->integer</B> <I>list</I> +<DD><CODE>list->integer</CODE> returns an integer formed from the booleans in the +list <VAR>list</VAR>, which must be a list of booleans. A 1 bit is coded for +each #t; a 0 bit for #f. +</P> +<P> + +<CODE>integer->list</CODE> and <CODE>list->integer</CODE> are inverses so far as +<CODE>equal?</CODE> is concerned. +</P> +</DL> +<P> + +<A NAME="IDX498"></A> +</P> +<DL> +<DT><U>Function:</U> <B>booleans->integer</B> <I>bool1 <small>...</small></I> +<DD>Returns the integer coded by the <VAR>bool1</VAR> <small>...</small> arguments. +</DL> +<P> + +<A NAME="IDX499"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bitwise:laminate</B> <I>k1 <small>...</small></I> +<DD>Returns an integer composed of the bits of <VAR>k1</VAR> <small>...</small> interlaced +in argument order. Given <VAR>k1</VAR>, <small>...</small> <VAR>kn</VAR>, the n low-order +bits of the returned value will be the lowest-order bit of each +argument. +<P> + +<A NAME="IDX500"></A> +<DT><U>Function:</U> <B>bitwise:delaminate</B> <I>count k</I> +<DD>Returns a list of <VAR>count</VAR> integers comprised of every <VAR>count</VAR>h +bit of the integer <VAR>k</VAR>. +</P> +<P> + +For any non-negative integers <VAR>k</VAR> and <VAR>count</VAR>: +<TABLE><tr><td> </td><td class=example><pre>(eqv? k (bitwise:laminate (bitwise:delaminate count k))) +</pre></td></tr></table></DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC94"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC93"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC95"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.1.5 Gray code </H3> +<!--docid::SEC94::--> +<P> + +<A NAME="IDX501"></A> +A <EM>Gray code</EM> is an ordering of non-negative integers in which +exactly one bit differs between each pair of successive elements. There +are multiple Gray codings. An n-bit Gray code corresponds to a +Hamiltonian cycle on an n-dimensional hypercube. +</P> +<P> + +Gray codes find use communicating incrementally changing values between +asynchronous agents. De-laminated Gray codes comprise the coordinates +of Peano-Hilbert space-filling curves. +</P> +<P> + +<A NAME="IDX502"></A> +</P> +<DL> +<DT><U>Function:</U> <B>integer->gray-code</B> <I>k</I> +<DD>Converts <VAR>k</VAR> to a Gray code of the same <CODE>integer-length</CODE> as +<VAR>k</VAR>. +<P> + +<A NAME="IDX503"></A> +<DT><U>Function:</U> <B>gray-code->integer</B> <I>k</I> +<DD>Converts the Gray code <VAR>k</VAR> to an integer of the same +<CODE>integer-length</CODE> as <VAR>k</VAR>. +</P> +<P> + +For any non-negative integer <VAR>k</VAR>, +<TABLE><tr><td> </td><td class=example><pre>(eqv? k (gray-code->integer (integer->gray-code k))) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX504"></A> +</P> +<DL> +<DT><U>Function:</U> <B>=</B> <I>k1 k2</I> +<DD><A NAME="IDX505"></A> +<DT><U>Function:</U> <B>gray-code<?</B> <I>k1 k2</I> +<DD><A NAME="IDX506"></A> +<DT><U>Function:</U> <B>gray-code>?</B> <I>k1 k2</I> +<DD><A NAME="IDX507"></A> +<DT><U>Function:</U> <B>gray-code<=?</B> <I>k1 k2</I> +<DD><A NAME="IDX508"></A> +<DT><U>Function:</U> <B>gray-code>=?</B> <I>k1 k2</I> +<DD>These procedures return #t if their Gray code arguments are +(respectively): equal, monotonically increasing, monotonically +decreasing, monotonically nondecreasing, or monotonically nonincreasing. +<P> + +For any non-negative integers <VAR>k1</VAR> and <VAR>k2</VAR>, the Gray code +predicate of <CODE>(integer->gray-code k1)</CODE> and +<CODE>(integer->gray-code k2)</CODE> will return the same value as the +corresponding predicate of <VAR>k1</VAR> and <VAR>k2</VAR>. +</P> +</DL> +<P> + +<A NAME="Modular Arithmetic"></A> +<HR SIZE="6"> +<A NAME="SEC95"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC94"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC96"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.2 Modular Arithmetic </H2> +<!--docid::SEC95::--> +<P> + +<CODE>(require 'modular)</CODE> +<A NAME="IDX509"></A> +</P> +<P> + +<A NAME="IDX510"></A> +</P> +<DL> +<DT><U>Function:</U> <B>mod</B> <I>x1 x2</I> +<DD><A NAME="IDX511"></A> +<DT><U>Function:</U> <B>rem</B> <I>x1 x2</I> +<DD><P> + +These procedures implement the Common-Lisp functions of the same names. +The real number <VAR>x2</VAR> must be non-zero. +<CODE>mod</CODE> returns <CODE>(- <VAR>x1</VAR> (* <VAR>x2</VAR> (floor (/ <VAR>x1</VAR> <VAR>x2</VAR>))))</CODE>. +<CODE>rem</CODE> returns <CODE>(- <VAR>x1</VAR> (* <VAR>x2</VAR> (truncate (/ <VAR>x1</VAR> <VAR>x2</VAR>))))</CODE>. +</P> +<P> + +If <VAR>x1</VAR> and <VAR>x2</VAR> are integers, then <CODE>mod</CODE> behaves like +<CODE>modulo</CODE> and <CODE>rem</CODE> behaves like <CODE>remainder</CODE>. +</P> +<P> + +<TABLE><tr><td> </td><td class=display><pre style="font-family: serif"><TT>(mod -90 360) => 270 +(rem -90 180) => -90 + +(mod 540 360) => 180 +(rem 540 360) => 180 + +(mod (* 5/2 pi) (* 2 pi)) => 1.5707963267948965 +(rem (* -5/2 pi) (* 2 pi)) => -1.5707963267948965 +</TT> +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX512"></A> +</P> +<DL> +<DT><U>Function:</U> <B>extended-euclid</B> <I>n1 n2</I> +<DD><P> + +Returns a list of 3 integers <CODE>(d x y)</CODE> such that d = gcd(<VAR>n1</VAR>, +<VAR>n2</VAR>) = <VAR>n1</VAR> * x + <VAR>n2</VAR> * y. +</P> +</DL> +<P> + +<A NAME="IDX513"></A> +</P> +<DL> +<DT><U>Function:</U> <B>symmetric:modulus</B> <I>n</I> +<DD><P> + +Returns <CODE>(quotient (+ -1 n) -2)</CODE> for positive odd integer <VAR>n</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX514"></A> +</P> +<DL> +<DT><U>Function:</U> <B>modulus->integer</B> <I>modulus</I> +<DD><P> + +Returns the non-negative integer characteristic of the ring formed when +<VAR>modulus</VAR> is used with <CODE>modular:</CODE> procedures. +</P> +</DL> +<P> + +<A NAME="IDX515"></A> +</P> +<DL> +<DT><U>Function:</U> <B>modular:normalize</B> <I>modulus n</I> +<DD><P> + +Returns the integer <CODE>(modulo <VAR>n</VAR> (modulus->integer +<VAR>modulus</VAR>))</CODE> in the representation specified by <VAR>modulus</VAR>. +</P> +</DL> +The rest of these functions assume normalized arguments; That is, the +arguments are constrained by the following table: +<P> + +For all of these functions, if the first argument (<VAR>modulus</VAR>) is: +</P> +<DL COMPACT> +<DT><CODE>positive?</CODE> +<DD>Work as before. The result is between 0 and <VAR>modulus</VAR>. +<P> + +</P> +<DT><CODE>zero?</CODE> +<DD>The arguments are treated as integers. An integer is returned. +<P> + +</P> +<DT><CODE>negative?</CODE> +<DD>The arguments and result are treated as members of the integers modulo +<CODE>(+ 1 (* -2 <VAR>modulus</VAR>))</CODE>, but with <EM>symmetric</EM> +<A NAME="IDX516"></A> +representation; i.e. <CODE>(<= (- <VAR>modulus</VAR>) <VAR>n</VAR> +<VAR>modulus</VAR>)</CODE>. +</DL> +<P> + +If all the arguments are fixnums the computation will use only fixnums. +</P> +<P> + +<A NAME="IDX517"></A> +</P> +<DL> +<DT><U>Function:</U> <B>modular:invertable?</B> <I>modulus k</I> +<DD><P> + +Returns <CODE>#t</CODE> if there exists an integer n such that <VAR>k</VAR> * n +== 1 mod <VAR>modulus</VAR>, and <CODE>#f</CODE> otherwise. +</P> +</DL> +<P> + +<A NAME="IDX518"></A> +</P> +<DL> +<DT><U>Function:</U> <B>modular:invert</B> <I>modulus n2</I> +<DD><P> + +Returns an integer n such that 1 = (n * <VAR>n2</VAR>) mod <VAR>modulus</VAR>. If +<VAR>n2</VAR> has no inverse mod <VAR>modulus</VAR> an error is signaled. +</P> +</DL> +<P> + +<A NAME="IDX519"></A> +</P> +<DL> +<DT><U>Function:</U> <B>modular:negate</B> <I>modulus n2</I> +<DD><P> + +Returns (-<VAR>n2</VAR>) mod <VAR>modulus</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX520"></A> +</P> +<DL> +<DT><U>Function:</U> <B>modular:+</B> <I>modulus n2 n3</I> +<DD><P> + +Returns (<VAR>n2</VAR> + <VAR>n3</VAR>) mod <VAR>modulus</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX521"></A> +</P> +<DL> +<DT><U>Function:</U> <B>modular:-</B> <I>modulus n2 n3</I> +<DD><P> + +Returns (<VAR>n2</VAR> - <VAR>n3</VAR>) mod <VAR>modulus</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX522"></A> +</P> +<DL> +<DT><U>Function:</U> <B>modular:*</B> <I>modulus n2 n3</I> +<DD><P> + +Returns (<VAR>n2</VAR> * <VAR>n3</VAR>) mod <VAR>modulus</VAR>. +</P> +<P> + +The Scheme code for <CODE>modular:*</CODE> with negative <VAR>modulus</VAR> is +not completed for fixnum-only implementations. +</P> +</DL> +<P> + +<A NAME="IDX523"></A> +</P> +<DL> +<DT><U>Function:</U> <B>modular:expt</B> <I>modulus n2 n3</I> +<DD><P> + +Returns (<VAR>n2</VAR> ^ <VAR>n3</VAR>) mod <VAR>modulus</VAR>. +</P> +</DL> +<P> + +<A NAME="Prime Numbers"></A> +<HR SIZE="6"> +<A NAME="SEC96"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC95"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.3 Prime Numbers </H2> +<!--docid::SEC96::--> +<P> + +<CODE>(require 'factor)</CODE> +<A NAME="IDX524"></A> +<A NAME="IDX525"></A> +</P> +<P> + +<A NAME="IDX526"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>prime:prngs</B> +<DD><P> + +<VAR>prime:prngs</VAR> is the random-state (see section <A HREF="slib_5.html#SEC97">5.4 Random Numbers</A>) used by these +procedures. If you call these procedures from more than one thread +(or from interrupt), <CODE>random</CODE> may complain about reentrant +calls. +</P> +</DL> +<EM>Note:</EM> The prime test and generation procedures implement (or +use) the Solovay-Strassen primality test. See +<P> + +<UL> +<LI>Robert Solovay and Volker Strassen, +<CITE>A Fast Monte-Carlo Test for Primality</CITE>, +SIAM Journal on Computing, 1977, pp 84-85. +</UL> +<P> + +<A NAME="IDX527"></A> +</P> +<DL> +<DT><U>Function:</U> <B>jacobi-symbol</B> <I>p q</I> +<DD><P> + +Returns the value (+1, -1, or 0) of the Jacobi-Symbol of +exact non-negative integer <VAR>p</VAR> and exact positive odd integer <VAR>q</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX528"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>prime:trials</B> +<DD><P> + +<VAR>prime:trials</VAR> the maxinum number of iterations of Solovay-Strassen that will +be done to test a number for primality. +</P> +</DL> +<P> + +<A NAME="IDX529"></A> +</P> +<DL> +<DT><U>Function:</U> <B>prime?</B> <I>n</I> +<DD><P> + +Returns <CODE>#f</CODE> if <VAR>n</VAR> is composite; <CODE>#t</CODE> if <VAR>n</VAR> is prime. +There is a slight chance <CODE>(expt 2 (- prime:trials))</CODE> that a +composite will return <CODE>#t</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX530"></A> +</P> +<DL> +<DT><U>Function:</U> <B>primes<</B> <I>start count</I> +<DD><P> + +Returns a list of the first <VAR>count</VAR> prime numbers less than +<VAR>start</VAR>. If there are fewer than <VAR>count</VAR> prime numbers +less than <VAR>start</VAR>, then the returned list will have fewer than +<VAR>start</VAR> elements. +</P> +</DL> +<P> + +<A NAME="IDX531"></A> +</P> +<DL> +<DT><U>Function:</U> <B>primes></B> <I>start count</I> +<DD><P> + +Returns a list of the first <VAR>count</VAR> prime numbers greater than <VAR>start</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX532"></A> +</P> +<DL> +<DT><U>Function:</U> <B>factor</B> <I>k</I> +<DD><P> + +Returns a list of the prime factors of <VAR>k</VAR>. The order of the +factors is unspecified. In order to obtain a sorted list do +<CODE>(sort! (factor <VAR>k</VAR>) <)</CODE>. +</P> +</DL> +<P> + +<A NAME="Random Numbers"></A> +<HR SIZE="6"> +<A NAME="SEC97"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC96"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC98"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.4 Random Numbers </H2> +<!--docid::SEC97::--> +<P> + +<A NAME="IDX533"></A> +<A NAME="IDX534"></A> +A pseudo-random number generator is only as good as the tests it passes. +George Marsaglia of Florida State University developed a battery of +tests named <EM>DIEHARD</EM> (<A HREF="http://stat.fsu.edu/~geo/diehard.html">http://stat.fsu.edu/~geo/diehard.html</A>). +`<TT>diehard.c</TT>' has a bug which the patch +<A HREF="http://swissnet.ai.mit.edu/ftpdir/users/jaffer/diehard.c.pat">http://swissnet.ai.mit.edu/ftpdir/users/jaffer/diehard.c.pat</A> corrects. +</P> +<P> + +SLIB's PRNG generates 8 bits at a time. With the degenerate seed +`<SAMP>0</SAMP>', the numbers generated pass DIEHARD; but when bits are +combined from sequential bytes, tests fail. With the seed +`<SAMP>http://swissnet.ai.mit.edu/~jaffer/SLIB.html</SAMP>', all of those +tests pass. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'random</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'random-inexact</TD></TR> +</TABLE> +<P> + +<A NAME="Exact Random Numbers"></A> +<HR SIZE="6"> +<A NAME="SEC98"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC99"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.4.1 Exact Random Numbers </H3> +<!--docid::SEC98::--> +<P> + +<CODE>(require 'random)</CODE> +<A NAME="IDX535"></A> +</P> +<P> + +<A NAME="IDX536"></A> +</P> +<DL> +<DT><U>Function:</U> <B>random</B> <I>n state</I> +<DD><P> + +<A NAME="IDX537"></A> +<DT><U>Function:</U> <B>random</B> <I>n</I> +<DD></P> +<P> + +<VAR>n</VAR> must be an exact positive integer. <CODE>random</CODE> returns an exact integer +between zero (inclusive) and <VAR>n</VAR> (exclusive). The values returned by +<CODE>random</CODE> are uniformly distributed from 0 to <VAR>n</VAR>. +</P> +<P> + +The optional argument <VAR>state</VAR> must be of the type returned by +<CODE>(seed->random-state)</CODE> or <CODE>(make-random-state)</CODE>. It +defaults to the value of the variable <CODE>*random-state*</CODE>. This +object is used to maintain the state of the pseudo-random-number +generator and is altered as a side effect of calls to <CODE>random</CODE>. +</P> +</DL> +<A NAME="IDX538"></A> +<DL> +<DT><U>Variable:</U> <B>*random-state*</B> +<DD>Holds a data structure that encodes the internal state of the +random-number generator that <CODE>random</CODE> uses by default. The nature +of this data structure is implementation-dependent. It may be printed +out and successfully read back in, but may or may not function correctly +as a random-number state object in another implementation. +</DL> +<P> + +<A NAME="IDX539"></A> +</P> +<DL> +<DT><U>Function:</U> <B>copy-random-state</B> <I>state</I> +<DD><P> + +Returns a new copy of argument <VAR>state</VAR>. +</P> +<P> + +<A NAME="IDX540"></A> +<DT><U>Function:</U> <B>copy-random-state</B> +<DD>Returns a new copy of <CODE>*random-state*</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX541"></A> +</P> +<DL> +<DT><U>Function:</U> <B>seed->random-state</B> <I>seed</I> +<DD><P> + +Returns a new object of type suitable for use as the value of the +variable <CODE>*random-state*</CODE> or as a second argument to <CODE>random</CODE>. +The number or string <VAR>seed</VAR> is used to initialize the state. If +<CODE>seed->random-state</CODE> is called twice with arguments which are +<CODE>equal?</CODE>, then the returned data structures will be <CODE>equal?</CODE>. +Calling <CODE>seed->random-state</CODE> with unequal arguments will nearly +always return unequal states. +</P> +</DL> +<P> + +<A NAME="IDX542"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-random-state</B> +<DD><P> + +<A NAME="IDX543"></A> +<DT><U>Function:</U> <B>make-random-state</B> <I>obj</I> +<DD>Returns a new object of type suitable for use as the value of the +variable <CODE>*random-state*</CODE> or as a second argument to <CODE>random</CODE>. +If the optional argument <VAR>obj</VAR> is given, it should be a printable +Scheme object; the first 50 characters of its printed representation +will be used as the seed. Otherwise the value of <CODE>*random-state*</CODE> +is used as the seed. +</P> +</DL> +<P> + +<A NAME="Inexact Random Numbers"></A> +<HR SIZE="6"> +<A NAME="SEC99"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC98"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC100"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC97"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.4.2 Inexact Random Numbers </H3> +<!--docid::SEC99::--> +<P> + +<CODE>(require 'random-inexact)</CODE> +<A NAME="IDX544"></A> +</P> +<P> + +<A NAME="IDX545"></A> +</P> +<DL> +<DT><U>Function:</U> <B>random:uniform</B> +<DD><P> + +<A NAME="IDX546"></A> +<DT><U>Function:</U> <B>random:uniform</B> <I>state</I> +<DD>Returns an uniformly distributed inexact real random number in the +range between 0 and 1. +</P> +</DL> +<P> + +<A NAME="IDX547"></A> +</P> +<DL> +<DT><U>Function:</U> <B>random:exp</B> +<DD><P> + +<A NAME="IDX548"></A> +<DT><U>Function:</U> <B>random:exp</B> <I>state</I> +<DD>Returns an inexact real in an exponential distribution with mean 1. For +an exponential distribution with mean <VAR>u</VAR> use +<CODE>(* <VAR>u</VAR> (random:exp))</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX549"></A> +</P> +<DL> +<DT><U>Function:</U> <B>random:normal</B> +<DD><P> + +<A NAME="IDX550"></A> +<DT><U>Function:</U> <B>random:normal</B> <I>state</I> +<DD>Returns an inexact real in a normal distribution with mean 0 and +standard deviation 1. For a normal distribution with mean <VAR>m</VAR> and +standard deviation <VAR>d</VAR> use +<CODE>(+ <VAR>m</VAR> (* <VAR>d</VAR> (random:normal)))</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX551"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>random:normal-vector!</B> <I>vect</I> +<DD><P> + +<A NAME="IDX552"></A> +<DT><U>Procedure:</U> <B>random:normal-vector!</B> <I>vect state</I> +<DD>Fills <VAR>vect</VAR> with inexact real random numbers which are independent +and standard normally distributed (i.e., with mean 0 and variance 1). +</P> +</DL> +<P> + +<A NAME="IDX553"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>random:hollow-sphere!</B> <I>vect</I> +<DD><P> + +<A NAME="IDX554"></A> +<DT><U>Procedure:</U> <B>random:hollow-sphere!</B> <I>vect state</I> +<DD>Fills <VAR>vect</VAR> with inexact real random numbers the sum of whose +squares is equal to 1.0. Thinking of <VAR>vect</VAR> as coordinates in space +of dimension n = <CODE>(vector-length <VAR>vect</VAR>)</CODE>, the coordinates are +uniformly distributed over the surface of the unit n-shere. +</P> +</DL> +<P> + +<A NAME="IDX555"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>random:solid-sphere!</B> <I>vect</I> +<DD><P> + +<A NAME="IDX556"></A> +<DT><U>Procedure:</U> <B>random:solid-sphere!</B> <I>vect state</I> +<DD>Fills <VAR>vect</VAR> with inexact real random numbers the sum of whose +squares is less than 1.0. Thinking of <VAR>vect</VAR> as coordinates in +space of dimension <VAR>n</VAR> = <CODE>(vector-length <VAR>vect</VAR>)</CODE>, the +coordinates are uniformly distributed within the unit <VAR>n</VAR>-shere. +The sum of the squares of the numbers is returned. +</P> +</DL> +<P> + +<A NAME="Fast Fourier Transform"></A> +<HR SIZE="6"> +<A NAME="SEC100"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC99"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC101"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.5 Fast Fourier Transform </H2> +<!--docid::SEC100::--> +<P> + +<CODE>(require 'fft)</CODE> +<A NAME="IDX557"></A> +</P> +<P> + +<A NAME="IDX558"></A> +</P> +<DL> +<DT><U>Function:</U> <B>fft</B> <I>array</I> +<DD><P> + +<VAR>array</VAR> is an array of <CODE>(expt 2 n)</CODE> numbers. <CODE>fft</CODE> +returns an array of complex numbers comprising the +<EM>Discrete Fourier Transform</EM> of <VAR>array</VAR>. +<A NAME="IDX559"></A> +</P> +</DL> +<P> + +<A NAME="IDX560"></A> +</P> +<DL> +<DT><U>Function:</U> <B>fft-1</B> <I>array</I> +<DD><P> + +<CODE>fft-1</CODE> returns an array of complex numbers comprising the +inverse Discrete Fourier Transform of <VAR>array</VAR>. +</P> +</DL> +<CODE>(fft-1 (fft <VAR>array</VAR>))</CODE> will return an array of values close to +<VAR>array</VAR>. +<P> + +<TABLE><tr><td> </td><td class=example><pre>(fft '#(1 0+i -1 0-i 1 0+i -1 0-i)) => + +#(0.0 0.0 0.0+628.0783185208527e-18i 0.0 + 0.0 0.0 8.0-628.0783185208527e-18i 0.0) + +(fft-1 '#(0 0 0 0 0 0 8 0)) => + +#(1.0 -61.23031769111886e-18+1.0i -1.0 61.23031769111886e-18-1.0i + 1.0 -61.23031769111886e-18+1.0i -1.0 61.23031769111886e-18-1.0i) +</pre></td></tr></table><P> + +<A NAME="Cyclic Checksum"></A> +<HR SIZE="6"> +<A NAME="SEC101"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC100"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.6 Cyclic Checksum </H2> +<!--docid::SEC101::--> +<P> + +<CODE>(require 'crc)</CODE> +<A NAME="IDX561"></A> +Cyclic Redundancy Checks using Galois field GF(2) polynomial +arithmetic are used for error detection in many data transmission +and storage applications. +</P> +<P> + +The generator polynomials for various CRC protocols are availble +from many sources. But the polynomial is just one of many +parameters which must match in order for a CRC implementation to +interoperate with existing systems: +</P> +<P> + +<UL> + +<LI> +the byte-order and bit-order of the data stream; +<P> + +</P> +<LI> +whether the CRC or its inverse is being calculated; +<P> + +</P> +<LI> +the initial CRC value; and +<P> + +</P> +<LI> +whether and where the CRC value is appended (inverted +or non-inverted) to the data stream. +<P> + +</UL> +<P> + +There is even some controversy over the polynomials themselves. +</P> +<P> + +<A NAME="IDX562"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>crc-32-polynomial</B> +<DD>For CRC-32, http://www2.sis.pitt.edu/~jkabara/tele-2100/lect08.html +gives x^32+x^26+x^23+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+1. +<P> + +But +http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html, +http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm, +http://spinroot.com/spin/Doc/Book91_PDF/ch3.pdf, +http://www.erg.abdn.ac.uk/users/gorry/course/dl-pages/crc.html, +http://www.rad.com/networks/1994/err_con/crc_most.htm, and +http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html, +http://www.nobugconsulting.ro/crc.php give +x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. +</P> +<P> + +SLIB <CODE>crc-32-polynomial</CODE> uses the latter definition. +</P> +</DL> +<P> + +<A NAME="IDX563"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>crc-ccitt-polynomial</B> +<DD><P> + +http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html, +http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm, +http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html, +http://www2.sis.pitt.edu/~jkabara/tele-2100/lect08.html, and +http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html give +CRC-CCITT: x^16+x^12+x^5+1. +</P> +</DL> +<P> + +<A NAME="IDX564"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>crc-16-polynomial</B> +<DD><P> + +http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html, +http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm, +http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html, +http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html, and +http://www.usb.org/developers/data/crcdes.pdf give +CRC-16: x^16+x^15+x^2+1. +</P> +</DL> +<P> + +<A NAME="IDX565"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>crc-12-polynomial</B> +<DD><P> + +http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html, +http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html, +http://www.it.iitb.ac.in/it605/lectures/link/node4.html, and +http://spinroot.com/spin/Doc/Book91_PDF/ch3.pdf give +CRC-12: x^12+x^11+x^3+x^2+1. +</P> +<P> + +But +http://www.ffldusoe.edu/Faculty/Denenberg/Topics/Networks/Error_Detection_Correction/crc.html, +http://duchon.umuc.edu/Web_Pages/duchon/99_f_cm435/ShiftRegister.htm, +http://www.eng.uwi.tt/depts/elec/staff/kimal/errorcc.html, +http://www.ee.uwa.edu.au/~roberto/teach/itc314/java/CRC/, +http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html, and +http://www.efg2.com/Lab/Mathematics/CRC.htm give +CRC-12: x^12+x^11+x^3+x^2+x+1. +</P> +<P> + +These differ in bit 1 and calculations using them return different +values. With citations near evenly split, it is hard to know which is +correct. +</P> +</DL> +<P> + +<A NAME="IDX566"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>crc-10-polynomial</B> +<DD><P> + +http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html gives +CRC-10: x^10+x^9+x^5+x^4+1; +but +http://cell-relay.indiana.edu/cell-relay/publications/software/CRC/crc10.html, +http://www.it.iitb.ac.in/it605/lectures/link/node4.html, +http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html, +http://www.techfest.com/networking/atm/atm.htm, +http://www.protocols.com/pbook/atmcell2.htm, and +http://www.nobugconsulting.ro/crc.php give +CRC-10: x^10+x^9+x^5+x^4+x+1. +</P> +</DL> +<P> + +<A NAME="IDX567"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>crc-08-polynomial</B> +<DD><P> + +http://www.math.grin.edu/~rebelsky/Courses/CS364/2000S/Outlines/outline.12.html, +http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html, +http://www.it.iitb.ac.in/it605/lectures/link/node4.html, and +http://www.nobugconsulting.ro/crc.php give +CRC-8: x^8+x^2+x^1+1 +</P> +</DL> +<P> + +<A NAME="IDX568"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>atm-hec-polynomial</B> +<DD><P> + +http://cell-relay.indiana.edu/cell-relay/publications/software/CRC/32bitCRC.tutorial.html and +http://www.gpfn.sk.ca/~rhg/csc8550s02/crc.html give +ATM HEC: x^8+x^2+x+1. +</P> +</DL> +<P> + +<A NAME="IDX569"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>dowcrc-polynomial</B> +<DD><P> + +http://www.cs.ncl.ac.uk/people/harry.whitfield/home.formal/CRCs.html gives +DOWCRC: x^8+x^5+x^4+1. +</P> +</DL> +<P> + +<A NAME="IDX570"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>usb-token-polynomial</B> +<DD><P> + +http://www.usb.org/developers/data/crcdes.pdf and +http://www.nobugconsulting.ro/crc.php give +USB-token: x^5+x^2+1. +</P> +</DL> +<P> + +Each of these polynomial constants is a string of `<SAMP>1</SAMP>'s and +`<SAMP>0</SAMP>'s, the exponent of each power of <VAR>x</VAR> in descending order. +</P> +<P> + +<A NAME="IDX571"></A> +</P> +<DL> +<DT><U>Function:</U> <B>crc:make-table</B> <I>poly</I> +<DD><P> + +<VAR>poly</VAR> must be string of `<SAMP>1</SAMP>'s and `<SAMP>0</SAMP>'s beginning with +`<SAMP>1</SAMP>' and having length greater than 8. <CODE>crc:make-table</CODE> +returns a vector of 256 integers, such that: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(set! <VAR>crc</VAR> + (logxor (ash (logand (+ -1 (ash 1 (- <VAR>deg</VAR> 8))) <VAR>crc</VAR>) 8) + (vector-ref <VAR>crc-table</VAR> + (logxor (ash <VAR>crc</VAR> (- 8 <VAR>deg</VAR>)) <VAR>byte</VAR>)))) +</pre></td></tr></table><P> + +will compute the <VAR>crc</VAR> with the 8 additional bits in <VAR>byte</VAR>; +where <VAR>crc</VAR> is the previous accumulated CRC value, <VAR>deg</VAR> is +the degree of <VAR>poly</VAR>, and <VAR>crc-table</VAR> is the vector returned +by <CODE>crc:make-table</CODE>. +</P> +<P> + +If the implementation does not support <VAR>deg</VAR>-bit integers, then +<CODE>crc:make-table</CODE> returns #f. +</P> +<P> + +</P> +</DL> +<P> + +<A NAME="IDX572"></A> +</P> +<DL> +<DT><U>Function:</U> <B>cksum</B> <I>file</I> +<DD><P> + +Computes the P1003.2/D11.2 (POSIX.2) 32-bit checksum of <VAR>file</VAR>. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'crc) +<A NAME="IDX573"></A>(cksum (in-vicinity (library-vicinity) "ratize.scm")) +=> 157103930 +</pre></td></tr></table><P> + +<A NAME="IDX574"></A> +<DT><U>Function:</U> <B>cksum</B> <I>port</I> +<DD>Computes the checksum of the bytes read from <VAR>port</VAR> until the +end-of-file. +</P> +<P> + +</P> +</DL> +<P> + +<A NAME="IDX575"></A> +<CODE>cksum-string</CODE>, which returns the P1003.2/D11.2 (POSIX.2) 32-bit +checksum of the bytes in <VAR>str</VAR>, can be defined as follows: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'string-port) +(define (cksum-string str) (call-with-input-string str cksum)) +</pre></td></tr></table><P> + +<A NAME="IDX576"></A> +</P> +<DL> +<DT><U>Function:</U> <B>crc16</B> <I>file</I> +<DD><P> + +Computes the USB data-packet (16-bit) CRC of <VAR>file</VAR>. +</P> +<P> + +<A NAME="IDX577"></A> +<DT><U>Function:</U> <B>crc16</B> <I>port</I> +<DD>Computes the USB data-packet (16-bit) CRC of the bytes read from +<VAR>port</VAR> until the end-of-file. +</P> +<P> + +<CODE>crc16</CODE> calculates the same values as the crc16.pl program given +in http://www.usb.org/developers/data/crcdes.pdf. +</P> +<P> + +</P> +</DL> +<P> + +<A NAME="IDX578"></A> +</P> +<DL> +<DT><U>Function:</U> <B>crc5</B> <I>file</I> +<DD><P> + +Computes the USB token (5-bit) CRC of <VAR>file</VAR>. +</P> +<P> + +<A NAME="IDX579"></A> +<DT><U>Function:</U> <B>crc5</B> <I>port</I> +<DD>Computes the USB token (5-bit) CRC of the bytes read from +<VAR>port</VAR> until the end-of-file. +</P> +<P> + +<CODE>crc5</CODE> calculates the same values as the crc5.pl program given +in http://www.usb.org/developers/data/crcdes.pdf. +</P> +<P> + +</P> +</DL> +<P> + +<A NAME="Graphing"></A> +<HR SIZE="6"> +<A NAME="SEC102"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC101"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC103"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.7 Graphing </H2> +<!--docid::SEC102::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Character Plotting"></A> +<HR SIZE="6"> +<A NAME="SEC103"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.7.1 Character Plotting </H3> +<!--docid::SEC103::--> +<P> + +<CODE>(require 'charplot)</CODE> +<A NAME="IDX580"></A> +</P> +<P> + +<A NAME="IDX581"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>charplot:dimensions</B> +<DD>A list of the maximum height (number of lines) and maximum width (number +of columns) for the graph, its scales, and labels. +<P> + +The default value for <VAR>charplot:dimensions</VAR> is the +<CODE>output-port-height</CODE> and <CODE>output-port-width</CODE> of +<CODE>current-output-port</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX582"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>plot</B> <I>coords x-label y-label</I> +<DD><VAR>coords</VAR> is a list or vector of coordinates, lists of x and y +coordinates. <VAR>x-label</VAR> and <VAR>y-label</VAR> are strings with which to +label the x and y axes. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(require 'charplot) +<A NAME="IDX583"></A>(set! charplot:dimensions '(20 55)) + +(define (make-points n) + (if (zero? n) + '() + (cons (list (/ n 6) (sin (/ n 6))) (make-points (1- n))))) + +(plot (make-points 40) "x" "Sin(x)") +-| + Sin(x) _________________________________________ + 1|- **** | + | ** ** | + 0.75|- * * | + | * * | + 0.5|- * * | + | * *| + 0.25|- * * | + | * * | + 0|-------------------*------------------*--| + | * | + -0.25|- * * | + | * * | + -0.5|- * | + | * * | + -0.75|- * * | + | ** ** | + -1|- **** | + |:_____._____:_____._____:_____._____:____| + x 2 4 6 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX584"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>plot</B> <I>func x1 x2</I> +<DD><A NAME="IDX585"></A> +<DT><U>Procedure:</U> <B>plot</B> <I>func x1 x2 npts</I> +<DD>Plots the function of one argument <VAR>func</VAR> over the range <VAR>x1</VAR> to +<VAR>x2</VAR>. If the optional integer argument <VAR>npts</VAR> is supplied, it +specifies the number of points to evaluate <VAR>func</VAR> at. +<P> + +<TABLE><tr><td> </td><td class=example><pre>(plot sin 0 (* 2 pi)) +-| + _________________________________________ + 1|-: **** | + | : ** ** | + 0.75|-: * * | + | : * * | + 0.5|-: ** ** | + | : * * | + 0.25|-:** ** | + | :* * | + 0|-*------------------*--------------------| + | : * * | + -0.25|-: ** ** | + | : * * | + -0.5|-: * ** | + | : * * | + -0.75|-: * ** | + | : ** ** | + -1|-: **** | + |_:_____._____:_____._____:_____._____:___| + 0 2 4 6 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX586"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>histograph</B> <I>data label</I> +<DD>Creates and displays a histogram of the numerical values contained in +vector or list <VAR>data</VAR> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'random-inexact) +(histograph (do ((idx 99 (+ -1 idx)) + (lst '() (cons (* .02 (random:normal)) lst))) + ((negative? idx) lst)) + "normal") +-| + _________________________________________ + 8|- : I | + | : I | + 7|- I I : I | + | I I : I | + 6|- III I :I I | + | III I :I I | + 5|- IIIIIIIIII I | + | IIIIIIIIII I | + 4|- IIIIIIIIIIII | + | IIIIIIIIIIII | + 3|-I I I IIIIIIIIIIII II I | + | I I I IIIIIIIIIIII II I | + 2|-I I I IIIIIIIIIIIIIIIII I | + | I I I IIIIIIIIIIIIIIIII I | + 1|-II I I IIIIIIIIIIIIIIIIIIIII I I I | + | II I I IIIIIIIIIIIIIIIIIIIII I I I | + 0|-IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII----| + |__.____:____.____:____.____:____.____:___| + normal -0.025 0 0.025 0.05 +</pre></td></tr></table></DL> +<P> + +<A NAME="PostScript Graphing"></A> +<HR SIZE="6"> +<A NAME="SEC104"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC103"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC105"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC102"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.7.2 PostScript Graphing </H3> +<!--docid::SEC104::--> +<P> + +<CODE>(require 'eps-graph)</CODE> +</P> +<P> + +This is a graphing package creating encapsulated-PostScript files. +Its motivations and design choice are described in +<A HREF="http://swissnet.ai.mit.edu/~jaffer/Docupage/grapheps">http://swissnet.ai.mit.edu/~jaffer/Docupage/grapheps</A> +</P> +<P> + +A dataset to be plotted is taken from a 2-dimensional array. +Corresponding coordinates are in rows. Coordinates from any +pair of columns can be plotted. +</P> +<P> + +<A NAME="IDX587"></A> +</P> +<DL> +<DT><U>Function:</U> <B>create-postscript-graph</B> <I>filename.eps size elt1 <small>...</small></I> +<DD><P> + +<VAR>filename.eps</VAR> should be a string naming an output file to be created. <VAR>size</VAR> +should be an exact integer, a list of two exact integers, or #f. +<VAR>elt1</VAR>, ... are values returned by graphing primitives described here. +</P> +<P> + +<CODE>create-postscript-graph</CODE> creates an <EM>Encapsulated-PostScript</EM> file named <VAR>filename.eps</VAR> containing +<A NAME="IDX588"></A> +graphs as directed by the <VAR>elt1</VAR>, ... arguments. +</P> +<P> + +The size of the graph is determined by the <VAR>size</VAR> argument. If a list +of two integers, they specify the width and height. If one integer, +then that integer is the width and the height is 3/4 of the width. +If #f, the graph will be 800 by 600. +</P> +</DL> +These graphing procedures should be called as arguments to +<CODE>create-postscript-graph</CODE>. The order of these arguments is +significant; PostScript graphics state is affected serially from the +first <VAR>elt</VAR> argument to the last. +<P> + +<A NAME="IDX589"></A> +</P> +<DL> +<DT><U>Function:</U> <B>whole-page</B> +<DD><P> + +Pushes a rectangle for the whole encapsulated page onto the +PostScript stack. This pushed rectangle is an implicit argument to +<CODE>partition-page</CODE> or <CODE>setup-plot</CODE>. +</P> +</DL> +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC106">5.7.2.2 Drawing the Graph</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC109">5.7.2.5 Legending</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC111">5.7.2.7 Example Graph</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Column Ranges"></A> +<HR SIZE="6"> +<A NAME="SEC105"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC106"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 5.7.2.1 Column Ranges </H4> +<!--docid::SEC105::--> +<P> + +A <EM>range</EM> is a list of two numbers, the minimum and the maximum. +<A NAME="IDX590"></A> +<A NAME="IDX591"></A> +Ranges can be given explicity or computed in PostScript by +<CODE>column-range</CODE>. +</P> +<P> + +<A NAME="IDX592"></A> +</P> +<DL> +<DT><U>Function:</U> <B>column-range</B> <I>array k</I> +<DD><P> + +Returns the range of values in 2-dimensional <VAR>array</VAR> column <VAR>k</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX593"></A> +</P> +<DL> +<DT><U>Function:</U> <B>pad-range</B> <I>range p</I> +<DD><P> + +Expands <VAR>range</VAR> by <VAR>p</VAR>/100 on each end. +</P> +</DL> +<P> + +<A NAME="IDX594"></A> +</P> +<DL> +<DT><U>Function:</U> <B>snap-range</B> <I>range</I> +<DD><P> + +Expands <VAR>range</VAR> to round number of ticks. +</P> +</DL> +<P> + +<A NAME="IDX595"></A> +</P> +<DL> +<DT><U>Function:</U> <B>combine-ranges</B> <I>range1 range2 <small>...</small></I> +<DD><P> + +Returns the minimal range covering all <VAR>range1</VAR>, <VAR>range2</VAR>, ... +</P> +</DL> +<P> + +<A NAME="IDX596"></A> +</P> +<DL> +<DT><U>Function:</U> <B>setup-plot</B> <I>x-range y-range pagerect</I> +<DD><P> + +<A NAME="IDX597"></A> +<DT><U>Function:</U> <B>setup-plot</B> <I>x-range y-range</I> +<DD><VAR>x-range</VAR> and <VAR>y-range</VAR> should each be a list of two numbers or the value returned +by <CODE>pad-range</CODE>, <CODE>snap-range</CODE>, or <CODE>combine-range</CODE>. +<VAR>pagerect</VAR> is the rectangle bounding the graph to be drawn; if missing, the +rectangle from the top of the PostScript stack is popped and used. +</P> +<P> + +Based on the given ranges, <CODE>setup-plot</CODE> sets up scaling and margins for making +a graph. The margins are sized proportional to the <VAR>fontheight</VAR> +value at the time of the call to setup-plot. <CODE>setup-plot</CODE> sets two variables: +</P> +<P> + +</P> +<DL COMPACT> +<DT><VAR>plotrect</VAR> +<DD>The region where data points will be plotted. +<DT><VAR>graphrect</VAR> +<DD>The <VAR>pagerect</VAR> argument to <CODE>setup-plot</CODE>. Includes plotrect, legends, etc. +</DL> +</DL> +<A NAME="Drawing the Graph"></A> +<HR SIZE="6"> +<A NAME="SEC106"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC105"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC107"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 5.7.2.2 Drawing the Graph </H4> +<!--docid::SEC106::--> +<P> + +<A NAME="IDX598"></A> +</P> +<DL> +<DT><U>Function:</U> <B>plot-column</B> <I>array x-column y-column proc3s</I> +<DD><P> + +Plots points with x coordinate in <VAR>x-column</VAR> of <VAR>array</VAR> and y coordinate <VAR>y-column</VAR> of +<VAR>array</VAR>. The symbol <VAR>proc3s</VAR> specifies the type of glyph or drawing style for +presenting these coordinates. +</P> +</DL> +The glyphs and drawing styles available are: +<P> + +</P> +<DL COMPACT> +<DT><CODE>line</CODE> +<DD>Draws line connecting points in order. +<DT><CODE>mountain</CODE> +<DD>Fill area below line connecting points. +<DT><CODE>cloud</CODE> +<DD>Fill area above line connecting points. +<DT><CODE>impulse</CODE> +<DD>Draw line from x-axis to each point. +<DT><CODE>bargraph</CODE> +<DD>Draw rectangle from x-axis to each point. +<DT><CODE>disc</CODE> +<DD>Solid round dot. +<DT><CODE>point</CODE> +<DD>Minimal point -- invisible if linewidth is 0. +<DT><CODE>square</CODE> +<DD>Square box. +<DT><CODE>diamond</CODE> +<DD>Square box at 45.o +<DT><CODE>plus</CODE> +<DD>Plus sign. +<DT><CODE>cross</CODE> +<DD>X sign. +<DT><CODE>triup</CODE> +<DD>Triangle pointing upward +<DT><CODE>tridown</CODE> +<DD>Triangle pointing downward +<DT><CODE>pentagon</CODE> +<DD>Five sided polygon +<DT><CODE>circle</CODE> +<DD>Hollow circle +</DL> +<P> + +<A NAME="Graphics Context"></A> +<HR SIZE="6"> +<A NAME="SEC107"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC106"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC108"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 5.7.2.3 Graphics Context </H4> +<!--docid::SEC107::--> +<P> + +<A NAME="IDX599"></A> +</P> +<DL> +<DT><U>Function:</U> <B>in-graphic-context</B> <I>arg <small>...</small></I> +<DD><P> + +Saves the current graphics state, executes <VAR>args</VAR>, then restores +to saved graphics state. +</P> +</DL> +<P> + +<A NAME="IDX600"></A> +</P> +<DL> +<DT><U>Function:</U> <B>set-color</B> <I>color</I> +<DD><P> + +<VAR>color</VAR> should be a string naming a Resene color, a saturate color, or a +number between 0 and 100. +</P> +<P> + +<CODE>set-color</CODE> sets the PostScript color to the color of the given string, or a +grey value between black (0) and white (100). +</P> +</DL> +<P> + +<A NAME="IDX601"></A> +</P> +<DL> +<DT><U>Function:</U> <B>set-font</B> <I>name fontheight</I> +<DD><P> + +<VAR>name</VAR> should be a (case-sensitive) string naming a PostScript font. +<VAR>fontheight</VAR> should be a positive real number. +</P> +<P> + +<CODE>set-font</CODE> Changes the current PostScript font to <VAR>name</VAR> with height equal to +<VAR>fontheight</VAR>. The default font is Helvetica (12pt). +</P> +</DL> +The base set of PostScript fonts is: +<P> + +</P> +<TABLE> +<TR><TD>Times </TD><TD> Times-Italic </TD><TD> Times-Bold </TD><TD> Times-BoldItalic</TD> +</TR> +<TR><TD>Helvetica </TD><TD> Helvetica-Oblique </TD><TD> Helvetica-Bold </TD><TD> Helvetica-BoldOblique</TD> +</TR> +<TR><TD>Courier </TD><TD> Courier-Oblique </TD><TD> Courier-Bold </TD><TD> Courier-BoldOblique</TD> +</TR> +<TR><TD>Symbol</TD> +</TR></TABLE> +<P> + +Line parameters do no affect fonts; they do effect glyphs. +</P> +<P> + +<A NAME="IDX602"></A> +</P> +<DL> +<DT><U>Function:</U> <B>set-linewidth</B> <I>w</I> +<DD><P> + +The default linewidth is 1. Setting it to 0 makes the lines drawn +as skinny as possible. Linewidth must be much smaller than +glyphsize for readable glyphs. +</P> +</DL> +<P> + +<A NAME="IDX603"></A> +</P> +<DL> +<DT><U>Function:</U> <B>set-linedash</B> <I>j k</I> +<DD><P> + +Lines are drawn <VAR>j</VAR>-on <VAR>k</VAR>-off. +</P> +<P> + +<A NAME="IDX604"></A> +<DT><U>Function:</U> <B>set-linedash</B> <I>j</I> +<DD>Lines are drawn <VAR>j</VAR>-on <VAR>j</VAR>-off. +</P> +<P> + +<A NAME="IDX605"></A> +<DT><U>Function:</U> <B>set-linedash</B> +<DD>Turns off dashing. +</P> +</DL> +<P> + +<A NAME="IDX606"></A> +</P> +<DL> +<DT><U>Function:</U> <B>set-glyphsize</B> <I>w</I> +<DD><P> + +Sets the (PostScript) variable glyphsize to <VAR>w</VAR>. The default +glyphsize is 6. +</P> +</DL> +The effects of <CODE>clip-to-rect</CODE> are also part of the graphic +context. +<P> + +<A NAME="Rectangles"></A> +<HR SIZE="6"> +<A NAME="SEC108"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC107"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC109"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 5.7.2.4 Rectangles </H4> +<!--docid::SEC108::--> +<P> + +A <EM>rectangle</EM> is a list of 4 numbers; the first two elements are +<A NAME="IDX607"></A> +the x and y coordinates of lower left corner of the rectangle. The +other two elements are the width and height of the rectangle. +</P> +<P> + +<A NAME="IDX608"></A> +</P> +<DL> +<DT><U>Function:</U> <B>whole-page</B> +<DD><P> + +Pushes a rectangle for the whole encapsulated page onto the +PostScript stack. This pushed rectangle is an implicit argument to +<CODE>partition-page</CODE> or <CODE>setup-plot</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX609"></A> +</P> +<DL> +<DT><U>Function:</U> <B>partition-page</B> <I>xparts yparts</I> +<DD><P> + +Pops the rectangle currently on top of the stack and pushes <VAR>xparts</VAR> * <VAR>yparts</VAR> +sub-rectangles onto the stack in decreasing y and increasing x order. +If you are drawing just one graph, then you don't need <CODE>partition-page</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX610"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>plotrect</B> +<DD><P> + +The rectangle where data points should be plotted. <VAR>plotrect</VAR> is set by +<CODE>setup-plot</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX611"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>graphrect</B> +<DD><P> + +The <VAR>pagerect</VAR> argument of the most recent call to +<CODE>setup-plot</CODE>. Includes plotrect, legends, etc. +</P> +</DL> +<P> + +<A NAME="IDX612"></A> +</P> +<DL> +<DT><U>Function:</U> <B>fill-rect</B> <I>rect</I> +<DD><P> + +fills <VAR>rect</VAR> with the current color. +</P> +</DL> +<P> + +<A NAME="IDX613"></A> +</P> +<DL> +<DT><U>Function:</U> <B>outline-rect</B> <I>rect</I> +<DD><P> + +Draws the perimiter of <VAR>rect</VAR> in the current color. +</P> +</DL> +<P> + +<A NAME="IDX614"></A> +</P> +<DL> +<DT><U>Function:</U> <B>clip-to-rect</B> <I>rect</I> +<DD><P> + +Modifies the current graphics-state so that nothing will be drawn +outside of the rectangle <VAR>rect</VAR>. Use <CODE>in-graphic-context</CODE> to limit +the extent of <CODE>clip-to-rect</CODE>. +</P> +</DL> +<A NAME="Legending"></A> +<HR SIZE="6"> +<A NAME="SEC109"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC108"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC110"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 5.7.2.5 Legending </H4> +<!--docid::SEC109::--> +<P> + +<A NAME="IDX615"></A> +</P> +<DL> +<DT><U>Function:</U> <B>title-top</B> <I>title subtitle</I> +<DD><P> + +<A NAME="IDX616"></A> +<DT><U>Function:</U> <B>title-top</B> <I>title</I> +<DD>Puts a <VAR>title</VAR> line and an optional <VAR>subtitle</VAR> line above the <CODE>graphrect</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX617"></A> +</P> +<DL> +<DT><U>Function:</U> <B>title-bottom</B> <I>title subtitle</I> +<DD><P> + +<A NAME="IDX618"></A> +<DT><U>Function:</U> <B>title-bottom</B> <I>title</I> +<DD>Puts a <VAR>title</VAR> line and an optional <VAR>subtitle</VAR> line below the <CODE>graphrect</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX619"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>topedge</B> +<DD><A NAME="IDX620"></A> +<DT><U>Variable:</U> <B>bottomedge</B> +<DD><P> + +These edge coordinates of <CODE>graphrect</CODE> are suitable for passing +as the first argument to <CODE>rule-horizontal</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX621"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>leftedge</B> +<DD><A NAME="IDX622"></A> +<DT><U>Variable:</U> <B>rightedge</B> +<DD><P> + +These edge coordinates of <CODE>graphrect</CODE> are suitable for passing +as the first argument to <CODE>rule-vertical</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX623"></A> +</P> +<DL> +<DT><U>Function:</U> <B>rule-vertical</B> <I>x-coord text tick-width</I> +<DD><P> + +Draws a vertical ruler with X coordinate <VAR>x-coord</VAR> and labeled with string +<VAR>text</VAR>. If <VAR>tick-width</VAR> is positive, then the ticks are <VAR>tick-width</VAR> long on the right side +of <VAR>x-coord</VAR>; and <VAR>text</VAR> and numeric legends are on the left. If <VAR>tick-width</VAR> is +negative, then the ticks are -<VAR>tick-width</VAR> long on the left side of <VAR>x-coord</VAR>; and <VAR>text</VAR> +and numeric legends are on the right. +</P> +</DL> +<P> + +<A NAME="IDX624"></A> +</P> +<DL> +<DT><U>Function:</U> <B>rule-horizontal</B> <I>x-coord text tick-height</I> +<DD><P> + +Draws a horizontal ruler with X coordinate <VAR>x-coord</VAR> and labeled with +string <VAR>text</VAR>. If <VAR>tick-height</VAR> is positive, then the ticks are <VAR>tick-height</VAR> long on the +right side of <VAR>x-coord</VAR>; and <VAR>text</VAR> and numeric legends are on the left. If <VAR>tick-height</VAR> +is negative, then the ticks are -<VAR>tick-height</VAR> long on the left side of <VAR>x-coord</VAR>; and +<VAR>text</VAR> and numeric legends are on the right. +</P> +</DL> +<P> + +<A NAME="IDX625"></A> +</P> +<DL> +<DT><U>Function:</U> <B>y-axis</B> +<DD><P> + +Draws the y-axis. +</P> +</DL> +<P> + +<A NAME="IDX626"></A> +</P> +<DL> +<DT><U>Function:</U> <B>x-axis</B> +<DD><P> + +Draws the x-axis. +</P> +</DL> +<P> + +<A NAME="IDX627"></A> +</P> +<DL> +<DT><U>Function:</U> <B>grid-verticals</B> +<DD><P> + +Draws vertical lines through <CODE>graphrect</CODE> at each tick on the +vertical ruler. +</P> +</DL> +<P> + +<A NAME="IDX628"></A> +</P> +<DL> +<DT><U>Function:</U> <B>grid-horizontals</B> +<DD><P> + +Draws horizontal lines through <CODE>graphrect</CODE> at each tick on the +horizontal ruler. +</P> +</DL> +<A NAME="Legacy Plotting"></A> +<HR SIZE="6"> +<A NAME="SEC110"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC109"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC111"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 5.7.2.6 Legacy Plotting </H4> +<!--docid::SEC110::--> +<P> + +<A NAME="IDX629"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>graph:dimensions</B> +<DD><P> + +A list of the width and height of the graph to be plotted using +<CODE>plot</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX630"></A> +</P> +<DL> +<DT><U>Function:</U> <B>plot</B> <I>func x1 x2 npts</I> +<DD><P> + +<A NAME="IDX631"></A> +<DT><U>Function:</U> <B>plot</B> <I>func x1 x2</I> +<DD>Creates and displays using <CODE>(system "gv tmp.eps")</CODE> an +encapsulated PostScript graph of the function of one argument <VAR>func</VAR> +over the range <VAR>x1</VAR> to <VAR>x2</VAR>. If the optional integer argument <VAR>npts</VAR> is +supplied, it specifies the number of points to evaluate <VAR>func</VAR> at. +</P> +<P> + +<A NAME="IDX632"></A> +<DT><U>Function:</U> <B>plot</B> <I>coords x-label y-label</I> +<DD><VAR>coords</VAR> is a list or vector of coordinates, lists of x and y +coordinates. <VAR>x-label</VAR> and <VAR>y-label</VAR> are strings with which +to label the x and y axes. +</P> +</DL> +<A NAME="Example Graph"></A> +<HR SIZE="6"> +<A NAME="SEC111"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC110"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC112"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC104"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 5.7.2.7 Example Graph </H4> +<!--docid::SEC111::--> +<P> + +The file `<TT>am1.5.html</TT>', a table of solar irradiance, is fetched +with `<SAMP>wget</SAMP>' if it isn't already in the working directory. The +file is read and stored into an array, <VAR>irradiance</VAR>. +</P> +<P> + +<CODE>create-postscript-graph</CODE> is then called to create an +encapsulated-PostScript file, `<TT>solarad.eps</TT>'. The size of the +page is set to 600 by 300. <CODE>whole-page</CODE> is called and leaves +the rectangle on the PostScript stack. <CODE>setup-plot</CODE> is called +with a literal range for x and computes the range for column 1. +</P> +<P> + +Two calls to <CODE>top-title</CODE> are made so a different font can be +used for the lower half. <CODE>in-graphic-context</CODE> is used to limit +the scope of the font change. The graphing area is outlined and a +rule drawn on the left side. +</P> +<P> + +Because the X range was intentionally reduced, +<CODE>in-graphic-context</CODE> is called and <CODE>clip-to-rect</CODE> limits +drawing to the plotting area. A black line is drawn from data +column 1. That line is then overlayed with a mountain plot of the +same column colored "Bright Sun". +</P> +<P> + +After returning from the <CODE>in-graphic-context</CODE>, the bottom ruler +is drawn. Had it been drawn earlier, all its ticks would have been +painted over by the mountain plot. +</P> +<P> + +The color is then changed to `<SAMP>seagreen</SAMP>' and the same graphrect +is setup again, this time with a different Y scale, 0 to 1000. The +graphic context is again clipped to <VAR>plotrect</VAR>, linedash is set, +and column 2 is plotted as a dashed line. Finally the rightedge is +ruled. Having the line and its scale both in green helps +disambiguate the scales. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'eps-graph) +(require 'line-i/o) +(require 'string-port) + +(define irradiance + (let ((url "http://www.pv.unsw.edu.au/am1.5.html") + (file "am1.5.html")) + (define (read->list line) + (define elts '()) + (call-with-input-string line + (lambda (iprt) (do ((elt (read iprt) (read iprt))) + ((eof-object? elt) elts) + (set! elts (cons elt elts)))))) + (if (not (file-exists? file)) + (system (string-append "wget -c -O" file " " url))) + (call-with-input-file file + (lambda (iprt) + (define lines '()) + (do ((line (read-line iprt) (read-line iprt))) + ((eof-object? line) + (let ((nra (create-array (Ar64) + (length lines) + (length (car lines))))) + (do ((lns lines (cdr lns)) + (idx (+ -1 (length lines)) (+ -1 idx))) + ((null? lns) nra) + (do ((kdx (+ -1 (length (car lines))) (+ -1 kdx)) + (lst (car lns) (cdr lst))) + ((null? lst)) + (array-set! nra (car lst) idx kdx))))) + (if (and (positive? (string-length line)) + (char-numeric? (string-ref line 0))) + (set! lines (cons (read->list line) lines)))))))) + +(let ((xrange '(.25 2.5))) + (create-postscript-graph + "solarad.eps" '(600 300) + (whole-page) + (setup-plot xrange (column-range irradiance 1)) + (title-top + "Solar Irradiance http://www.pv.unsw.edu.au/am1.5.html") + (in-graphic-context + (set-font "Helvetica-Oblique" 12) + (title-top + "" + "Key Centre for Photovoltaic Engineering UNSW - Air Mass 1.5 Global Spectrum")) + (outline-rect plotrect) + (rule-vertical leftedge "W/(m^2.um)" 10) + (in-graphic-context (clip-to-rect plotrect) + (plot-column irradiance 0 1 'line) + (set-color "Bright Sun") + (plot-column irradiance 0 1 'mountain) + ) + (rule-horizontal bottomedge "Wavelength in .um" 5) + (set-color 'seagreen) + + (setup-plot xrange '(0 1000) graphrect) + (in-graphic-context (clip-to-rect plotrect) + (set-linedash 5 2) + (plot-column irradiance 0 2 'line)) + (rule-vertical rightedge "Integrated .W/(m^2)" -10) + )) + +(system "gv solarad.eps") +</pre></td></tr></table><P> + +<A NAME="Solid Modeling"></A> +<HR SIZE="6"> +<A NAME="SEC112"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC111"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.8 Solid Modeling </H2> +<!--docid::SEC112::--> +<P> + +<A NAME="Solid"> +<CODE>(require 'solid)</CODE> +</A> +<A NAME="IDX633"></A> +<A NAME="IDX634"></A> +<A NAME="IDX635"></A> +</P> +<P> + +<A HREF="http://swissnet.ai.mit.edu/~jaffer/Solid/#Example">http://swissnet.ai.mit.edu/~jaffer/Solid/#Example</A> gives an +example use of this package. +</P> +<P> + +<A NAME="IDX636"></A> +</P> +<DL> +<DT><U>Function:</U> <B>vrml</B> <I>node <small>...</small></I> +<DD>Returns the VRML97 string (including header) of the concatenation +of strings <VAR>nodes</VAR>, <small>...</small>. +</DL> +<P> + +<A NAME="IDX637"></A> +</P> +<DL> +<DT><U>Function:</U> <B>vrml-append</B> <I>node1 node2 <small>...</small></I> +<DD>Returns the concatenation with interdigitated newlines of +strings <VAR>node1</VAR>, <VAR>node2</VAR>, <small>...</small>. +</DL> +<P> + +<A NAME="IDX638"></A> +</P> +<DL> +<DT><U>Function:</U> <B>vrml-to-file</B> <I>file node <small>...</small></I> +<DD>Writes to file named <VAR>file</VAR> the VRML97 string (including header) of +the concatenation of strings <VAR>nodes</VAR>, <small>...</small>. +</DL> +<P> + +<A NAME="IDX639"></A> +</P> +<DL> +<DT><U>Function:</U> <B>world:info</B> <I>title info <small>...</small></I> +<DD>Returns a VRML97 string setting the title of the file in which +it appears to <VAR>title</VAR>. Additional strings <VAR>info</VAR>, <small>...</small> are comments. +</DL> +<P> + +VRML97 strings passed to <CODE>vrml</CODE> and <CODE>vrml-to-file</CODE> as +arguments will appear in the resulting VRML code. This string turns +off the headlight at the viewpoint: +<TABLE><tr><td> </td><td class=example><pre>" NavigationInfo {headlight FALSE}" +</pre></td></tr></table><P> + +<A NAME="IDX640"></A> +</P> +<DL> +<DT><U>Function:</U> <B>scene:panorama</B> <I>front right back left top bottom</I> +<DD>Specifies the distant images on the inside faces of the cube +enclosing the virtual world. +</DL> +<P> + +<A NAME="IDX641"></A> +</P> +<DL> +<DT><U>Function:</U> <B>scene:sphere</B> <I>colors angles</I> +<DD><P> + +<VAR>colors</VAR> is a list of color objects. Each may be of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB integer, or a list of 3 numbers +between 0.0 and 1.0. +</P> +<P> + +<VAR>angles</VAR> is a list of non-increasing angles the same length as +<VAR>colors</VAR>. Each angle is between 90 and -90 degrees. If 90 or -90 are not +elements of <VAR>angles</VAR>, then the color at the zenith and nadir are taken from +the colors paired with the angles nearest them. +</P> +<P> + +<CODE>scene:sphere</CODE> fills horizontal bands with interpolated colors on the backgroud +sphere encasing the world. +</P> +</DL> +<P> + +<A NAME="IDX642"></A> +</P> +<DL> +<DT><U>Function:</U> <B>scene:sky-and-dirt</B> +<DD>Returns a blue and brown backgroud sphere encasing the world. +</DL> +<P> + +<A NAME="IDX643"></A> +</P> +<DL> +<DT><U>Function:</U> <B>scene:sky-and-grass</B> +<DD>Returns a blue and green backgroud sphere encasing the world. +</DL> +<P> + +<A NAME="IDX644"></A> +</P> +<DL> +<DT><U>Function:</U> <B>scene:sun</B> <I>latitude julian-day hour turbidity strength</I> +<DD><P> + +<A NAME="IDX645"></A> +<DT><U>Function:</U> <B>scene:sun</B> <I>latitude julian-day hour turbidity</I> +<DD></P> +<P> + +<VAR>latitude</VAR> is the virtual place's latitude in degrees. <VAR>julian-day</VAR> is an integer from +0 to 366, the day of the year. <VAR>hour</VAR> is a real number from 0 to 24 for +the time of day; 12 is noon. <VAR>turbidity</VAR> is the degree of fogginess described +in See section <A HREF="slib_5.html#SEC133">turbidity</A>. +</P> +<P> + +<CODE>scene:sun</CODE> returns a bright yellow, distant sphere where the sun would be at +<VAR>hour</VAR> on <VAR>julian-day</VAR> at <VAR>latitude</VAR>. If <VAR>strength</VAR> is positive, included is a light source of <VAR>strength</VAR> +(default 1). +</P> +</DL> +<P> + +<A NAME="IDX646"></A> +</P> +<DL> +<DT><U>Function:</U> <B>scene:overcast</B> <I>latitude julian-day hour turbidity strength</I> +<DD><P> + +<A NAME="IDX647"></A> +<DT><U>Function:</U> <B>scene:overcast</B> <I>latitude julian-day hour turbidity</I> +<DD></P> +<P> + +<VAR>latitude</VAR> is the virtual place's latitude in degrees. <VAR>julian-day</VAR> is an integer from +0 to 366, the day of the year. <VAR>hour</VAR> is a real number from 0 to 24 for +the time of day; 12 is noon. <VAR>turbidity</VAR> is the degree of cloudiness described +in See section <A HREF="slib_5.html#SEC133">turbidity</A>. +</P> +<P> + +<CODE>scene:overcast</CODE> returns an overcast sky as it might look at <VAR>hour</VAR> on <VAR>julian-day</VAR> at <VAR>latitude</VAR>. If <VAR>strength</VAR> +is positive, included is an ambient light source of <VAR>strength</VAR> (default 1). +</P> +</DL> +Viewpoints are objects in the virtual world, and can be transformed +individually or with solid objects. +<P> + +<A NAME="IDX648"></A> +</P> +<DL> +<DT><U>Function:</U> <B>scene:viewpoint</B> <I>name distance compass pitch</I> +<DD><P> + +<A NAME="IDX649"></A> +<DT><U>Function:</U> <B>scene:viewpoint</B> <I>name distance compass</I> +<DD>Returns a viewpoint named <VAR>name</VAR> facing the origin and placed <VAR>distance</VAR> from it. +<VAR>compass</VAR> is a number from 0 to 360 giving the compass heading. <VAR>pitch</VAR> is a +number from -90 to 90, defaulting to 0, specifying the angle from the +horizontal. +</P> +</DL> +<P> + +<A NAME="IDX650"></A> +</P> +<DL> +<DT><U>Function:</U> <B>scene:viewpoints</B> <I>proximity</I> +<DD>Returns 6 viewpoints, one at the center of each face of a cube +with sides 2 * <VAR>proximity</VAR>, centered on the origin. +</DL> +<A NAME="SEC113"></A> +<H3> Light Sources </H3> +<!--docid::SEC113::--> +<P> + +In VRML97, lights shine only on objects within the same children node +and descendants of that node. Although it would have been convenient +to let light direction be rotated by <CODE>solid:rotation</CODE>, this +restricts a rotated light's visibility to objects rotated with it. +</P> +<P> + +To workaround this limitation, these directional light source +procedures accept either Cartesian or spherical coordinates for +direction. A spherical coordinate is a list <CODE>(<VAR>theta</VAR> +<VAR>azimuth</VAR>)</CODE>; where <VAR>theta</VAR> is the angle in degrees from the +zenith, and <VAR>azimuth</VAR> is the angle in degrees due west of south. +</P> +<P> + +It is sometimes useful for light sources to be brighter than `<SAMP>1</SAMP>'. +When <VAR>intensity</VAR> arguments are greater than 1, these functions +gang multiple sources to reach the desired strength. +</P> +<P> + +<A NAME="IDX651"></A> +</P> +<DL> +<DT><U>Function:</U> <B>light:ambient</B> <I>color intensity</I> +<DD><P> + +<A NAME="IDX652"></A> +<DT><U>Function:</U> <B>light:ambient</B> <I>color</I> +<DD>Ambient light shines on all surfaces with which it is grouped. +</P> +<P> + +<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB +integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f, +then the default color will be used. <VAR>intensity</VAR> is a real non-negative number +defaulting to `<SAMP>1</SAMP>'. +</P> +<P> + +<CODE>light:ambient</CODE> returns a light source or sources of <VAR>color</VAR> with total strength of <VAR>intensity</VAR> +(or 1 if omitted). +</P> +</DL> +<P> + +<A NAME="IDX653"></A> +</P> +<DL> +<DT><U>Function:</U> <B>light:directional</B> <I>color direction intensity</I> +<DD><P> + +<A NAME="IDX654"></A> +<DT><U>Function:</U> <B>light:directional</B> <I>color direction</I> +<DD></P> +<P> + +<A NAME="IDX655"></A> +<DT><U>Function:</U> <B>light:directional</B> <I>color</I> +<DD>Directional light shines parallel rays with uniform intensity on all +objects with which it is grouped. +</P> +<P> + +<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB +integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f, +then the default color will be used. +</P> +<P> + +<VAR>direction</VAR> must be a list or vector of 2 or 3 numbers specifying the direction +to this light. If <VAR>direction</VAR> has 2 numbers, then these numbers are the angle +from zenith and the azimuth in degrees; if <VAR>direction</VAR> has 3 numbers, then +these are taken as a Cartesian vector specifying the direction to the +light source. The default direction is upwards; thus its light will +shine down. +</P> +<P> + +<VAR>intensity</VAR> is a real non-negative number defaulting to `<SAMP>1</SAMP>'. +</P> +<P> + +<CODE>light:directional</CODE> returns a light source or sources of <VAR>color</VAR> with total strength of <VAR>intensity</VAR>, +shining from <VAR>direction</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX656"></A> +</P> +<DL> +<DT><U>Function:</U> <B>light:beam</B> <I>attenuation radius aperture peak</I> +<DD><P> + +<A NAME="IDX657"></A> +<DT><U>Function:</U> <B>light:beam</B> <I>attenuation radius aperture</I> +<DD></P> +<P> + +<A NAME="IDX658"></A> +<DT><U>Function:</U> <B>light:beam</B> <I>attenuation radius</I> +<DD></P> +<P> + +<A NAME="IDX659"></A> +<DT><U>Function:</U> <B>light:beam</B> <I>attenuation</I> +<DD></P> +<P> + +<VAR>attenuation</VAR> is a list or vector of three nonnegative real numbers specifying +the reduction of intensity, the reduction of intensity with distance, +and the reduction of intensity as the square of distance. <VAR>radius</VAR> is the +distance beyond which the light does not shine. <VAR>radius</VAR> defaults to +`<SAMP>100</SAMP>'. +</P> +<P> + +<VAR>aperture</VAR> is a real number between 0 and 180, the angle centered on the +light's axis through which it sheds some light. <VAR>peak</VAR> is a real number +between 0 and 90, the angle of greatest illumination. +</P> +</DL> +<P> + +<A NAME="IDX660"></A> +</P> +<DL> +<DT><U>Function:</U> <B>light:point</B> <I>location color intensity beam</I> +<DD><P> + +<A NAME="IDX661"></A> +<DT><U>Function:</U> <B>light:point</B> <I>location color intensity</I> +<DD></P> +<P> + +<A NAME="IDX662"></A> +<DT><U>Function:</U> <B>light:point</B> <I>location color</I> +<DD></P> +<P> + +<A NAME="IDX663"></A> +<DT><U>Function:</U> <B>light:point</B> <I>location</I> +<DD></P> +<P> + +Point light radiates from <VAR>location</VAR>, intensity decreasing with distance, +towards all objects with which it is grouped. +</P> +<P> + +<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB +integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f, +then the default color will be used. <VAR>intensity</VAR> is a real non-negative number +defaulting to `<SAMP>1</SAMP>'. <VAR>beam</VAR> is a structure returned by +<CODE>light:beam</CODE> or #f. +</P> +<P> + +<CODE>light:point</CODE> returns a light source or sources at <VAR>location</VAR> of <VAR>color</VAR> with total strength +<VAR>intensity</VAR> and <VAR>beam</VAR> properties. Note that the pointlight itself is not visible. +To make it so, place an object with emissive appearance at <VAR>location</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX664"></A> +</P> +<DL> +<DT><U>Function:</U> <B>light:spot</B> <I>location direction color intensity beam</I> +<DD><P> + +<A NAME="IDX665"></A> +<DT><U>Function:</U> <B>light:spot</B> <I>location direction color intensity</I> +<DD></P> +<P> + +<A NAME="IDX666"></A> +<DT><U>Function:</U> <B>light:spot</B> <I>location direction color</I> +<DD></P> +<P> + +<A NAME="IDX667"></A> +<DT><U>Function:</U> <B>light:spot</B> <I>location direction</I> +<DD></P> +<P> + +<A NAME="IDX668"></A> +<DT><U>Function:</U> <B>light:spot</B> <I>location</I> +<DD></P> +<P> + +Spot light radiates from <VAR>location</VAR> towards <VAR>direction</VAR>, intensity decreasing with +distance, illuminating objects with which it is grouped. +</P> +<P> + +<VAR>direction</VAR> must be a list or vector of 2 or 3 numbers specifying the direction +to this light. If <VAR>direction</VAR> has 2 numbers, then these numbers are the angle +from zenith and the azimuth in degrees; if <VAR>direction</VAR> has 3 numbers, then +these are taken as a Cartesian vector specifying the direction to the +light source. The default direction is upwards; thus its light will +shine down. +</P> +<P> + +<VAR>color</VAR> is a an object of type <A HREF="slib_5.html#SEC119">color</A>, a 24-bit sRGB +integer, or a list of 3 numbers between 0.0 and 1.0. If <VAR>color</VAR> is #f, +then the default color will be used. +</P> +<P> + +<VAR>intensity</VAR> is a real non-negative number defaulting to `<SAMP>1</SAMP>'. +</P> +<P> + +<CODE>light:spot</CODE> returns a light source or sources at <VAR>location</VAR> of <VAR>direction</VAR> with total strength +<VAR>color</VAR>. Note that the spotlight itself is not visible. To make it so, +place an object with emissive appearance at <VAR>location</VAR>. +</P> +</DL> +<A NAME="SEC114"></A> +<H3> Object Primitives </H3> +<!--docid::SEC114::--> +<P> + +<A NAME="IDX669"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:box</B> <I>geometry appearance</I> +<DD><P> + +<A NAME="IDX670"></A> +<DT><U>Function:</U> <B>solid:box</B> <I>geometry</I> +<DD><VAR>geometry</VAR> must be a number or a list or vector of three numbers. If <VAR>geometry</VAR> is a +number, the <CODE>solid:box</CODE> returns a cube with sides of length <VAR>geometry</VAR> centered on the +origin. Otherwise, <CODE>solid:box</CODE> returns a rectangular box with dimensions <VAR>geometry</VAR> +centered on the origin. <VAR>appearance</VAR> determines the surface properties of the +returned object. +</P> +</DL> +<P> + +<A NAME="IDX671"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:cylinder</B> <I>radius height appearance</I> +<DD><P> + +<A NAME="IDX672"></A> +<DT><U>Function:</U> <B>solid:cylinder</B> <I>radius height</I> +<DD>Returns a right cylinder with dimensions <VAR>radius</VAR> and <CODE>(abs <VAR>height</VAR>)</CODE> +centered on the origin. If <VAR>height</VAR> is positive, then the cylinder ends +will be capped. <VAR>appearance</VAR> determines the surface properties of the returned +object. +</P> +</DL> +<P> + +<A NAME="IDX673"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:disk</B> <I>radius thickness appearance</I> +<DD><P> + +<A NAME="IDX674"></A> +<DT><U>Function:</U> <B>solid:disk</B> <I>radius thickness</I> +<DD><VAR>thickness</VAR> must be a positive real number. <CODE>solid:disk</CODE> returns a circular disk +with dimensions <VAR>radius</VAR> and <VAR>thickness</VAR> centered on the origin. <VAR>appearance</VAR> determines the +surface properties of the returned object. +</P> +</DL> +<P> + +<A NAME="IDX675"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:cone</B> <I>radius height appearance</I> +<DD><P> + +<A NAME="IDX676"></A> +<DT><U>Function:</U> <B>solid:cone</B> <I>radius height</I> +<DD>Returns an isosceles cone with dimensions <VAR>radius</VAR> and <VAR>height</VAR> centered on +the origin. <VAR>appearance</VAR> determines the surface properties of the returned +object. +</P> +</DL> +<P> + +<A NAME="IDX677"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:pyramid</B> <I>side height appearance</I> +<DD><P> + +<A NAME="IDX678"></A> +<DT><U>Function:</U> <B>solid:pyramid</B> <I>side height</I> +<DD>Returns an isosceles pyramid with dimensions <VAR>side</VAR> and <VAR>height</VAR> centered on +the origin. <VAR>appearance</VAR> determines the surface properties of the returned +object. +</P> +</DL> +<P> + +<A NAME="IDX679"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:sphere</B> <I>radius appearance</I> +<DD><P> + +<A NAME="IDX680"></A> +<DT><U>Function:</U> <B>solid:sphere</B> <I>radius</I> +<DD>Returns a sphere of radius <VAR>radius</VAR> centered on the origin. <VAR>appearance</VAR> determines +the surface properties of the returned object. +</P> +</DL> +<P> + +<A NAME="IDX681"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:ellipsoid</B> <I>geometry appearance</I> +<DD><P> + +<A NAME="IDX682"></A> +<DT><U>Function:</U> <B>solid:ellipsoid</B> <I>geometry</I> +<DD><VAR>geometry</VAR> must be a number or a list or vector of three numbers. If <VAR>geometry</VAR> is a +number, the <CODE>solid:ellipsoid</CODE> returns a sphere of diameter <VAR>geometry</VAR> centered on the origin. +Otherwise, <CODE>solid:ellipsoid</CODE> returns an ellipsoid with diameters <VAR>geometry</VAR> centered on the +origin. <VAR>appearance</VAR> determines the surface properties of the returned object. +</P> +</DL> +<P> + +<A NAME="IDX683"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:basrelief</B> <I>width height depth colorray appearance</I> +<DD><P> + +<A NAME="IDX684"></A> +<DT><U>Function:</U> <B>solid:basrelief</B> <I>width height depth appearance</I> +<DD></P> +<P> + +<A NAME="IDX685"></A> +<DT><U>Function:</U> <B>solid:basrelief</B> <I>width height depth</I> +<DD>One of <VAR>width</VAR>, <VAR>height</VAR>, or <VAR>depth</VAR> must be a 2-dimensional array; the others must +be real numbers giving the length of the basrelief in those +dimensions. The rest of this description assumes that <VAR>height</VAR> is an +array of heights. +</P> +<P> + +<CODE>solid:basrelief</CODE> returns a <VAR>width</VAR> by <VAR>depth</VAR> basrelief solid with heights per array <VAR>height</VAR> with +the buttom surface centered on the origin. +</P> +<P> + +If present, <VAR>appearance</VAR> determines the surface properties of the returned +object. If present, <VAR>colorray</VAR> must be an array of objects of type +<A HREF="slib_5.html#SEC119">color</A>, 24-bit sRGB integers or lists of 3 +numbers between 0.0 and 1.0. +</P> +<P> + +If <VAR>colorray</VAR>'s dimensions match <VAR>height</VAR>, then each element of <VAR>colorray</VAR> paints its +corresponding vertex of <VAR>height</VAR>. If <VAR>colorray</VAR> has all dimensions one smaller +than <VAR>height</VAR>, then each element of <VAR>colorray</VAR> paints the corresponding face of +<VAR>height</VAR>. Other dimensions for <VAR>colorray</VAR> are in error. +</P> +</DL> +<A NAME="SEC115"></A> +<H3> Surface Attributes </H3> +<!--docid::SEC115::--> +<P> + +<A NAME="IDX686"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor shininess emissiveColor transparency</I> +<DD><P> + +<A NAME="IDX687"></A> +<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor shininess emissiveColor</I> +<DD></P> +<P> + +<A NAME="IDX688"></A> +<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor shininess</I> +<DD></P> +<P> + +<A NAME="IDX689"></A> +<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity specularColor</I> +<DD></P> +<P> + +<A NAME="IDX690"></A> +<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor ambientIntensity</I> +<DD></P> +<P> + +<A NAME="IDX691"></A> +<DT><U>Function:</U> <B>solid:color</B> <I>diffuseColor</I> +<DD></P> +<P> + +Returns an <EM>appearance</EM>, the optical properties of the objects +<A NAME="IDX692"></A> +with which it is associated. <VAR>ambientIntensity</VAR>, <VAR>shininess</VAR>, and <VAR>transparency</VAR> must be numbers between 0 +and 1. <VAR>diffuseColor</VAR>, <VAR>specularColor</VAR>, and <VAR>emissiveColor</VAR> are objects of type <A HREF="slib_5.html#SEC119">color</A>, +24-bit sRGB integers or lists of 3 numbers between 0.0 and 1.0. +If a color argument is omitted or #f, then the default color will be used. +</P> +</DL> +<P> + +<A NAME="IDX693"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale rotation center translation</I> +<DD><P> + +<A NAME="IDX694"></A> +<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale rotation center</I> +<DD></P> +<P> + +<A NAME="IDX695"></A> +<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale rotation</I> +<DD></P> +<P> + +<A NAME="IDX696"></A> +<DT><U>Function:</U> <B>solid:texture</B> <I>image color scale</I> +<DD></P> +<P> + +<A NAME="IDX697"></A> +<DT><U>Function:</U> <B>solid:texture</B> <I>image color</I> +<DD></P> +<P> + +<A NAME="IDX698"></A> +<DT><U>Function:</U> <B>solid:texture</B> <I>image</I> +<DD></P> +<P> + +Returns an <EM>appearance</EM>, the optical properties of the objects +<A NAME="IDX699"></A> +with which it is associated. <VAR>image</VAR> is a string naming a JPEG or PNG +image resource. <VAR>color</VAR> is #f, a color, or the string returned by +<CODE>solid:color</CODE>. The rest of the optional arguments specify +2-dimensional transforms applying to the <VAR>image</VAR>. +</P> +<P> + +<VAR>scale</VAR> must be #f, a number, or list or vector of 2 numbers specifying the +scale to apply to <VAR>image</VAR>. <VAR>rotation</VAR> must be #f or the number of degrees to +rotate <VAR>image</VAR>. <VAR>center</VAR> must be #f or a list or vector of 2 numbers specifying +the center of <VAR>image</VAR> relative to the <VAR>image</VAR> dimensions. <VAR>translation</VAR> must be #f or a +list or vector of 2 numbers specifying the translation to apply to <VAR>image</VAR>. +</P> +</DL> +<A NAME="SEC116"></A> +<H3> Aggregating Objects </H3> +<!--docid::SEC116::--> +<P> + +<A NAME="IDX700"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:center-row-of</B> <I>number solid spacing</I> +<DD>Returns a row of <VAR>number</VAR> <VAR>solid</VAR> objects spaced evenly <VAR>spacing</VAR> apart. +</DL> +<P> + +<A NAME="IDX701"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:center-array-of</B> <I>number-a number-b solid spacing-a spacing-b</I> +<DD>Returns <VAR>number-b</VAR> rows, <VAR>spacing-b</VAR> apart, of <VAR>number-a</VAR> <VAR>solid</VAR> objects <VAR>spacing-a</VAR> apart. +</DL> +<P> + +<A NAME="IDX702"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:center-pile-of</B> <I>number-a number-b number-c solid spacing-a spacing-b spacing-c</I> +<DD>Returns <VAR>number-c</VAR> planes, <VAR>spacing-c</VAR> apart, of <VAR>number-b</VAR> rows, <VAR>spacing-b</VAR> apart, of <VAR>number-a</VAR> <VAR>solid</VAR> objects <VAR>spacing-a</VAR> apart. +</DL> +<P> + +<A NAME="IDX703"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:arrow</B> <I>center</I> +<DD><P> + +<VAR>center</VAR> must be a list or vector of three numbers. Returns an upward +pointing metallic arrow centered at <VAR>center</VAR>. +</P> +<P> + +<A NAME="IDX704"></A> +<DT><U>Function:</U> <B>solid:arrow</B> +<DD>Returns an upward pointing metallic arrow centered at the origin. +</P> +</DL> +<A NAME="SEC117"></A> +<H3> Spatial Transformations </H3> +<!--docid::SEC117::--> +<P> + +<A NAME="IDX705"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:translation</B> <I>center solid <small>...</small></I> +<DD><VAR>center</VAR> must be a list or vector of three numbers. <CODE>solid:translation</CODE> Returns an +aggregate of <VAR>solids</VAR>, <small>...</small> with their origin moved to <VAR>center</VAR>. +</DL> +<P> + +<A NAME="IDX706"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:scale</B> <I>scale solid <small>...</small></I> +<DD><VAR>scale</VAR> must be a number or a list or vector of three numbers. <CODE>solid:scale</CODE> +Returns an aggregate of <VAR>solids</VAR>, <small>...</small> scaled per <VAR>scale</VAR>. +</DL> +<P> + +<A NAME="IDX707"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solid:rotation</B> <I>axis angle solid <small>...</small></I> +<DD><VAR>axis</VAR> must be a list or vector of three numbers. <CODE>solid:rotation</CODE> Returns an +aggregate of <VAR>solids</VAR>, <small>...</small> rotated <VAR>angle</VAR> degrees around the axis <VAR>axis</VAR>. +</DL> +<P> + +<A NAME="Color"></A> +<HR SIZE="6"> +<A NAME="SEC118"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC112"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC119"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.9 Color </H2> +<!--docid::SEC118::--> +<P> + +<A NAME="Color"></A> +</P> +<P> + +<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color">http://swissnet.ai.mit.edu/~jaffer/Color</A> +</P> +<P> + +The goals of this package are to provide methods to specify, compute, +and transform colors in a core set of additive color spaces. The color +spaces supported should be sufficient for working with the color data +encountered in practice and the literature. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'color</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC122">5.9.2 Color Spaces</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">XYZ, L*a*b*, L*u*v*, L*C*h, RGB709, sRGB</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Color Temperatures and CIEXYZ(1931)</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Society of Dyers and Colorists</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Low-level</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC130">5.9.6 Color Names</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">in relational databases</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_5.html#SEC133">5.9.7 Daylight</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Sunlight and sky colors</TD></TR> +</TABLE> +<P> + +<A NAME="Color Data-Type"></A> +<HR SIZE="6"> +<A NAME="SEC119"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC120"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.9.1 Color Data-Type </H3> +<!--docid::SEC119::--> +<P> + +<A NAME="Color_Data-Type"></A> +<CODE>(require 'color)</CODE> +</P> +<P> + +<A NAME="IDX708"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color?</B> <I>obj</I> +<DD>Returns #t if <VAR>obj</VAR> is a color. +<P> + +<A NAME="IDX709"></A> +<DT><U>Function:</U> <B>color?</B> <I>obj typ</I> +<DD>Returns #t if <VAR>obj</VAR> is a color of color-space <VAR>typ</VAR>. The symbol +<VAR>typ</VAR> must be one of: +</P> +<P> + +<UL> +<LI> +CIEXYZ +<LI> +RGB709 +<LI> +L*a*b* +<LI> +L*u*v* +<LI> +sRGB +<LI> +e-sRGB +<LI> +L*C*h +</UL> +</DL> +<P> + +<A NAME="IDX710"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-color</B> <I>space arg <small>...</small></I> +<DD>Returns a color of type <VAR>space</VAR>. +</DL> +<P> + +<A NAME="IDX711"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color-space</B> <I>color</I> +<DD>Returns the symbol for the color-space in which <VAR>color</VAR> is embedded. +</DL> +<P> + +<A NAME="IDX712"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color-precision</B> <I>color</I> +<DD>For colors in digital color-spaces, <CODE>color-precision</CODE> returns the +number of bits used for each of the R, G, and B channels of the +encoding. Otherwise, <CODE>color-precision</CODE> returns #f +</DL> +<P> + +<A NAME="IDX713"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color-white-point</B> <I>color</I> +<DD>Returns the white-point of <VAR>color</VAR> in all color-spaces except CIEXYZ. +</DL> +<P> + +<A NAME="IDX714"></A> +</P> +<DL> +<DT><U>Function:</U> <B>convert-color</B> <I>color space white-point</I> +<DD><A NAME="IDX715"></A> +<DT><U>Function:</U> <B>convert-color</B> <I>color space</I> +<DD><A NAME="IDX716"></A> +<DT><U>Function:</U> <B>convert-color</B> <I>color e-sRGB precision</I> +<DD>Converts <VAR>color</VAR> into <VAR>space</VAR> at optional <VAR>white-point</VAR>. +</DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC120"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC119"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC121"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 5.9.1.1 External Representation </H4> +<!--docid::SEC120::--> +<P> + +Each color encoding has an external, case-insensitive representation. +To ensure portability, the white-point for all color strings is D65. +<A NAME="DOCF4" HREF="slib_fot.html#FOOT4">(4)</A> +</P> +<P> + +</P> +<TABLE> +<TR><TD>Color Space</TD> +</TD><TD> External Representation +</TR> +<TR><TD>CIEXYZ</TD> +</TD><TD> CIEXYZ:<I><X></I>/<I><Y></I>/<I><Z></I> +</TR> +<TR><TD>RGB709</TD> +</TD><TD> RGBi:<I><R></I>/<I><G></I>/<I><B></I> +</TR> +<TR><TD>L*a*b*</TD> +</TD><TD> CIELAB:<I><L></I>/<I><a></I>/<I><b></I> +</TR> +<TR><TD>L*u*v*</TD> +</TD><TD> CIELuv:<I><L></I>/<I><u></I>/<I><v></I> +</TR> +<TR><TD>L*C*h</TD> +</TD><TD> CIELCh:<I><L></I>/<I><C></I>/<I><h></I> +</TR></TABLE> +<P> + +The <VAR>X</VAR>, <VAR>Y</VAR>, <VAR>Z</VAR>, <VAR>L</VAR>, <VAR>a</VAR>, <VAR>b</VAR>, <VAR>u</VAR>, +<VAR>v</VAR>, <VAR>C</VAR>, <VAR>h</VAR>, <VAR>R</VAR>, <VAR>G</VAR>, and <VAR>B</VAR> fields are +(Scheme) real numbers within the appropriate ranges. +</P> +<P> + +</P> +<TABLE> +<TR><TD>Color Space</TD> +</TD><TD> External Representation +</TR> +<TR><TD>sRGB</TD> +</TD><TD> sRGB:<I><R></I>/<I><G></I>/<I><B></I> +</TR> +<TR><TD>e-sRGB10</TD> +</TD><TD> e-sRGB10:<I><R></I>/<I><G></I>/<I><B></I> +</TR> +<TR><TD>e-sRGB12</TD> +</TD><TD> e-sRGB12:<I><R></I>/<I><G></I>/<I><B></I> +</TR> +<TR><TD>e-sRGB16</TD> +</TD><TD> e-sRGB16:<I><R></I>/<I><G></I>/<I><B></I> +</TR></TABLE> +<P> + +The <VAR>R</VAR>, <VAR>G</VAR>, and <VAR>B</VAR>, fields are non-negative exact decimal +integers within the appropriate ranges. +</P> +<P> + +Several additional syntaxes are supported by <CODE>string->color</CODE>: +</P> +<P> + +</P> +<TABLE> +<TR><TD>Color Space</TD> +</TD><TD> External Representation +</TR> +<TR><TD>sRGB</TD> +</TD><TD> sRGB:<I><RRGGBB></I> +</TR> +<TR><TD>sRGB</TD> +</TD><TD> #<I><RRGGBB></I> +</TR> +<TR><TD>sRGB</TD> +</TD><TD> 0x<I><RRGGBB></I> +</TR> +<TR><TD>sRGB</TD> +</TD><TD> #x<I><RRGGBB></I> +</TR></TABLE> +<P> + +Where <VAR>RRGGBB</VAR> is a non-negative six-digit hexadecimal number. +</P> +<P> + +<A NAME="IDX717"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color->string</B> <I>color</I> +<DD>Returns a string representation of <VAR>color</VAR>. +</DL> +<P> + +<A NAME="IDX718"></A> +</P> +<DL> +<DT><U>Function:</U> <B>string->color</B> <I>string</I> +<DD>Returns the color represented by <VAR>string</VAR>. If <VAR>string</VAR> is not a +syntactically valid notation for a color, then <CODE>string->color</CODE> +returns #f. +</DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC121"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC120"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC122"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 5.9.1.2 White </H4> +<!--docid::SEC121::--> +<P> + +We experience color relative to the illumination around us. +CIEXYZ coordinates, although subject to uniform scaling, are +objective. Thus other color spaces are specified relative to a +<A NAME="IDX719"></A> +<EM>white point</EM> in CIEXYZ coordinates. +<A NAME="IDX720"></A> +</P> +<P> + +The white point for digital color spaces is set to D65. For the other +spaces a <VAR>white-point</VAR> argument can be specified. The default if +none is specified is the white-point with which the color was created +or last converted; and D65 if none has been specified. +</P> +<P> + +<A NAME="IDX721"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>D65</B> +<DD>Is the color of 6500.K (blackbody) illumination. D65 is close +to the average color of daylight. +</DL> +<P> + +<A NAME="IDX722"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>D50</B> +<DD>Is the color of 5000.K (blackbody) illumination. D50 is the color of +indoor lighting by incandescent bulbs, whose filaments have +temperatures around 5000.K. +</DL> +<P> + +<A NAME="Color Spaces"></A> +<HR SIZE="6"> +<A NAME="SEC122"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC121"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC127"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.9.2 Color Spaces </H3> +<!--docid::SEC122::--> +<P> + +<A NAME="Color_Spaces"></A> +<A NAME="SEC123"></A> +<H4> Measurement-based Color Spaces </H4> +<!--docid::SEC123::--> +<P> + +<A NAME="IDX723"></A> +The <EM>tristimulus</EM> color spaces are those whose component values +<A NAME="IDX724"></A> +are proportional measurements of light intensity. The CIEXYZ(1931) +system provides 3 sets of spectra to convolve with a spectrum of +interest. The result of those convolutions is coordinates in CIEXYZ +space. All tristimuls color spaces are related to CIEXYZ by linear +transforms, namely matrix multiplication. Of the color spaces listed +here, CIEXYZ and RGB709 are tristimulus spaces. +</P> +<P> + +<A NAME="IDX725"></A> +</P> +<DL> +<DT><U>Color Space:</U> <B>CIEXYZ</B> +<DD>The CIEXYZ color space covers the full <EM>gamut</EM>. +<A NAME="IDX726"></A> +It is the basis for color-space conversions. +<P> + +CIEXYZ is a list of three inexact numbers between 0 and 1.1. +'(0. 0. 0.) is black; '(1. 1. 1.) is white. +</P> +</DL> +<P> + +<A NAME="IDX727"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ciexyz->color</B> <I>xyz</I> +<DD><P> + +<VAR>xyz</VAR> must be a list of 3 numbers. If <VAR>xyz</VAR> is valid CIEXYZ coordinates, +then <CODE>ciexyz->color</CODE> returns the color specified by <VAR>xyz</VAR>; otherwise returns #f. +</P> +</DL> +<P> + +<A NAME="IDX728"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color:ciexyz</B> <I>x y z</I> +<DD><P> + +Returns the CIEXYZ color composed of <VAR>x</VAR>, <VAR>y</VAR>, <VAR>z</VAR>. If the +coordinates do not encode a valid CIEXYZ color, then an error is +signaled. +</P> +</DL> +<P> + +<A NAME="IDX729"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color->ciexyz</B> <I>color</I> +<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in CIEXYZ. +</DL> +<A NAME="IDX730"></A> +<DL> +<DT><U>Color Space:</U> <B>RGB709</B> +<DD>BT.709-4 (03/00) <CITE>Parameter values for the HDTV standards for +production and international programme exchange</CITE> specifies parameter +values for chromaticity, sampling, signal format, frame rates, etc., of +high definition television signals. +<P> + +An RGB709 color is represented by a list of three inexact numbers +between 0 and 1. '(0. 0. 0.) is black '(1. 1. 1.) is white. +</P> +</DL> +<P> + +<A NAME="IDX731"></A> +</P> +<DL> +<DT><U>Function:</U> <B>rgb709->color</B> <I>rgb</I> +<DD><P> + +<VAR>rgb</VAR> must be a list of 3 numbers. If <VAR>rgb</VAR> is valid RGB709 coordinates, +then <CODE>rgb709->color</CODE> returns the color specified by <VAR>rgb</VAR>; otherwise returns #f. +</P> +</DL> +<P> + +<A NAME="IDX732"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color:rgb709</B> <I>r g b</I> +<DD><P> + +Returns the RGB709 color composed of <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>. If the +coordinates do not encode a valid RGB709 color, then an error is +signaled. +</P> +</DL> +<P> + +<A NAME="IDX733"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color->rgb709</B> <I>color</I> +<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in RGB709. +</DL> +<A NAME="SEC124"></A> +<H4> Perceptual Uniformity </H4> +<!--docid::SEC124::--> +<P> + +Although properly encoding the chromaticity, tristimulus spaces do not +match the logarithmic response of human visual systems to intensity. +Minimum detectable differences between colors correspond to a smaller +range of distances (6:1) in the L*a*b* and L*u*v* spaces than in +tristimulus spaces (80:1). For this reason, color distances are +computed in L*a*b* (or L*C*h). +</P> +<P> + +<A NAME="IDX734"></A> +</P> +<DL> +<DT><U>Color Space:</U> <B>L*a*b*</B> +<DD>Is a CIE color space which better matches the human visual system's +perception of color. It is a list of three numbers: +<P> + +<UL> +<LI> +0 <= L* <= 100 (CIE <EM>Lightness</EM>) +<A NAME="IDX735"></A> +<P> + +</P> +<LI> +-500 <= a* <= 500 +<LI> +-200 <= b* <= 200 +</UL> +</DL> +<P> + +<A NAME="IDX736"></A> +</P> +<DL> +<DT><U>Function:</U> <B>l*a*b*->color</B> <I>L*a*b* white-point</I> +<DD><P> + +<VAR>L*a*b*</VAR> must be a list of 3 numbers. If <VAR>L*a*b*</VAR> is valid L*a*b* coordinates, +then <CODE>l*a*b*->color</CODE> returns the color specified by <VAR>L*a*b*</VAR>; otherwise returns #f. +</P> +</DL> +<P> + +<A NAME="IDX737"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color:l*a*b*</B> <I>L* a* b* white-point</I> +<DD><P> + +Returns the L*a*b* color composed of <VAR>L*</VAR>, <VAR>a*</VAR>, <VAR>b*</VAR> with <VAR>white-point</VAR>. +</P> +<P> + +<A NAME="IDX738"></A> +<DT><U>Function:</U> <B>color:l*a*b*</B> <I>L* a* b*</I> +<DD>Returns the L*a*b* color composed of <VAR>L*</VAR>, <VAR>a*</VAR>, <VAR>b*</VAR>. If the coordinates +do not encode a valid L*a*b* color, then an error is signaled. +</P> +</DL> +<P> + +<A NAME="IDX739"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color->l*a*b*</B> <I>color white-point</I> +<DD><P> + +Returns the list of 3 numbers encoding <VAR>color</VAR> in L*a*b* with <VAR>white-point</VAR>. +</P> +<P> + +<A NAME="IDX740"></A> +<DT><U>Function:</U> <B>color->l*a*b*</B> <I>color</I> +<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in L*a*b*. +</P> +</DL> +<A NAME="IDX741"></A> +<DL> +<DT><U>Color Space:</U> <B>L*u*v*</B> +<DD>Is another CIE encoding designed to better match the human visual +system's perception of color. +</DL> +<P> + +<A NAME="IDX742"></A> +</P> +<DL> +<DT><U>Function:</U> <B>l*u*v*->color</B> <I>L*u*v* white-point</I> +<DD><P> + +<VAR>L*u*v*</VAR> must be a list of 3 numbers. If <VAR>L*u*v*</VAR> is valid L*u*v* coordinates, +then <CODE>l*u*v*->color</CODE> returns the color specified by <VAR>L*u*v*</VAR>; otherwise returns #f. +</P> +</DL> +<P> + +<A NAME="IDX743"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color:l*u*v*</B> <I>L* u* v* white-point</I> +<DD><P> + +Returns the L*u*v* color composed of <VAR>L*</VAR>, <VAR>u*</VAR>, <VAR>v*</VAR> with <VAR>white-point</VAR>. +</P> +<P> + +<A NAME="IDX744"></A> +<DT><U>Function:</U> <B>color:l*u*v*</B> <I>L* u* v*</I> +<DD>Returns the L*u*v* color composed of <VAR>L*</VAR>, <VAR>u*</VAR>, <VAR>v*</VAR>. If the coordinates +do not encode a valid L*u*v* color, then an error is signaled. +</P> +</DL> +<P> + +<A NAME="IDX745"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color->l*u*v*</B> <I>color white-point</I> +<DD><P> + +Returns the list of 3 numbers encoding <VAR>color</VAR> in L*u*v* with <VAR>white-point</VAR>. +</P> +<P> + +<A NAME="IDX746"></A> +<DT><U>Function:</U> <B>color->l*u*v*</B> <I>color</I> +<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in L*u*v*. +</P> +</DL> +<A NAME="SEC125"></A> +<H4> Cylindrical Coordinates </H4> +<!--docid::SEC125::--> +<P> + +HSL (Hue Saturation Lightness), HSV (Hue Saturation Value), HSI (Hue +Saturation Intensity) and HCI (Hue Chroma Intensity) are cylindrical +color spaces (with angle hue). But these spaces are all defined in +terms device-dependent RGB spaces. +</P> +<P> + +One might wonder if there is some fundamental reason why intuitive +specification of color must be device-dependent. But take heart! A +cylindrical system can be based on L*a*b* and is used for predicting how +close colors seem to observers. +</P> +<P> + +<A NAME="IDX747"></A> +</P> +<DL> +<DT><U>Color Space:</U> <B>L*C*h</B> +<DD>Expresses the *a and b* of L*a*b* in polar coordinates. It is a list of +three numbers: +<P> + +<UL> +<LI> +0 <= L* <= 100 (CIE <EM>Lightness</EM>) +<A NAME="IDX748"></A> +<P> + +</P> +<LI> +C* (CIE <EM>Chroma</EM>) is the distance from the neutral (gray) axis. +<A NAME="IDX749"></A> +<LI> +0 <= h <= 360 (CIE <EM>Hue</EM>) is the angle. +<A NAME="IDX750"></A> +</UL> +<P> + +The colors by quadrant of h are: +</P> +<P> + +</P> +<TABLE> +<TR><TD>0 </TD><TD> red, orange, yellow </TD><TD> 90</TD> +</TR> +<TR><TD>90 </TD><TD> yellow, yellow-green, green </TD><TD> 180</TD> +</TR> +<TR><TD>180 </TD><TD> green, cyan (blue-green), blue </TD><TD> 270</TD> +</TR> +<TR><TD>270 </TD><TD> blue, purple, magenta </TD><TD> 360</TD> +</TR></TABLE> +<P> + +</P> +</DL> +<P> + +<A NAME="IDX751"></A> +</P> +<DL> +<DT><U>Function:</U> <B>l*c*h->color</B> <I>L*C*h white-point</I> +<DD><P> + +<VAR>L*C*h</VAR> must be a list of 3 numbers. If <VAR>L*C*h</VAR> is valid L*C*h coordinates, +then <CODE>l*c*h->color</CODE> returns the color specified by <VAR>L*C*h</VAR>; otherwise returns #f. +</P> +</DL> +<P> + +<A NAME="IDX752"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color:l*c*h</B> <I>L* C* h white-point</I> +<DD><P> + +Returns the L*C*h color composed of <VAR>L*</VAR>, <VAR>C*</VAR>, <VAR>h</VAR> with <VAR>white-point</VAR>. +</P> +<P> + +<A NAME="IDX753"></A> +<DT><U>Function:</U> <B>color:l*c*h</B> <I>L* C* h</I> +<DD>Returns the L*C*h color composed of <VAR>L*</VAR>, <VAR>C*</VAR>, <VAR>h</VAR>. If the coordinates +do not encode a valid L*C*h color, then an error is signaled. +</P> +</DL> +<P> + +<A NAME="IDX754"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color->l*c*h</B> <I>color white-point</I> +<DD><P> + +Returns the list of 3 numbers encoding <VAR>color</VAR> in L*C*h with <VAR>white-point</VAR>. +</P> +<P> + +<A NAME="IDX755"></A> +<DT><U>Function:</U> <B>color->l*c*h</B> <I>color</I> +<DD>Returns the list of 3 numbers encoding <VAR>color</VAR> in L*C*h. +</P> +</DL> +<A NAME="SEC126"></A> +<H4> Digital Color Spaces </H4> +<!--docid::SEC126::--> +<P> + +The color spaces discussed so far are impractical for image data because +of numerical precision and computational requirements. In 1998 the IEC +adopted <CITE>A Standard Default Color Space for the Internet - sRGB</CITE> +(<A HREF="http://www.w3.org/Graphics/Color/sRGB">http://www.w3.org/Graphics/Color/sRGB</A>). sRGB was cleverly +designed to employ the 24-bit (256x256x256) color encoding already in +widespread use; and the 2.2 gamma intrinsic to CRT monitors. +</P> +<P> + +Conversion from CIEXYZ to digital (sRGB) color spaces is accomplished by +conversion first to a RGB709 tristimulus space with D65 white-point; +then each coordinate is individually subjected to the same non-linear +mapping. Inverse operations in the reverse order create the inverse +transform. +</P> +<P> + +<A NAME="IDX756"></A> +</P> +<DL> +<DT><U>Color Space:</U> <B>sRGB</B> +<DD>Is "A Standard Default Color Space for the Internet". Most display +monitors will work fairly well with sRGB directly. Systems using ICC +profiles +<A NAME="IDX757"></A> +<A NAME="DOCF5" HREF="slib_fot.html#FOOT5">(5)</A> +should work very well with sRGB. +<P> + +</P> +</DL> +<P> + +<A NAME="IDX758"></A> +</P> +<DL> +<DT><U>Function:</U> <B>srgb->color</B> <I>rgb</I> +<DD><P> + +<VAR>rgb</VAR> must be a list of 3 numbers. If <VAR>rgb</VAR> is valid sRGB coordinates, +then <CODE>srgb->color</CODE> returns the color specified by <VAR>rgb</VAR>; otherwise returns #f. +</P> +</DL> +<P> + +<A NAME="IDX759"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color:srgb</B> <I>r g b</I> +<DD><P> + +Returns the sRGB color composed of <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>. If the +coordinates do not encode a valid sRGB color, then an error is +signaled. +</P> +</DL> +<A NAME="IDX760"></A> +<DL> +<DT><U>Color Space:</U> <B>xRGB</B> +<DD>Represents the equivalent sRGB color with a single 24-bit integer. The +most significant 8 bits encode red, the middle 8 bits blue, and the +least significant 8 bits green. +</DL> +<P> + +<A NAME="IDX761"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color->srgb</B> <I>color</I> +<DD><P> + +Returns the list of 3 integers encoding <VAR>color</VAR> in sRGB. +</P> +</DL> +<P> + +<A NAME="IDX762"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color->xrgb</B> <I>color</I> +<DD>Returns the 24-bit integer encoding <VAR>color</VAR> in sRGB. +</DL> +<P> + +<A NAME="IDX763"></A> +</P> +<DL> +<DT><U>Function:</U> <B>xrgb->color</B> <I>k</I> +<DD><P> + +Returns the sRGB color composed of the 24-bit integer <VAR>k</VAR>. +</P> +</DL> +<A NAME="IDX764"></A> +<DL> +<DT><U>Color Space:</U> <B>e-sRGB</B> +<DD>Is "Photography - Electronic still picture imaging - Extended sRGB color +encoding" (PIMA 7667:2001). It extends the gamut of sRGB; and its +higher precision numbers provide a larger dynamic range. +<P> + +A triplet of integers represent e-sRGB colors. Three precisions are +supported: +</P> +<P> + +</P> +<DL COMPACT> +<DT>e-sRGB10 +<DD>0 to 1023 +<DT>e-sRGB12 +<DD>0 to 4095 +<DT>e-sRGB16 +<DD>0 to 65535 +</DL> +</DL> +<P> + +<A NAME="IDX765"></A> +</P> +<DL> +<DT><U>Function:</U> <B>e-srgb->color</B> <I>precision rgb</I> +<DD><VAR>precision</VAR> must be the integer 10, 12, or 16. <VAR>rgb</VAR> must be a list of 3 +numbers. If <VAR>rgb</VAR> is valid e-sRGB coordinates, then <CODE>e-srgb->color</CODE> returns the color +specified by <VAR>rgb</VAR>; otherwise returns #f. +</DL> +<P> + +<A NAME="IDX766"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color:e-srgb</B> <I>10 r g b</I> +<DD><P> + +Returns the e-sRGB10 color composed of integers <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>. +</P> +<P> + +<A NAME="IDX767"></A> +<DT><U>Function:</U> <B>color:e-srgb</B> <I>12 r g b</I> +<DD>Returns the e-sRGB12 color composed of integers <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>. +</P> +<P> + +<A NAME="IDX768"></A> +<DT><U>Function:</U> <B>color:e-srgb</B> <I>16 r g b</I> +<DD>Returns the e-sRGB16 color composed of integers <VAR>r</VAR>, <VAR>g</VAR>, <VAR>b</VAR>. +If the coordinates do not encode a valid e-sRGB color, then an error +is signaled. +</P> +</DL> +<P> + +<A NAME="IDX769"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color->e-srgb</B> <I>precision color</I> +<DD><VAR>precision</VAR> must be the integer 10, 12, or 16. <CODE>color->e-srgb</CODE> returns the list of 3 +integers encoding <VAR>color</VAR> in sRGB10, sRGB12, or sRGB16. +</DL> +<P> + +<A NAME="Spectra"></A> +<HR SIZE="6"> +<A NAME="SEC127"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC122"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC128"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.9.3 Spectra </H3> +<!--docid::SEC127::--> +<P> + +<A NAME="Spectra"></A> +The following functions compute colors from spectra, scale color +luminance, and extract chromaticity. XYZ is used in the names of +procedures for unnormalized colors; the coordinates of CIEXYZ colors are +constrained as described in <A HREF="slib_5.html#SEC122">5.9.2 Color Spaces</A>. +</P> +<P> + +<CODE>(require 'color-space)</CODE> +</P> +<P> + +A spectrum may be represented as: +</P> +<P> + +<UL> +<LI> +A procedure of one argument accepting real numbers from 380e-9 to +780e-9, the wavelength in meters; or +<LI> +A vector of real numbers representing intensity samples evenly spaced +over some range of wavelengths overlapping the range 380e-9 to 780e-9. +</UL> +<P> + +CIEXYZ values are calculated as dot-product with the X, Y (Luminance), +and Z <EM>Spectral Tristimulus Values</EM>. The files `<TT>cie1931.xyz</TT>' +and `<TT>cie1964.xyz</TT>' in the distribution contain these CIE-defined +values. +<A NAME="IDX770"></A> +</P> +<P> + +<A NAME="IDX771"></A> +</P> +<DL> +<DT><U>Feature:</U> <B>cie1964</B> +<DD><A NAME="IDX772"></A> +Loads the Spectral Tristimulus Values defining <CITE>CIE 1964 +Supplementary Standard Colorimetric Observer</CITE>. +<A NAME="IDX773"></A> +<DT><U>Feature:</U> <B>cie1931</B> +<DD><A NAME="IDX774"></A> +Loads the Spectral Tristimulus Values defining <CITE>CIE 1931 +Supplementary Standard Colorimetric Observer</CITE>. +<A NAME="IDX775"></A> +<DT><U>Feature:</U> <B>ciexyz</B> +<DD><A NAME="IDX776"></A> +Requires Spectral Tristimulus Values, defaulting to cie1931. +</DL> +<P> + +<CODE>(require 'cie1964)</CODE> or <CODE>(require 'cie1931)</CODE> will +<A NAME="IDX777"></A> +<CODE>load-ciexyz</CODE> specific values used by the following spectrum +conversion procedures. The spectrum conversion procedures +<CODE>(require 'ciexyz)</CODE> to assure that a set is loaded. +</P> +<P> + +<A NAME="IDX778"></A> +</P> +<DL> +<DT><U>Function:</U> <B>spectrum->XYZ</B> <I>proc</I> +<DD><VAR>proc</VAR> must be a function of one argument. <CODE>spectrum->XYZ</CODE> +computes the CIEXYZ(1931) values for the spectrum returned by <VAR>proc</VAR> +when called with arguments from 380e-9 to 780e-9, the wavelength in +meters. +<P> + +<A NAME="IDX779"></A> +<DT><U>Function:</U> <B>spectrum->XYZ</B> <I>spectrum x1 x2</I> +<DD><VAR>x1</VAR> and <VAR>x2</VAR> must be positive real numbers specifying the +wavelengths (in meters) corresponding to the zeroth and last elements of +vector or list <VAR>spectrum</VAR>. <CODE>spectrum->XYZ</CODE> returns the +CIEXYZ(1931) values for a light source with spectral values proportional +to the elements of <VAR>spectrum</VAR> at evenly spaced wavelengths between +<VAR>x1</VAR> and <VAR>x2</VAR>. +</P> +<P> + +Compute the colors of 6500.K and 5000.K blackbody radiation: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'color-space) +(define xyz (spectrum->XYZ (blackbody-spectrum 6500))) +(define y_n (cadr xyz)) +(map (lambda (x) (/ x y_n)) xyz) + => (0.9687111145512467 1.0 1.1210875945303613) + +(define xyz (spectrum->XYZ (blackbody-spectrum 5000))) +(map (lambda (x) (/ x y_n)) xyz) + => (0.2933441826889158 0.2988931825387761 0.25783646831201573) +</pre></td></tr></table><P> + +<A NAME="IDX780"></A> +<DT><U>Function:</U> <B>spectrum->CIEXYZ</B> <I>proc</I> +<DD><A NAME="IDX781"></A> +<DT><U>Function:</U> <B>spectrum->CIEXYZ</B> <I>spectrum x1 x2</I> +<DD><CODE>spectrum->CIEXYZ</CODE> computes the CIEXYZ(1931) values for the +spectrum, scaled so their sum is 1. +</P> +</DL> +<P> + +<A NAME="IDX782"></A> +</P> +<DL> +<DT><U>Function:</U> <B>spectrum->chromaticity</B> <I>proc</I> +<DD><A NAME="IDX783"></A> +<DT><U>Function:</U> <B>spectrum->chromaticity</B> <I>spectrum x1 x2</I> +<DD>Computes the chromaticity for the given spectrum. +</DL> +<P> + +<A NAME="IDX784"></A> +</P> +<DL> +<DT><U>Function:</U> <B>wavelength->XYZ</B> <I>w</I> +<DD><A NAME="IDX785"></A> +<DT><U>Function:</U> <B>wavelength->chromaticity</B> <I>w</I> +<DD><A NAME="IDX786"></A> +<DT><U>Function:</U> <B>wavelength->CIEXYZ</B> <I>w</I> +<DD><VAR>w</VAR> must be a number between 380e-9 to 780e-9. +<CODE>wavelength->XYZ</CODE> returns (unnormalized) XYZ values for a +monochromatic light source with wavelength <VAR>w</VAR>. +<CODE>wavelength->chromaticity</CODE> returns the chromaticity for a +monochromatic light source with wavelength <VAR>w</VAR>. +<CODE>wavelength->CIEXYZ</CODE> returns XYZ values for the saturated color +having chromaticity of a monochromatic light source with wavelength +<VAR>w</VAR>. +</DL> +<P> + +<A NAME="IDX787"></A> +</P> +<DL> +<DT><U>Function:</U> <B>blackbody-spectrum</B> <I>temp</I> +<DD><A NAME="IDX788"></A> +<DT><U>Function:</U> <B>blackbody-spectrum</B> <I>temp span</I> +<DD>Returns a procedure of one argument (wavelength in meters), which +returns the radiance of a black body at <VAR>temp</VAR>. +<P> + +The optional argument <VAR>span</VAR> is the wavelength analog of bandwidth. +With the default <VAR>span</VAR> of 1.nm (1e-9.m), the values returned by the +procedure correspond to the power of the photons with wavelengths +<VAR>w</VAR> to <VAR>w</VAR>+1e-9. +</P> +</DL> +<P> + +<A NAME="IDX789"></A> +</P> +<DL> +<DT><U>Function:</U> <B>temperature->XYZ</B> <I>x</I> +<DD>The positive number <VAR>x</VAR> is a temperature in degrees kelvin. +<CODE>temperature->XYZ</CODE> computes the CIEXYZ(1931) values for the +spectrum of a black body at temperature <VAR>x</VAR>. +<P> + +Compute the chromaticities of 6500.K and 5000.K blackbody radiation: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'color-space) +(XYZ->chromaticity (temperature->XYZ 6500)) + => (0.3135191660557008 0.3236456786200268) + +(XYZ->chromaticity (temperature->XYZ 5000)) + => (0.34508082841161052 0.3516084965163377) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX790"></A> +</P> +<DL> +<DT><U>Function:</U> <B>temperature->CIEXYZ</B> <I>x</I> +<DD>The positive number <VAR>x</VAR> is a temperature in degrees kelvin. +<CODE>temperature->CIEXYZ</CODE> computes the CIEXYZ(1931) values for the +spectrum of a black body at temperature <VAR>x</VAR>, scaled to be just +inside the RGB709 gamut. +</DL> +<P> + +<A NAME="IDX791"></A> +</P> +<DL> +<DT><U>Function:</U> <B>temperature->chromaticity</B> <I>x</I> +<DD></DL> +<P> + +<A NAME="IDX792"></A> +</P> +<DL> +<DT><U>Function:</U> <B>XYZ:normalize</B> <I>xyz</I> +<DD><VAR>xyz</VAR> is a list of three non-negative real numbers. +<CODE>XYZ:normalize</CODE> returns a list of numbers proportional to +<VAR>xyz</VAR>; scaled so their sum is 1. +</DL> +<P> + +<A NAME="IDX793"></A> +</P> +<DL> +<DT><U>Function:</U> <B>XYZ:normalize-colors</B> <I>colors <small>...</small></I> +<DD><VAR>colors</VAR> is a list of XYZ triples. <CODE>XYZ:normalize-colors</CODE> +scales all the triples by a common factor such that the maximum sum of +numbers in a scaled triple is 1. +</DL> +<P> + +<A NAME="IDX794"></A> +</P> +<DL> +<DT><U>Function:</U> <B>XYZ->chromaticity</B> <I>xyz</I> +<DD>Returns a two element list: the x and y components of <VAR>xyz</VAR> +normalized to 1 (= <VAR>x</VAR> + <VAR>y</VAR> + <VAR>z</VAR>). +</DL> +<P> + +<A NAME="IDX795"></A> +</P> +<DL> +<DT><U>Function:</U> <B>chromaticity->CIEXYZ</B> <I>x y</I> +<DD>Returns the list of <VAR>x</VAR>, and <VAR>y</VAR>, 1 - <VAR>y</VAR> - <VAR>x</VAR>. +</DL> +<P> + +<A NAME="IDX796"></A> +</P> +<DL> +<DT><U>Function:</U> <B>chromaticity->whitepoint</B> <I>x y</I> +<DD>Returns the CIEXYZ(1931) values having luminosity 1 and chromaticity +<VAR>x</VAR> and <VAR>y</VAR>. +</DL> +<P> + +<A NAME="IDX797"></A> +Many color datasets are expressed in <EM>xyY</EM> format; chromaticity with +CIE luminance (Y). But xyY is not a CIE standard like CIEXYZ, CIELAB, +and CIELUV. Although chrominance is well defined, the luminance +component is sometimes scaled to 1, sometimes to 100, but usually has no +obvious range. With no given whitepoint, the only reasonable course is +to ascertain the luminance range of a dataset and normalize the values +to lie from 0 to 1. +</P> +<P> + +<A NAME="IDX798"></A> +</P> +<DL> +<DT><U>Function:</U> <B>XYZ->xyY</B> <I>xyz</I> +<DD>Returns a three element list: the <VAR>x</VAR> and <VAR>y</VAR> components of +<VAR>XYZ</VAR> normalized to 1, and CIE luminance <VAR>Y</VAR>. +</DL> +<P> + +<A NAME="IDX799"></A> +</P> +<DL> +<DT><U>Function:</U> <B>xyY->XYZ</B> <I>xyY</I> +<DD></DL> +<P> + +<A NAME="IDX800"></A> +</P> +<DL> +<DT><U>Function:</U> <B>xyY:normalize-colors</B> <I>colors</I> +<DD><VAR>colors</VAR> is a list of xyY triples. <CODE>xyY:normalize-colors</CODE> +scales each chromaticity so it sums to 1 or less; and divides the +<VAR>Y</VAR> values by the maximum <VAR>Y</VAR> in the dataset, so all lie between +0 and 1. +<P> + +<A NAME="IDX801"></A> +<DT><U>Function:</U> <B>xyY:normalize-colors</B> <I>colors n</I> +<DD>If <VAR>n</VAR> is positive real, then <CODE>xyY:normalize-colors</CODE> divides +the <VAR>Y</VAR> values by <VAR>n</VAR> times the maximum <VAR>Y</VAR> in the dataset. +</P> +<P> + +If <VAR>n</VAR> is an exact non-positive integer, then +<CODE>xyY:normalize-colors</CODE> divides the <VAR>Y</VAR> values by the maximum of +the <VAR>Y</VAR>s in the dataset excepting the -<VAR>n</VAR> largest <VAR>Y</VAR> +values. +</P> +<P> + +In all cases, returned <VAR>Y</VAR> values are limited to lie from 0 to 1. +</P> +</DL> +<P> + +Why would one want to normalize to other than 1? If the sun or its +reflection is the brightest object in a scene, then normalizing to its +luminance will tend to make the rest of the scene very dark. As with +photographs, limiting the specular highlights looks better than +darkening everything else. +</P> +<P> + +The results of measurements being what they are, +<CODE>xyY:normalize-colors</CODE> is extremely tolerant. Negative numbers are +replaced with zero, and chromaticities with sums greater than one are +scaled to sum to one. +</P> +<P> + +<A NAME="Color Difference Metrics"></A> +<HR SIZE="6"> +<A NAME="SEC128"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC127"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC129"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.9.4 Color Difference Metrics </H3> +<!--docid::SEC128::--> +<P> + +<A NAME="Color_Difference_Metrics"></A> +</P> +<P> + +<CODE>(require 'color-space)</CODE> +</P> +<P> + +The low-level metric functions operate on lists of 3 numbers, lab1, +lab2, lch1, or lch2. +</P> +<P> + +<CODE>(require 'color)</CODE> +</P> +<P> + +The wrapped functions operate on objects of type color, color1 and +color2 in the function entries. +</P> +<P> + +<A NAME="IDX802"></A> +</P> +<DL> +<DT><U>Function:</U> <B>L*a*b*:DE*</B> <I>lab1 lab2</I> +<DD>Returns the Euclidean distance between <VAR>lab1</VAR> and <VAR>lab2</VAR>. +<P> + +<A NAME="IDX803"></A> +<DT><U>Function:</U> <B>CIE:DE*</B> <I>color1 color2 white-point</I> +<DD><A NAME="IDX804"></A> +<DT><U>Function:</U> <B>CIE:DE*</B> <I>color1 color2</I> +<DD>Returns the Euclidean distance in L*a*b* space between <VAR>color1</VAR> and +<VAR>color2</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX805"></A> +</P> +<DL> +<DT><U>Function:</U> <B>L*C*h:DE*94</B> <I>lch1 lch2 parametric-factors</I> +<DD><A NAME="IDX806"></A> +<DT><U>Function:</U> <B>L*C*h:DE*94</B> <I>lch1 lch2</I> +<DD><P> + +<A NAME="IDX807"></A> +<DT><U>Function:</U> <B>CIE:DE*94</B> <I>color1 color2 parametric-factors</I> +<DD><A NAME="IDX808"></A> +<DT><U>Function:</U> <B>CIE:DE*94</B> <I>color1 color2</I> +<DD></P> +<P> + +Measures distance in the L*C*h cylindrical color-space. +The three axes are individually scaled (depending on C*) in their +contributions to the total distance. +</P> +<P> + +The CIE has defined reference conditions under which the metric with +default parameters can be expected to perform well. These are: +</P> +<P> + +<UL> +<LI> +The specimens are homogeneous in colour. +<LI> +The colour difference (CIELAB) is <= 5 units. +<LI> +They are placed in direct edge contact. +<LI> +Each specimen subtends an angle of >4 degrees to the assessor, whose +colour vision is normal. +<LI> +They are illuminated at 1000 lux, and viewed against a background of +uniform grey, with L* of 50, under illumination simulating D65. +</UL> +<P> + +The <VAR>parametric-factors</VAR> argument is a list of 3 quantities kL, kC +and kH. <VAR>parametric-factors</VAR> independently adjust each +colour-difference term to account for any deviations from the reference +viewing conditions. Under the reference conditions explained above, the +default is kL = kC = kH = 1. +</P> +</DL> +<P> + +The Color Measurement Committee of The Society of Dyers and Colorists in +Great Britain created a more sophisticated color-distance function for +use in judging the consistency of dye lots. With CMC:DE* it is possible +to use a single value pass/fail tolerance for all shades. +</P> +<P> + +<A NAME="IDX809"></A> +</P> +<DL> +<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2 parametric-factors</I> +<DD><A NAME="IDX810"></A> +<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2 l c</I> +<DD><A NAME="IDX811"></A> +<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2 l</I> +<DD><A NAME="IDX812"></A> +<DT><U>Function:</U> <B>CMC-DE</B> <I>lch1 lch2</I> +<DD><P> + +<A NAME="IDX813"></A> +<DT><U>Function:</U> <B>CMC:DE*</B> <I>color1 color2 l c</I> +<DD><A NAME="IDX814"></A> +<DT><U>Function:</U> <B>CMC:DE*</B> <I>color1 color2</I> +<DD></P> +<P> + +<CODE>CMC:DE</CODE> is a L*C*h metric. The <VAR>parametric-factors</VAR> +argument is a list of 2 numbers <VAR>l</VAR> and <VAR>c</VAR>. <VAR>l</VAR> and +<VAR>c</VAR> parameterize this metric. 1 and 1 are recommended for +perceptibility; the default, 2 and 1, for acceptability. +</P> +</DL> +<P> + +<A NAME="Color Conversions"></A> +<HR SIZE="6"> +<A NAME="SEC129"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC128"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC130"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.9.5 Color Conversions </H3> +<!--docid::SEC129::--> +<P> + +<A NAME="Color_Conversions"></A> +</P> +<P> + +This package contains the low-level color conversion and color metric +routines operating on lists of 3 numbers. There is no type or range +checking. +</P> +<P> + +<CODE>(require 'color-space)</CODE> +</P> +<P> + +<A NAME="IDX815"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>CIEXYZ:D65</B> +<DD>Is the color of 6500.K (blackbody) illumination. D65 is close to the +average color of daylight. +</DL> +<P> + +<A NAME="IDX816"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>CIEXYZ:D50</B> +<DD>Is the color of 5000.K (blackbody) illumination. D50 is the color of +indoor lighting by incandescent bulbs. +</DL> +<P> + +<A NAME="IDX817"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>CIEXYZ:A</B> +<DD><A NAME="IDX818"></A> +<DT><U>Constant:</U> <B>CIEXYZ:B</B> +<DD><A NAME="IDX819"></A> +<DT><U>Constant:</U> <B>CIEXYZ:C</B> +<DD><A NAME="IDX820"></A> +<DT><U>Constant:</U> <B>CIEXYZ:E</B> +<DD>CIE 1931 illuminants normalized to 1 = y. +</DL> +<P> + +<A NAME="IDX821"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color:linear-transform</B> <I>matrix row</I> +<DD></DL> +<P> + +<A NAME="IDX822"></A> +</P> +<DL> +<DT><U>Function:</U> <B>CIEXYZ->RGB709</B> <I>xyz</I> +<DD><A NAME="IDX823"></A> +<DT><U>Function:</U> <B>RGB709->CIEXYZ</B> <I>srgb</I> +<DD></DL> +<P> + +<A NAME="IDX824"></A> +</P> +<DL> +<DT><U>Function:</U> <B>CIEXYZ->L*u*v*</B> <I>xyz white-point</I> +<DD><A NAME="IDX825"></A> +<DT><U>Function:</U> <B>CIEXYZ->L*u*v*</B> <I>xyz</I> +<DD><A NAME="IDX826"></A> +<DT><U>Function:</U> <B>L*u*v*->CIEXYZ</B> <I>L*u*v* white-point</I> +<DD><A NAME="IDX827"></A> +<DT><U>Function:</U> <B>L*u*v*->CIEXYZ</B> <I>L*u*v*</I> +<DD>The <VAR>white-point</VAR> defaults to CIEXYZ:D65. +</DL> +<P> + +<A NAME="IDX828"></A> +</P> +<DL> +<DT><U>Function:</U> <B>CIEXYZ->L*a*b*</B> <I>xyz white-point</I> +<DD><A NAME="IDX829"></A> +<DT><U>Function:</U> <B>CIEXYZ->L*a*b*</B> <I>xyz</I> +<DD><A NAME="IDX830"></A> +<DT><U>Function:</U> <B>L*a*b*->CIEXYZ</B> <I>L*a*b* white-point</I> +<DD><A NAME="IDX831"></A> +<DT><U>Function:</U> <B>L*a*b*->CIEXYZ</B> <I>L*a*b*</I> +<DD>The XYZ <VAR>white-point</VAR> defaults to CIEXYZ:D65. +</DL> +<P> + +<A NAME="IDX832"></A> +</P> +<DL> +<DT><U>Function:</U> <B>L*a*b*->L*C*h</B> <I>L*a*b*</I> +<DD><A NAME="IDX833"></A> +<DT><U>Function:</U> <B>L*C*h->L*a*b*</B> <I>L*C*h</I> +<DD></DL> +<P> + +<A NAME="IDX834"></A> +</P> +<DL> +<DT><U>Function:</U> <B>CIEXYZ->sRGB</B> <I>xyz</I> +<DD><A NAME="IDX835"></A> +<DT><U>Function:</U> <B>sRGB->CIEXYZ</B> <I>srgb</I> +<DD></DL> +<P> + +<A NAME="IDX836"></A> +</P> +<DL> +<DT><U>Function:</U> <B>CIEXYZ->xRGB</B> <I>xyz</I> +<DD><A NAME="IDX837"></A> +<DT><U>Function:</U> <B>xRGB->CIEXYZ</B> <I>srgb</I> +<DD></DL> +<P> + +<A NAME="IDX838"></A> +</P> +<DL> +<DT><U>Function:</U> <B>sRGB->xRGB</B> <I>xyz</I> +<DD><A NAME="IDX839"></A> +<DT><U>Function:</U> <B>xRGB->sRGB</B> <I>srgb</I> +<DD></DL> +<P> + +<A NAME="IDX840"></A> +</P> +<DL> +<DT><U>Function:</U> <B>CIEXYZ->e-sRGB</B> <I>n xyz</I> +<DD><A NAME="IDX841"></A> +<DT><U>Function:</U> <B>e-sRGB->CIEXYZ</B> <I>n srgb</I> +<DD></DL> +<P> + +<A NAME="IDX842"></A> +</P> +<DL> +<DT><U>Function:</U> <B>sRGB->e-sRGB</B> <I>n srgb</I> +<DD><A NAME="IDX843"></A> +<DT><U>Function:</U> <B>e-sRGB->sRGB</B> <I>n srgb</I> +<DD>The integer <VAR>n</VAR> must be 10, 12, or 16. Because sRGB and e-sRGB use +the same RGB709 chromaticities, conversion between them is simpler than +conversion through CIEXYZ. +</DL> +<P> + +Do not convert e-sRGB precision through <CODE>e-sRGB->sRGB</CODE> then +<CODE>sRGB->e-sRGB</CODE> -- values would be truncated to 8-bits! +</P> +<P> + +<A NAME="IDX844"></A> +</P> +<DL> +<DT><U>Function:</U> <B>e-sRGB->e-sRGB</B> <I>n1 srgb n2</I> +<DD>The integers <VAR>n1</VAR> and <VAR>n2</VAR> must be 10, 12, or 16. +<CODE>e-sRGB->e-sRGB</CODE> converts <VAR>srgb</VAR> to e-sRGB of precision +<VAR>n2</VAR>. +</DL> +<P> + +<A NAME="Color Names"></A> +<HR SIZE="6"> +<A NAME="SEC130"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC129"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC133"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.9.6 Color Names </H3> +<!--docid::SEC130::--> +<P> + +<A NAME="Color_Names"></A> +<CODE>(require 'color-names)</CODE> +<A NAME="IDX845"></A> +</P> +<P> + +Rather than ballast the color dictionaries with numbered grays, +<CODE>file->color-dictionary</CODE> discards them. They are provided +through the <CODE>grey</CODE> procedure: +</P> +<P> + +<A NAME="IDX846"></A> +</P> +<DL> +<DT><U>Function:</U> <B>grey</B> <I>k</I> +<DD><P> + +Returns <CODE>(inexact->exact (round (* k 2.55)))</CODE>, the X11 color +grey<I><k></I>. +</P> +</DL> +A color dictionary is a database table relating <EM>canonical</EM> +<A NAME="IDX847"></A> +color-names to color-strings +(see section <A HREF="slib_5.html#SEC119">External Representation</A>). +<P> + +The column names in a color dictionary are unimportant; the first +field is the key, and the second is the color-string. +</P> +<P> + +<A NAME="IDX848"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color-name:canonicalize</B> <I>name</I> +<DD>Returns a downcased copy of the string or symbol <VAR>name</VAR> with +`<SAMP>_</SAMP>', `<SAMP>-</SAMP>', and whitespace removed. +</DL> +<P> + +<A NAME="IDX849"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color-name->color</B> <I>name table1 table2 <small>...</small></I> +<DD><P> + +<VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small> must be color-dictionary tables. <CODE>color-name->color</CODE> searches for the +canonical form of <VAR>name</VAR> in <VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small> in order; returning the +color-string of the first matching record; #f otherwise. +</P> +</DL> +<P> + +<A NAME="IDX850"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color-dictionaries->lookup</B> <I>table1 table2 <small>...</small></I> +<DD><P> + +<VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small> must be color-dictionary tables. <CODE>color-dictionaries->lookup</CODE> returns a +procedure which searches for the canonical form of its string argument +in <VAR>table1</VAR>, <VAR>table2</VAR>, <small>...</small>; returning the color-string of the first matching +record; and #f otherwise. +</P> +</DL> +<P> + +<A NAME="IDX851"></A> +</P> +<DL> +<DT><U>Function:</U> <B>color-dictionary</B> <I>name rdb base-table-type</I> +<DD><P> + +<VAR>rdb</VAR> must be a string naming a relational database file; and the symbol +<VAR>name</VAR> a table therein. The database will be opened as +<VAR>base-table-type</VAR>. <CODE>color-dictionary</CODE> returns the read-only table <VAR>name</VAR> in database +<VAR>name</VAR> if it exists; #f otherwise. +</P> +<P> + +<A NAME="IDX852"></A> +<DT><U>Function:</U> <B>color-dictionary</B> <I>name rdb</I> +<DD></P> +<P> + +<VAR>rdb</VAR> must be an open relational database or a string naming a relational +database file; and the symbol <VAR>name</VAR> a table therein. <CODE>color-dictionary</CODE> returns the +read-only table <VAR>name</VAR> in database <VAR>name</VAR> if it exists; #f otherwise. +</P> +</DL> +<P> + +<A NAME="IDX853"></A> +</P> +<DL> +<DT><U>Function:</U> <B>load-color-dictionary</B> <I>name rdb base-table-type</I> +<DD><P> + +<A NAME="IDX854"></A> +<DT><U>Function:</U> <B>load-color-dictionary</B> <I>name rdb</I> +<DD></P> +<P> + +<VAR>rdb</VAR> must be a string naming a relational database file; and the symbol +<VAR>name</VAR> a table therein. If the symbol <VAR>base-table-type</VAR> is provided, the database will +be opened as <VAR>base-table-type</VAR>. <CODE>load-color-dictionary</CODE> creates a top-level definition of the symbol <VAR>name</VAR> +to a lookup procedure for the color dictionary <VAR>name</VAR> in <VAR>rdb</VAR>. +</P> +<P> + +The value returned by <CODE>load-color-dictionary</CODE> is unspecified. +</P> +</DL> +<P> + +<A NAME="SEC131"></A> +<H4> Dictionary Creation </H4> +<!--docid::SEC131::--> +<P> + +<CODE>(require 'color-database)</CODE> +<A NAME="IDX855"></A> +</P> +<P> + +<A NAME="IDX856"></A> +</P> +<DL> +<DT><U>Function:</U> <B>file->color-dictionary</B> <I>file table-name rdb base-table-type</I> +<DD><P> + +<A NAME="IDX857"></A> +<DT><U>Function:</U> <B>file->color-dictionary</B> <I>file table-name rdb</I> +<DD></P> +<P> + +<VAR>rdb</VAR> must be an open relational database or a string naming a relational +database file, <VAR>table-name</VAR> a symbol, and the string <VAR>file</VAR> must name an existing +file with colornames and their corresponding xRGB (6-digit hex) +values. <CODE>file->color-dictionary</CODE> creates a table <VAR>table-name</VAR> in <VAR>rdb</VAR> and enters the associations found +in <VAR>file</VAR> into it. +</P> +</DL> +<P> + +<A NAME="IDX858"></A> +</P> +<DL> +<DT><U>Function:</U> <B>url->color-dictionary</B> <I>url table-name rdb base-table-type</I> +<DD><P> + +<A NAME="IDX859"></A> +<DT><U>Function:</U> <B>url->color-dictionary</B> <I>url table-name rdb</I> +<DD></P> +<P> + +<VAR>rdb</VAR> must be an open relational database or a string naming a relational +database file and <VAR>table-name</VAR> a symbol. <CODE>url->color-dictionary</CODE> retrieves the resource named by the +string <VAR>url</VAR> using the <EM>wget</EM> program; then calls +<A NAME="IDX860"></A> +<CODE>file->color-dictionary</CODE> to enter its associations in <VAR>table-name</VAR> in <VAR>url</VAR>. +</P> +</DL> +This section has detailed the procedures for creating and loading +color dictionaries. So where are the dictionaries to load? +<P> + +<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color/Dictionaries.html">http://swissnet.ai.mit.edu/~jaffer/Color/Dictionaries.html</A> +</P> +<P> + +Describes and evaluates several color-name dictionaries on the web. +The following procedure creates a database containing two of these +dictionaries. +</P> +<P> + +<A NAME="IDX861"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-slib-color-name-db</B> +<DD><P> + +Creates an alist-table relational database in library-vicinity +containing the <EM>Resene</EM> and <EM>saturate</EM> color-name +<A NAME="IDX862"></A> +<A NAME="IDX863"></A> +dictionaries. +</P> +<P> + +If the files `<TT>resenecolours.txt</TT>' and `<TT>saturate.txt</TT>' exist in +the library-vicinity, then they used as the source of color-name +data. Otherwise, <CODE>make-slib-color-name-db</CODE> calls url->color-dictionary with the URLs of +appropriate source files. +</P> +</DL> +<P> + +<A NAME="SEC132"></A> +<H4> The Short List </H4> +<!--docid::SEC132::--> +<P> + +<CODE>(require 'saturate)</CODE> +<A NAME="IDX864"></A> +</P> +<P> + +<A NAME="IDX865"></A> +</P> +<DL> +<DT><U>Function:</U> <B>saturate</B> <I>name</I> +<DD>Looks for <VAR>name</VAR> among the 19 saturated colors from +<CITE>Approximate Colors on CIE Chromaticity Diagram</CITE>: +<P> + +</P> +<TABLE> +<TR><TD>reddish orange </TD><TD> orange </TD><TD> yellowish orange </TD><TD> yellow</TD> +</TR> +<TR><TD>greenish yellow </TD><TD> yellow green </TD><TD> yellowish green </TD><TD> green</TD> +</TR> +<TR><TD>bluish green </TD><TD> blue green </TD><TD> greenish blue </TD><TD> blue</TD> +</TR> +<TR><TD>purplish blue </TD><TD> bluish purple </TD><TD> purple </TD><TD> reddish purple</TD> +</TR> +<TR><TD>red purple </TD><TD> purplish red </TD><TD> red</TD> +</TR></TABLE> +<P> + +(<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color/saturate.pdf">http://swissnet.ai.mit.edu/~jaffer/Color/saturate.pdf</A>). If +<VAR>name</VAR> is found, the corresponding color is returned. Otherwise #f +is returned. Use saturate only for light source colors. +</P> +</DL> +<P> + +Resene Paints Limited, New Zealand's largest privately-owned and +operated paint manufacturing company, has generously made their +<CITE>Resene RGB Values List</CITE> available. +</P> +<P> + +<CODE>(require 'resene)</CODE> +<A NAME="IDX866"></A> +</P> +<P> + +<A NAME="IDX867"></A> +</P> +<DL> +<DT><U>Function:</U> <B>resene</B> <I>name</I> +<DD>Looks for <VAR>name</VAR> among the 1300 entries in the Resene color-name +dictionary (<A HREF="http://swissnet.ai.mit.edu/~jaffer/Color/resene.pdf">http://swissnet.ai.mit.edu/~jaffer/Color/resene.pdf</A>). +If <VAR>name</VAR> is found, the corresponding color is returned. Otherwise +#f is returned. The <CITE>Resene RGB Values List</CITE> is an excellent +source for surface colors. +</DL> +<P> + +If you include the <EM>Resene RGB Values List</EM> in binary form in a +program, then you must include its license with your program: +</P> +<P> + +<BLOCKQUOTE> +Resene RGB Values List<BR> +For further information refer to http://www.resene.co.nz<BR> +Copyright Resene Paints Ltd 2001 +<P> + +Permission to copy this dictionary, to modify it, to redistribute it, +to distribute modified versions, and to use it for any purpose is +granted, subject to the following restrictions and understandings. +</P> +<P> + +<OL> +<LI> +Any text copy made of this dictionary must include this copyright +notice in full. +<P> + +</P> +<LI> +Any redistribution in binary form must reproduce this copyright +notice in the documentation or other materials provided with the +distribution. +<P> + +</P> +<LI> +Resene Paints Ltd makes no warranty or representation that this +dictionary is error-free, and is under no obligation to provide any +services, by way of maintenance, update, or otherwise. +<P> + +</P> +<LI> +There shall be no use of the name of Resene or Resene Paints Ltd +in any advertising, promotional, or sales literature without prior +written consent in each case. +<P> + +</P> +<LI> +These RGB colour formulations may not be used to the detriment of +Resene Paints Ltd. +</OL> +</BLOCKQUOTE> +<P> + +<A NAME="Daylight"></A> +<HR SIZE="6"> +<A NAME="SEC133"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC130"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC134"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC118"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 5.9.7 Daylight </H3> +<!--docid::SEC133::--> +<P> + +<A NAME="Daylight"></A> +<CODE>(require 'daylight)</CODE> +<A NAME="IDX868"></A> +<A NAME="IDX869"></A> +<A NAME="IDX870"></A> +<A NAME="IDX871"></A> +</P> +<P> + +This package calculates the colors of sky as detailed in:<BR> +<A HREF="http://www.cs.utah.edu/vissim/papers/sunsky/sunsky.pdf">http://www.cs.utah.edu/vissim/papers/sunsky/sunsky.pdf</A><BR> +<CITE>A Practical Analytic Model for Daylight</CITE><BR> +A. J. Preetham, Peter Shirley, Brian Smits +</P> +<P> + +<A NAME="IDX872"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solar-hour</B> <I>julian-day hour</I> +<DD><P> + +Returns the solar-time in hours given the integer <VAR>julian-day</VAR> in the range 1 to +366, and the local time in hours. +</P> +<P> + +To be meticulous, subtract 4 minutes for each degree of longitude west +of the standard meridian of your time zone. +</P> +</DL> +<P> + +<A NAME="IDX873"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solar-declination</B> <I>julian-day</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX874"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solar-polar</B> <I>declination latitude solar-hour</I> +<DD>Returns a list of <VAR>theta_s</VAR>, the solar angle from the +zenith, and <VAR>phi_s</VAR>, the solar azimuth. 0 <= <VAR>theta_s</VAR> +measured in degrees. <VAR>phi_s</VAR> is measured in degrees from due +south; west of south being positive. +</DL> +In the following procedures, the number 0 <= <VAR>theta_s</VAR> <= 90 is +the solar angle from the zenith in degrees. +<P> + +<A NAME="IDX875"></A> +Turbidity is a measure of the fraction of scattering due to haze as +opposed to molecules. This is a convenient quantity because it can be +estimated based on visibility of distant objects. This model fails +for turbidity values less than 1.3. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre> _______________________________________________________________ +512|-: | + | * pure-air | +256|-:** | + | : ** exceptionally-clear | +128|-: * | + | : ** | + 64|-: * | + | : ** very-clear | + 32|-: ** | + | : ** | + 16|-: *** clear | + | : **** | + 8|-: **** | + | : **** light-haze | + 4|-: **** | + | : ****** | + 2|-: ******** haze thin-| + | : *********** fog | + 1|-:----------------------------------------------------*******--| + |_:____.____:____.____:____.____:____.____:____.____:____.____:_| + 1 2 4 8 16 32 64 + Meterorological range (km) versus Turbidity +</pre></td></tr></table><P> + +<A NAME="IDX876"></A> +</P> +<DL> +<DT><U>Function:</U> <B>sunlight-spectrum</B> <I>turbidity theta_s</I> +<DD>Returns a vector of 41 values, the spectrum of sunlight from +380.nm to 790.nm for a given <VAR>turbidity</VAR> and <VAR>theta_s</VAR>. +</DL> +<P> + +<A NAME="IDX877"></A> +</P> +<DL> +<DT><U>Function:</U> <B>sunlight-xyz</B> <I>turbidity theta_s</I> +<DD>Returns (unnormalized) XYZ values for color of sunlight for a +given <VAR>turbidity</VAR> and <VAR>theta_s</VAR>. +</DL> +<P> + +<A NAME="IDX878"></A> +</P> +<DL> +<DT><U>Function:</U> <B>sunlight-ciexyz</B> <I>turbidity theta_s</I> +<DD>Given <VAR>turbidity</VAR> and <VAR>theta_s</VAR>, <CODE>sunlight-ciexyz</CODE> returns the CIEXYZ triple for color of +sunlight scaled to be just inside the RGB709 gamut. +</DL> +<P> + +<A NAME="IDX879"></A> +</P> +<DL> +<DT><U>Function:</U> <B>zenith-xyy</B> <I>turbidity theta_s</I> +<DD>Returns the xyY (chromaticity and luminance) at the zenith. The +Luminance has units kcd/m^2. +</DL> +<P> + +<A NAME="IDX880"></A> +</P> +<DL> +<DT><U>Function:</U> <B>overcast-sky-color-xyy</B> <I>turbidity theta_s</I> +<DD><VAR>turbidity</VAR> is a positive real number expressing the amount of light +scattering. The real number <VAR>theta_s</VAR> is the solar angle from the zenith in +degrees. +<P> + +<CODE>overcast-sky-color-xyy</CODE> returns a function of one angle <VAR>theta</VAR>, the angle from the +zenith of the viewing direction (in degrees); and returning the xyY +value for light coming from that elevation of the sky. +</P> +</DL> +<P> + +<A NAME="IDX881"></A> +</P> +<DL> +<DT><U>Function:</U> <B>clear-sky-color-xyy</B> <I>turbidity theta_s phi_s</I> +<DD><A NAME="IDX882"></A> +<DT><U>Function:</U> <B>sky-color-xyy</B> <I>turbidity theta_s phi_s</I> +<DD><VAR>turbidity</VAR> is a positive real number expressing the amount of light +scattering. The real number <VAR>theta_s</VAR> is the solar angle from the zenith in +degrees. The real number <VAR>phi_s</VAR> is the solar angle from south. +<P> + +<CODE>clear-sky-color-xyy</CODE> returns a function of two angles, <VAR>theta</VAR> and <VAR>phi</VAR> which +specify the angles from the zenith and south meridian of the viewing +direction (in degrees); returning the xyY value for light coming from +that direction of the sky. +</P> +<P> + +<CODE>sky-color-xyY</CODE> calls <CODE>overcast-sky-color-xyY</CODE> for +<VAR>turbidity</VAR> <= 20; otherwise the <CODE>clear-sky-color-xyy</CODE> function. +</P> +</DL> +<P> + +<A NAME="Root Finding"></A> +<HR SIZE="6"> +<A NAME="SEC134"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC133"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC135"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.10 Root Finding </H2> +<!--docid::SEC134::--> +<P> + +<CODE>(require 'root)</CODE> +<A NAME="IDX883"></A> +</P> +<P> + +<A NAME="IDX884"></A> +</P> +<DL> +<DT><U>Function:</U> <B>newton:find-integer-root</B> <I>f df/dx x0</I> +<DD>Given integer valued procedure <VAR>f</VAR>, its derivative (with respect to +its argument) <VAR>df/dx</VAR>, and initial integer value <VAR>x0</VAR> for which +<VAR>df/dx</VAR>(<VAR>x0</VAR>) is non-zero, returns an integer <VAR>x</VAR> for which +<VAR>f</VAR>(<VAR>x</VAR>) is closer to zero than either of the integers adjacent +to <VAR>x</VAR>; or returns <CODE>#f</CODE> if such an integer can't be found. +<P> + +To find the closest integer to a given integers square root: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define (integer-sqrt y) + (newton:find-integer-root + (lambda (x) (- (* x x) y)) + (lambda (x) (* 2 x)) + (ash 1 (quotient (integer-length y) 2)))) + +(integer-sqrt 15) => 4 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX885"></A> +</P> +<DL> +<DT><U>Function:</U> <B>integer-sqrt</B> <I>y</I> +<DD>Given a non-negative integer <VAR>y</VAR>, returns the rounded square-root of +<VAR>y</VAR>. +</DL> +<P> + +<A NAME="IDX886"></A> +</P> +<DL> +<DT><U>Function:</U> <B>newton:find-root</B> <I>f df/dx x0 prec</I> +<DD>Given real valued procedures <VAR>f</VAR>, <VAR>df/dx</VAR> of one (real) +argument, initial real value <VAR>x0</VAR> for which <VAR>df/dx</VAR>(<VAR>x0</VAR>) is +non-zero, and positive real number <VAR>prec</VAR>, returns a real <VAR>x</VAR> +for which <CODE>abs</CODE>(<VAR>f</VAR>(<VAR>x</VAR>)) is less than <VAR>prec</VAR>; or +returns <CODE>#f</CODE> if such a real can't be found. +<P> + +If <VAR>prec</VAR> is instead a negative integer, <CODE>newton:find-root</CODE> +returns the result of -<VAR>prec</VAR> iterations. +</P> +</DL> +<P> + +H. J. Orchard, <CITE>The Laguerre Method for Finding the Zeros of +Polynomials</CITE>, IEEE Transactions on Circuits and Systems, Vol. 36, +No. 11, November 1989, pp 1377-1381. +</P> +<P> + +<BLOCKQUOTE> +There are 2 errors in Orchard's Table II. Line k=2 for starting +value of 1000+j0 should have Z_k of 1.0475 + j4.1036 and line k=2 +for starting value of 0+j1000 should have Z_k of 1.0988 + j4.0833. +</BLOCKQUOTE> +<P> + +<A NAME="IDX887"></A> +</P> +<DL> +<DT><U>Function:</U> <B>laguerre:find-root</B> <I>f df/dz ddf/dz^2 z0 prec</I> +<DD>Given complex valued procedure <VAR>f</VAR> of one (complex) argument, its +derivative (with respect to its argument) <VAR>df/dx</VAR>, its second +derivative <VAR>ddf/dz^2</VAR>, initial complex value <VAR>z0</VAR>, and positive +real number <VAR>prec</VAR>, returns a complex number <VAR>z</VAR> for which +<CODE>magnitude</CODE>(<VAR>f</VAR>(<VAR>z</VAR>)) is less than <VAR>prec</VAR>; or returns +<CODE>#f</CODE> if such a number can't be found. +<P> + +If <VAR>prec</VAR> is instead a negative integer, <CODE>laguerre:find-root</CODE> +returns the result of -<VAR>prec</VAR> iterations. +</P> +</DL> +<P> + +<A NAME="IDX888"></A> +</P> +<DL> +<DT><U>Function:</U> <B>laguerre:find-polynomial-root</B> <I>deg f df/dz ddf/dz^2 z0 prec</I> +<DD>Given polynomial procedure <VAR>f</VAR> of integer degree <VAR>deg</VAR> of one +argument, its derivative (with respect to its argument) <VAR>df/dx</VAR>, its +second derivative <VAR>ddf/dz^2</VAR>, initial complex value <VAR>z0</VAR>, and +positive real number <VAR>prec</VAR>, returns a complex number <VAR>z</VAR> for +which <CODE>magnitude</CODE>(<VAR>f</VAR>(<VAR>z</VAR>)) is less than <VAR>prec</VAR>; or +returns <CODE>#f</CODE> if such a number can't be found. +<P> + +If <VAR>prec</VAR> is instead a negative integer, +<CODE>laguerre:find-polynomial-root</CODE> returns the result of -<VAR>prec</VAR> +iterations. +</P> +</DL> +<P> + +<A NAME="IDX889"></A> +</P> +<DL> +<DT><U>Function:</U> <B>secant:find-root</B> <I>f x0 x1 prec</I> +<DD><A NAME="IDX890"></A> +<DT><U>Function:</U> <B>secant:find-bracketed-root</B> <I>f x0 x1 prec</I> +<DD>Given a real valued procedure <VAR>f</VAR> and two real valued starting +points <VAR>x0</VAR> and <VAR>x1</VAR>, returns a real <VAR>x</VAR> for which +<CODE>(abs (f x))</CODE> is less than <VAR>prec</VAR>; or returns +<CODE>#f</CODE> if such a real can't be found. +<P> + +If <VAR>x0</VAR> and <VAR>x1</VAR> are chosen such that they bracket a root, that is +<TABLE><tr><td> </td><td class=example><pre>(or (< (f x0) 0 (f x1)) + (< (f x1) 0 (f x0))) +</pre></td></tr></table>then the root returned will be between <VAR>x0</VAR> and <VAR>x1</VAR>, and +<VAR>f</VAR> will not be passed an argument outside of that interval. +<P> + +<CODE>secant:find-bracketed-root</CODE> will return <CODE>#f</CODE> unless <VAR>x0</VAR> +and <VAR>x1</VAR> bracket a root. +</P> +<P> + +The secant method is used until a bracketing interval is found, at which point +a modified <I>regula falsi</I> method is used. +</P> +<P> + +If <VAR>prec</VAR> is instead a negative integer, <CODE>secant:find-root</CODE> +returns the result of -<VAR>prec</VAR> iterations. +</P> +<P> + +If <VAR>prec</VAR> is a procedure it should accept 5 arguments: <VAR>x0</VAR> +<VAR>f0</VAR> <VAR>x1</VAR> <VAR>f1</VAR> and <VAR>count</VAR>, where <VAR>f0</VAR> will be +<CODE>(f x0)</CODE>, <VAR>f1</VAR> <CODE>(f x1)</CODE>, and <VAR>count</VAR> the number of +iterations performed so far. <VAR>prec</VAR> should return non-false +if the iteration should be stopped. +</P> +</DL> +<P> + +<A NAME="Minimizing"></A> +<HR SIZE="6"> +<A NAME="SEC135"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC134"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC136"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.11 Minimizing </H2> +<!--docid::SEC135::--> +<P> + +<CODE>(require 'minimize)</CODE> +<A NAME="IDX891"></A> +<A NAME="IDX892"></A> +</P> +<P> + +</P> +<P> + +The Golden Section Search +<A NAME="DOCF6" HREF="slib_fot.html#FOOT6">(6)</A> +algorithm finds minima of functions which +are expensive to compute or for which derivatives are not available. +Although optimum for the general case, convergence is slow, +requiring nearly 100 iterations for the example (x^3-2x-5). +</P> +<P> + +</P> +<P> + +If the derivative is available, Newton-Raphson is probably a better +choice. If the function is inexpensive to compute, consider +approximating the derivative. +</P> +<P> + +<A NAME="IDX893"></A> +</P> +<DL> +<DT><U>Function:</U> <B>golden-section-search</B> <I>f x0 x1 prec</I> +<DD><P> + +<VAR>x_0</VAR> are <VAR>x_1</VAR> real numbers. The (single argument) +procedure <VAR>f</VAR> is unimodal over the open interval (<VAR>x_0</VAR>, +<VAR>x_1</VAR>). That is, there is exactly one point in the interval for +which the derivative of <VAR>f</VAR> is zero. +</P> +<P> + +<CODE>golden-section-search</CODE> returns a pair (<VAR>x</VAR> . <VAR>f</VAR>(<VAR>x</VAR>)) where <VAR>f</VAR>(<VAR>x</VAR>) +is the minimum. The <VAR>prec</VAR> parameter is the stop criterion. If +<VAR>prec</VAR> is a positive number, then the iteration continues until +<VAR>x</VAR> is within <VAR>prec</VAR> from the true value. If <VAR>prec</VAR> is +a negative integer, then the procedure will iterate <VAR>-prec</VAR> +times or until convergence. If <VAR>prec</VAR> is a procedure of seven +arguments, <VAR>x0</VAR>, <VAR>x1</VAR>, <VAR>a</VAR>, <VAR>b</VAR>, <VAR>fa</VAR>, <VAR>fb</VAR>, +and <VAR>count</VAR>, then the iterations will stop when the procedure +returns <CODE>#t</CODE>. +</P> +<P> + +Analytically, the minimum of x^3-2x-5 is 0.816497. +<TABLE><tr><td> </td><td class=example><pre>(define func (lambda (x) (+ (* x (+ (* x x) -2)) -5))) +(golden-section-search func 0 1 (/ 10000)) + ==> (816.4883855245578e-3 . -6.0886621077391165) +(golden-section-search func 0 1 -5) + ==> (819.6601125010515e-3 . -6.088637561916407) +(golden-section-search func 0 1 + (lambda (a b c d e f g ) (= g 500))) + ==> (816.4965933140557e-3 . -6.088662107903635) +</pre></td></tr></table></DL> +<P> + +<A NAME="Commutative Rings"></A> +<HR SIZE="6"> +<A NAME="SEC136"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC135"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC137"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.12 Commutative Rings </H2> +<!--docid::SEC136::--> +<P> + +Scheme provides a consistent and capable set of numeric functions. +Inexacts implement a field; integers a commutative ring (and Euclidean +domain). This package allows one to use basic Scheme numeric functions +with symbols and non-numeric elements of commutative rings. +</P> +<P> + +<CODE>(require 'commutative-ring)</CODE> +<A NAME="IDX894"></A> +<A NAME="IDX895"></A> +</P> +<P> + +The <EM>commutative-ring</EM> package makes the procedures <CODE>+</CODE>, +<CODE>-</CODE>, <CODE>*</CODE>, <CODE>/</CODE>, and <CODE>^</CODE> <EM>careful</EM> in the sense +<A NAME="IDX896"></A> +that any non-numeric arguments they do not reduce appear in the +expression output. In order to see what working with this package is +like, self-set all the single letter identifiers (to their corresponding +symbols). +<A NAME="IDX897"></A> +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define a 'a) +<small>...</small> +(define z 'z) +</pre></td></tr></table><P> + +Or just <CODE>(require 'self-set)</CODE>. Now try some sample expressions: +<A NAME="IDX898"></A> +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(+ (+ a b) (- a b)) => (* a 2) +(* (+ a b) (+ a b)) => (^ (+ a b) 2) +(* (+ a b) (- a b)) => (* (+ a b) (- a b)) +(* (- a b) (- a b)) => (^ (- a b) 2) +(* (- a b) (+ a b)) => (* (+ a b) (- a b)) +(/ (+ a b) (+ c d)) => (/ (+ a b) (+ c d)) +(^ (+ a b) 3) => (^ (+ a b) 3) +(^ (+ a 2) 3) => (^ (+ 2 a) 3) +</pre></td></tr></table><P> + +Associative rules have been applied and repeated addition and +multiplication converted to multiplication and exponentiation. +</P> +<P> + +We can enable distributive rules, thus expanding to sum of products +form: +<TABLE><tr><td> </td><td class=example><pre>(set! *ruleset* (combined-rulesets distribute* distribute/)) + +(* (+ a b) (+ a b)) => (+ (* 2 a b) (^ a 2) (^ b 2)) +(* (+ a b) (- a b)) => (- (^ a 2) (^ b 2)) +(* (- a b) (- a b)) => (- (+ (^ a 2) (^ b 2)) (* 2 a b)) +(* (- a b) (+ a b)) => (- (^ a 2) (^ b 2)) +(/ (+ a b) (+ c d)) => (+ (/ a (+ c d)) (/ b (+ c d))) +(/ (+ a b) (- c d)) => (+ (/ a (- c d)) (/ b (- c d))) +(/ (- a b) (- c d)) => (- (/ a (- c d)) (/ b (- c d))) +(/ (- a b) (+ c d)) => (- (/ a (+ c d)) (/ b (+ c d))) +(^ (+ a b) 3) => (+ (* 3 a (^ b 2)) (* 3 b (^ a 2)) (^ a 3) (^ b 3)) +(^ (+ a 2) 3) => (+ 8 (* a 12) (* (^ a 2) 6) (^ a 3)) +</pre></td></tr></table><P> + +Use of this package is not restricted to simple arithmetic expressions: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'determinant) + +(determinant '((a b c) (d e f) (g h i))) => +(- (+ (* a e i) (* b f g) (* c d h)) (* a f h) (* b d i) (* c e g)) +</pre></td></tr></table><P> + +Currently, only <CODE>+</CODE>, <CODE>-</CODE>, <CODE>*</CODE>, <CODE>/</CODE>, and <CODE>^</CODE> +support non-numeric elements. Expressions with <CODE>-</CODE> are converted +to equivalent expressions without <CODE>-</CODE>, so behavior for <CODE>-</CODE> is +not defined separately. <CODE>/</CODE> expressions are handled similarly. +</P> +<P> + +This list might be extended to include <CODE>quotient</CODE>, <CODE>modulo</CODE>, +<CODE>remainder</CODE>, <CODE>lcm</CODE>, and <CODE>gcd</CODE>; but these work only for +the more restrictive Euclidean (Unique Factorization) Domain. +<A NAME="IDX899"></A> +<A NAME="IDX900"></A> +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC137"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC136"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC138"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.13 Rules and Rulesets </H2> +<!--docid::SEC137::--> +<P> + +The <EM>commutative-ring</EM> package allows control of ring properties +through the use of <EM>rulesets</EM>. +</P> +<P> + +<A NAME="IDX901"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>*ruleset*</B> +<DD>Contains the set of rules currently in effect. Rules defined by +<CODE>cring:define-rule</CODE> are stored within the value of *ruleset* at the +time <CODE>cring:define-rule</CODE> is called. If <VAR>*ruleset*</VAR> is +<CODE>#f</CODE>, then no rules apply. +</DL> +<P> + +<A NAME="IDX902"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-ruleset</B> <I>rule1 <small>...</small></I> +<DD><A NAME="IDX903"></A> +<DT><U>Function:</U> <B>make-ruleset</B> <I>name rule1 <small>...</small></I> +<DD>Returns a new ruleset containing the rules formed by applying +<CODE>cring:define-rule</CODE> to each 4-element list argument <VAR>rule</VAR>. If +the first argument to <CODE>make-ruleset</CODE> is a symbol, then the database +table created for the new ruleset will be named <VAR>name</VAR>. Calling +<CODE>make-ruleset</CODE> with no rule arguments creates an empty ruleset. +</DL> +<P> + +<A NAME="IDX904"></A> +</P> +<DL> +<DT><U>Function:</U> <B>combined-rulesets</B> <I>ruleset1 <small>...</small></I> +<DD><A NAME="IDX905"></A> +<DT><U>Function:</U> <B>combined-rulesets</B> <I>name ruleset1 <small>...</small></I> +<DD>Returns a new ruleset containing the rules contained in each ruleset +argument <VAR>ruleset</VAR>. If the first argument to +<CODE>combined-ruleset</CODE> is a symbol, then the database table created for +the new ruleset will be named <VAR>name</VAR>. Calling +<CODE>combined-ruleset</CODE> with no ruleset arguments creates an empty +ruleset. +</DL> +<P> + +Two rulesets are defined by this package. +</P> +<P> + +<A NAME="IDX906"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>distribute*</B> +<DD>Contains the ruleset to distribute multiplication over addition and +subtraction. +</DL> +<P> + +<A NAME="IDX907"></A> +</P> +<DL> +<DT><U>Constant:</U> <B>distribute/</B> +<DD>Contains the ruleset to distribute division over addition and +subtraction. +<P> + +Take care when using both <VAR>distribute*</VAR> and <VAR>distribute/</VAR> +simultaneously. It is possible to put <CODE>/</CODE> into an infinite loop. +</P> +</DL> +<P> + +You can specify how sum and product expressions containing non-numeric +elements simplify by specifying the rules for <CODE>+</CODE> or <CODE>*</CODE> for +cases where expressions involving objects reduce to numbers or to +expressions involving different non-numeric elements. +</P> +<P> + +<A NAME="IDX908"></A> +</P> +<DL> +<DT><U>Function:</U> <B>cring:define-rule</B> <I>op sub-op1 sub-op2 reduction</I> +<DD>Defines a rule for the case when the operation represented by symbol +<VAR>op</VAR> is applied to lists whose <CODE>car</CODE>s are <VAR>sub-op1</VAR> and +<VAR>sub-op2</VAR>, respectively. The argument <VAR>reduction</VAR> is a +procedure accepting 2 arguments which will be lists whose <CODE>car</CODE>s +are <VAR>sub-op1</VAR> and <VAR>sub-op2</VAR>. +<P> + +<A NAME="IDX909"></A> +<DT><U>Function:</U> <B>cring:define-rule</B> <I>op sub-op1 'identity reduction</I> +<DD>Defines a rule for the case when the operation represented by symbol +<VAR>op</VAR> is applied to a list whose <CODE>car</CODE> is <VAR>sub-op1</VAR>, and +some other argument. <VAR>Reduction</VAR> will be called with the list whose +<CODE>car</CODE> is <VAR>sub-op1</VAR> and some other argument. +</P> +<P> + +If <VAR>reduction</VAR> returns <CODE>#f</CODE>, the reduction has failed and other +reductions will be tried. If <VAR>reduction</VAR> returns a non-false value, +that value will replace the two arguments in arithmetic (<CODE>+</CODE>, +<CODE>-</CODE>, and <CODE>*</CODE>) calculations involving non-numeric elements. +</P> +<P> + +The operations <CODE>+</CODE> and <CODE>*</CODE> are assumed commutative; hence both +orders of arguments to <VAR>reduction</VAR> will be tried if necessary. +</P> +<P> + +The following rule is the definition for distributing <CODE>*</CODE> over +<CODE>+</CODE>. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(cring:define-rule + '* '+ 'identity + (lambda (exp1 exp2) + (apply + (map (lambda (trm) (* trm exp2)) (cdr exp1)))))) +</pre></td></tr></table></DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC138"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC137"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC139"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.14 How to Create a Commutative Ring </H2> +<!--docid::SEC138::--> +<P> + +The first step in creating your commutative ring is to write procedures +to create elements of the ring. A non-numeric element of the ring must +be represented as a list whose first element is a symbol or string. +This first element identifies the type of the object. A convenient and +clear convention is to make the type-identifying element be the same +symbol whose top-level value is the procedure to create it. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define (n . list1) + (cond ((and (= 2 (length list1)) + (eq? (car list1) (cadr list1))) + 0) + ((not (term< (first list1) (last1 list1))) + (apply n (reverse list1))) + (else (cons 'n list1)))) + +(define (s x y) (n x y)) + +(define (m . list1) + (cond ((neq? (first list1) (term_min list1)) + (apply m (cyclicrotate list1))) + ((term< (last1 list1) (cadr list1)) + (apply m (reverse (cyclicrotate list1)))) + (else (cons 'm list1)))) +</pre></td></tr></table><P> + +Define a procedure to multiply 2 non-numeric elements of the ring. +Other multiplicatons are handled automatically. Objects for which rules +have <EM>not</EM> been defined are not changed. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define (n*n ni nj) + (let ((list1 (cdr ni)) (list2 (cdr nj))) + (cond ((null? (intersection list1 list2)) #f) + ((and (eq? (last1 list1) (first list2)) + (neq? (first list1) (last1 list2))) + (apply n (splice list1 list2))) + ((and (eq? (first list1) (first list2)) + (neq? (last1 list1) (last1 list2))) + (apply n (splice (reverse list1) list2))) + ((and (eq? (last1 list1) (last1 list2)) + (neq? (first list1) (first list2))) + (apply n (splice list1 (reverse list2)))) + ((and (eq? (last1 list1) (first list2)) + (eq? (first list1) (last1 list2))) + (apply m (cyclicsplice list1 list2))) + ((and (eq? (first list1) (first list2)) + (eq? (last1 list1) (last1 list2))) + (apply m (cyclicsplice (reverse list1) list2))) + (else #f)))) +</pre></td></tr></table><P> + +Test the procedures to see if they work. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>;;; where cyclicrotate(list) is cyclic rotation of the list one step +;;; by putting the first element at the end +(define (cyclicrotate list1) + (append (rest list1) (list (first list1)))) +;;; and where term_min(list) is the element of the list which is +;;; first in the term ordering. +(define (term_min list1) + (car (sort list1 term<))) +(define (term< sym1 sym2) + (string<? (symbol->string sym1) (symbol->string sym2))) +(define first car) +(define rest cdr) +(define (last1 list1) (car (last-pair list1))) +(define (neq? obj1 obj2) (not (eq? obj1 obj2))) +;;; where splice is the concatenation of list1 and list2 except that their +;;; common element is not repeated. +(define (splice list1 list2) + (cond ((eq? (last1 list1) (first list2)) + (append list1 (cdr list2))) + (else (slib:error 'splice list1 list2)))) +;;; where cyclicsplice is the result of leaving off the last element of +;;; splice(list1,list2). +(define (cyclicsplice list1 list2) + (cond ((and (eq? (last1 list1) (first list2)) + (eq? (first list1) (last1 list2))) + (butlast (splice list1 list2) 1)) + (else (slib:error 'cyclicsplice list1 list2)))) + +(N*N (S a b) (S a b)) => (m a b) +</pre></td></tr></table><P> + +Then register the rule for multiplying type N objects by type N objects. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(cring:define-rule '* 'N 'N N*N)) +</pre></td></tr></table><P> + +Now we are ready to compute! +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define (t) + (define detM + (+ (* (S g b) + (+ (* (S f d) + (- (* (S a f) (S d g)) (* (S a g) (S d f)))) + (* (S f f) + (- (* (S a g) (S d d)) (* (S a d) (S d g)))) + (* (S f g) + (- (* (S a d) (S d f)) (* (S a f) (S d d)))))) + (* (S g d) + (+ (* (S f b) + (- (* (S a g) (S d f)) (* (S a f) (S d g)))) + (* (S f f) + (- (* (S a b) (S d g)) (* (S a g) (S d b)))) + (* (S f g) + (- (* (S a f) (S d b)) (* (S a b) (S d f)))))) + (* (S g f) + (+ (* (S f b) + (- (* (S a d) (S d g)) (* (S a g) (S d d)))) + (* (S f d) + (- (* (S a g) (S d b)) (* (S a b) (S d g)))) + (* (S f g) + (- (* (S a b) (S d d)) (* (S a d) (S d b)))))) + (* (S g g) + (+ (* (S f b) + (- (* (S a f) (S d d)) (* (S a d) (S d f)))) + (* (S f d) + (- (* (S a b) (S d f)) (* (S a f) (S d b)))) + (* (S f f) + (- (* (S a d) (S d b)) (* (S a b) (S d d)))))))) + (* (S b e) (S c a) (S e c) + detM + )) +(pretty-print (t)) +-| +(- (+ (m a c e b d f g) + (m a c e b d g f) + (m a c e b f d g) + (m a c e b f g d) + (m a c e b g d f) + (m a c e b g f d)) + (* 2 (m a b e c) (m d f g)) + (* (m a c e b d) (m f g)) + (* (m a c e b f) (m d g)) + (* (m a c e b g) (m d f))) +</pre></td></tr></table><P> + +<A NAME="Matrix Algebra"></A> +<HR SIZE="6"> +<A NAME="SEC139"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC138"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 5.15 Matrix Algebra </H2> +<!--docid::SEC139::--> +<P> + +<CODE>(require 'determinant)</CODE> +<A NAME="IDX910"></A> +</P> +<P> + +A Matrix can be either a list of lists (rows) or an array. +As with linear-algebra texts, this package uses 1-based coordinates. +</P> +<P> + +<A NAME="IDX911"></A> +</P> +<DL> +<DT><U>Function:</U> <B>matrix->lists</B> <I>matrix</I> +<DD><P> + +Returns the list-of-lists form of <VAR>matrix</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX912"></A> +</P> +<DL> +<DT><U>Function:</U> <B>matrix->array</B> <I>matrix</I> +<DD><P> + +Returns the (ones-based) array form of <VAR>matrix</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX913"></A> +</P> +<DL> +<DT><U>Function:</U> <B>determinant</B> <I>matrix</I> +<DD><P> + +<VAR>matrix</VAR> must be a square matrix. +<CODE>determinant</CODE> returns the determinant of <VAR>matrix</VAR>. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'determinant) +(determinant '((1 2) (3 4))) => -2 +(determinant '((1 2 3) (4 5 6) (7 8 9))) => 0 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX914"></A> +</P> +<DL> +<DT><U>Function:</U> <B>transpose</B> <I>matrix</I> +<DD><P> + +Returns a copy of <VAR>matrix</VAR> flipped over the diagonal containing the 1,1 +element. +</P> +</DL> +<P> + +<A NAME="IDX915"></A> +</P> +<DL> +<DT><U>Function:</U> <B>matrix:product</B> <I>m1 m2</I> +<DD><P> + +Returns the product of matrices <VAR>m1</VAR> and <VAR>m2</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX916"></A> +</P> +<DL> +<DT><U>Function:</U> <B>matrix:inverse</B> <I>matrix</I> +<DD><P> + +<VAR>matrix</VAR> must be a square matrix. +If <VAR>matrix</VAR> is singlar, then <CODE>matrix:inverse</CODE> returns #f; otherwise <CODE>matrix:inverse</CODE> returns the +<CODE>matrix:product</CODE> inverse of <VAR>matrix</VAR>. +</P> +</DL> +<P> + +<A NAME="Database Packages"></A> +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_6.html b/slib_6.html new file mode 100644 index 0000000..804d4e9 --- /dev/null +++ b/slib_6.html @@ -0,0 +1,3658 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Database Packages</TITLE> + +<META NAME="description" CONTENT="SLIB: Database Packages"> +<META NAME="keywords" CONTENT="SLIB: Database Packages"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC140"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC139"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_5.html#SEC88"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1> 6. Database Packages </H1> +<!--docid::SEC140::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC141">6.1 Relational Database</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'relational-database</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC165">6.2 Relational Infrastructure</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'wt-tree</TD></TR> +</TABLE> +<P> + +<A NAME="Relational Database"></A> +<HR SIZE="6"> +<A NAME="SEC141"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC142"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 6.1 Relational Database </H2> +<!--docid::SEC141::--> +<P> + +<CODE>(require 'relational-database)</CODE> +<A NAME="IDX917"></A> +</P> +<P> + +This package implements a database system inspired by the Relational +Model (<CITE>E. F. Codd, A Relational Model of Data for Large Shared +Data Banks</CITE>). An SLIB relational database implementation can be created +from any <A HREF="slib_6.html#SEC166">6.2.1 Base Table</A> implementation. +</P> +<P> + +Why relational database? For motivations and design issues see<BR> +<A HREF="http://swissnet.ai.mit.edu/~jaffer/DBManifesto.html">http://swissnet.ai.mit.edu/~jaffer/DBManifesto.html</A>. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'databases</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC147">6.1.2 Table Operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC154">6.1.3 Database Interpolation</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'database-interpolate</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC155">6.1.4 Embedded Commands</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'database-commands</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC162">6.1.5 Database Macros</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'within-database</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'database-browse</TD></TR> +</TABLE> +<P> + +<A NAME="Using Databases"></A> +<HR SIZE="6"> +<A NAME="SEC142"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.1.1 Using Databases </H3> +<!--docid::SEC142::--> +<P> + +<CODE>(require 'databases)</CODE> +<A NAME="IDX918"></A> +</P> +<P> + +This enhancement wraps a utility layer on <CODE>relational-database</CODE> +which provides: +</P> +<P> + +<UL> +<LI> +Identification of open databases by filename. +<LI> +Automatic sharing of open (immutable) databases. +<LI> +Automatic loading of base-table package when creating a database. +<LI> +Detection and automatic loading of the appropriate base-table package +when opening a database. +<LI> +Table and data definition from Scheme lists. +</UL> +<P> + +<A NAME="SEC143"></A> +<H4> Database Sharing </H4> +<!--docid::SEC143::--> +<P> + +<EM>Auto-sharing</EM> refers to a call to the procedure +<A NAME="IDX919"></A> +<CODE>open-database</CODE> returning an already open database (procedure), +rather than opening the database file a second time. +</P> +<P> + +<BLOCKQUOTE> +<EM>Note:</EM> Databases returned by <CODE>open-database</CODE> do not include +wrappers applied by packages like <A HREF="slib_6.html#SEC155">6.1.4 Embedded Commands</A>. But +wrapped databases do work as arguments to these functions. +</BLOCKQUOTE> +<P> + +When a database is created, it is mutable by the creator and not +auto-sharable. A database opened mutably is also not auto-sharable. +But any number of readers can (open) share a non-mutable database file. +</P> +<P> + +This next set of procedures mirror the whole-database methods in +<A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A>. Except for <CODE>create-database</CODE>, each +procedure will accept either a filename or database procedure for its +first argument. +</P> +<P> + +<A NAME="IDX920"></A> +</P> +<DL> +<DT><U>Function:</U> <B>create-database</B> <I>filename base-table-type</I> +<DD><P> + +<VAR>filename</VAR> should be a string naming a file; or <CODE>#f</CODE>. <VAR>base-table-type</VAR> must be a +symbol naming a feature which can be passed to <CODE>require</CODE>. <CODE>create-database</CODE> +returns a new, open relational database (with base-table type <VAR>base-table-type</VAR>) +associated with <VAR>filename</VAR>, or a new ephemeral database if <VAR>filename</VAR> is <CODE>#f</CODE>. +</P> +<P> + +<CODE>create-database</CODE> is the only run-time use of require in SLIB +which crosses module boundaries. When <VAR>base-table-type</VAR> is <CODE>require</CODE>d by <CODE>create-database</CODE>; it +adds an association of <VAR>base-table-type</VAR> with its <EM>relational-system</EM> procedure +<A NAME="IDX921"></A> +to <VAR>mdbm:*databases*</VAR>. +</P> +<P> + +alist-table is the default base-table type: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'databases) +(define my-rdb (create-database "my.db" 'alist-table)) +</pre></td></tr></table></DL> +Only <CODE>alist-table</CODE> and base-table modules which have been +<CODE>require</CODE>d will dispatch correctly from the +<CODE>open-database</CODE> procedures. Therefore, either pass two +arguments to <CODE>open-database</CODE>, or require the base-table of your +database file uses before calling <CODE>open-database</CODE> with one +argument. +<P> + +<A NAME="IDX922"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>open-database!</B> <I>rdb base-table-type</I> +<DD><P> + +Returns <EM>mutable</EM> open relational database or #f. +</P> +</DL> +<P> + +<A NAME="IDX923"></A> +</P> +<DL> +<DT><U>Function:</U> <B>open-database</B> <I>rdb base-table-type</I> +<DD><P> + +Returns an open relational database associated with <VAR>rdb</VAR>. The +database will be opened with base-table type <VAR>base-table-type</VAR>). +</P> +<P> + +<A NAME="IDX924"></A> +<DT><U>Function:</U> <B>open-database</B> <I>rdb</I> +<DD>Returns an open relational database associated with <VAR>rdb</VAR>. +<CODE>open-database</CODE> will attempt to deduce the correct base-table-type. +</P> +</DL> +<P> + +<A NAME="IDX925"></A> +</P> +<DL> +<DT><U>Function:</U> <B>write-database</B> <I>rdb filename</I> +<DD><P> + +Writes the mutable relational-database <VAR>rdb</VAR> to <VAR>filename</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX926"></A> +</P> +<DL> +<DT><U>Function:</U> <B>sync-database</B> <I>rdb</I> +<DD><P> + +Writes the mutable relational-database <VAR>rdb</VAR> to the filename it was +opened with. +</P> +</DL> +<P> + +<A NAME="IDX927"></A> +</P> +<DL> +<DT><U>Function:</U> <B>solidify-database</B> <I>rdb</I> +<DD><P> + +Syncs <VAR>rdb</VAR> and makes it immutable. +</P> +</DL> +<P> + +<A NAME="IDX928"></A> +</P> +<DL> +<DT><U>Function:</U> <B>close-database</B> <I>rdb</I> +<DD><P> + +<VAR>rdb</VAR> will only be closed when the count of <CODE>open-database</CODE> - <CODE>close-database</CODE> +calls for <VAR>rdb</VAR> (and its filename) is 0. <CODE>close-database</CODE> returns #t if successful; +and #f otherwise. +</P> +</DL> +<P> + +<A NAME="IDX929"></A> +</P> +<DL> +<DT><U>Function:</U> <B>mdbm:report</B> +<DD><P> + +Prints a table of open database files. The columns are the +base-table type, number of opens, `<SAMP>!</SAMP>' for mutable, the +filename, and the lock certificate (if locked). +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(mdbm:report) +-| + alist-table 003 /usr/local/lib/slib/clrnamdb.scm + alist-table 001 ! sdram.db jaffer@aubrey.jaffer.3166:1038628199 +</pre></td></tr></table><P> + +<A NAME="SEC144"></A> +<H4> Opening Tables </H4> +<!--docid::SEC144::--> +<P> + +<A NAME="IDX930"></A> +</P> +<DL> +<DT><U>Function:</U> <B>open-table</B> <I>rdb table-name</I> +<DD><P> + +<VAR>rdb</VAR> must be a relational database and <VAR>table-name</VAR> a symbol. +</P> +<P> + +<CODE>open-table</CODE> returns a "methods" procedure for an existing relational table in +<VAR>rdb</VAR> if it exists and can be opened for reading, otherwise returns +<CODE>#f</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX931"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>open-table!</B> <I>rdb table-name</I> +<DD><P> + +<VAR>rdb</VAR> must be a relational database and <VAR>table-name</VAR> a symbol. +</P> +<P> + +<CODE>open-table!</CODE> returns a "methods" procedure for an existing relational table in +<VAR>rdb</VAR> if it exists and can be opened in mutable mode, otherwise returns +<CODE>#f</CODE>. +</P> +</DL> +<A NAME="SEC145"></A> +<H4> Defining Tables </H4> +<!--docid::SEC145::--> +<P> + +<A NAME="IDX932"></A> +</P> +<DL> +<DT><U>Function:</U> <B>define-domains</B> <I>rdb row5 <small>...</small></I> +<DD><P> + +Adds the domain rows <VAR>row5</VAR> <small>...</small> to the `<SAMP>*domains-data*</SAMP>' table +in <VAR>rdb</VAR>. The format of the row is given in <A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A>. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define-domains rdb '(permittivity #f complex? c64 #f)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX933"></A> +</P> +<DL> +<DT><U>Function:</U> <B>add-domain</B> <I>rdb row5</I> +<DD><P> + +Use <CODE>define-domains</CODE> instead. +</P> +</DL> +<P> + +<A NAME="IDX934"></A> +</P> +<DL> +<DT><U>Function:</U> <B>define-tables</B> <I>rdb spec-0 <small>...</small></I> +<DD><P> + +Adds tables as specified in <VAR>spec-0</VAR> <small>...</small> to the open +relational-database <VAR>rdb</VAR>. Each <VAR>spec</VAR> has the form: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(<name> <descriptor-name> <descriptor-name> <rows>) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>(<name> <primary-key-fields> <other-fields> <rows>) +</pre></td></tr></table><P> + +where <name> is the table name, <descriptor-name> is the symbol +name of a descriptor table, <primary-key-fields> and +<other-fields> describe the primary keys and other fields +respectively, and <rows> is a list of data rows to be added to the +table. +</P> +<P> + +<primary-key-fields> and <other-fields> are lists of field +descriptors of the form: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(<column-name> <domain>) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>(<column-name> <domain> <column-integrity-rule>) +</pre></td></tr></table><P> + +where <column-name> is the column name, <domain> is the domain +of the column, and <column-integrity-rule> is an expression whose +value is a procedure of one argument (which returns <CODE>#f</CODE> to signal +an error). +</P> +<P> + +If <domain> is not a defined domain name and it matches the name of +this table or an already defined (in one of <VAR>spec-0</VAR> <small>...</small>) single +key field table, a foreign-key domain will be created for it. +</P> +</DL> +<A NAME="SEC146"></A> +<H4> Listing Tables </H4> +<!--docid::SEC146::--> +<P> + +<A NAME="IDX935"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list-table-definition</B> <I>rdb table-name</I> +<DD><P> + +If symbol <VAR>table-name</VAR> exists in the open relational-database +<VAR>rdb</VAR>, then returns a list of the table-name, its primary key names +and domains, its other key names and domains, and the table's records +(as lists). Otherwise, returns #f. +</P> +<P> + +The list returned by <CODE>list-table-definition</CODE>, when passed as an +argument to <CODE>define-tables</CODE>, will recreate the table. +</P> +</DL> +<P> + +<A NAME="Table Operations"></A> +<HR SIZE="6"> +<A NAME="SEC147"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC142"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC148"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.1.2 Table Operations </H3> +<!--docid::SEC147::--> +<P> + +These are the descriptions of the methods available from an open +relational table. A method is retrieved from a table by calling +the table with the symbol name of the operation. For example: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>((plat 'get 'processor) 'djgpp) => i386 +</pre></td></tr></table><P> + +Some operations described below require primary key arguments. Primary +keys arguments are denoted <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small>. It is an +error to call an operation for a table which takes primary key arguments +with the wrong number of primary keys for that table. +</P> +<P> + +<A NAME="IDX936"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>get</B> <I>column-name</I> +<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which +returns the value for the <VAR>column-name</VAR> column of the row associated +with primary keys <VAR>key1</VAR>, <VAR>key2</VAR> <small>...</small> if that row exists in +the table, or <CODE>#f</CODE> otherwise. +<P> + +<TABLE><tr><td> </td><td class=example><pre>((plat 'get 'processor) 'djgpp) => i386 +((plat 'get 'processor) 'be-os) => #f +</pre></td></tr></table></DL> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC151">6.1.2.4 Indexed Sequential Access Methods</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Single Row Operations"></A> +<HR SIZE="6"> +<A NAME="SEC148"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC149"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.2.1 Single Row Operations </H4> +<!--docid::SEC148::--> +<P> + +The term <EM>row</EM> used below refers to a Scheme list of values (one for +each column) in the order specified in the descriptor (table) for this +table. Missing values appear as <CODE>#f</CODE>. Primary keys must not +be missing. +</P> +<P> + +<A NAME="IDX937"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:insert</B> +<DD>Adds the row <VAR>row</VAR> to this table. If a row for the primary key(s) +specified by <VAR>row</VAR> already exists in this table an error is +signaled. The value returned is unspecified. +</DL> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define telephone-table-desc + ((my-database 'create-table) 'telephone-table-desc)) +(define ndrp (telephone-table-desc 'row:insert)) +(ndrp '(1 #t name #f string)) +(ndrp '(2 #f telephone + (lambda (d) + (and (string? d) (> (string-length d) 2) + (every + (lambda (c) + (memv c '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 + #\+ #\( #\ #\) #\-))) + (string->list d)))) + string)) +</pre></td></tr></table><P> + +<A NAME="IDX938"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:update</B> +<DD>Returns a procedure of one argument, <VAR>row</VAR>, which adds the row, +<VAR>row</VAR>, to this table. If a row for the primary key(s) specified by +<VAR>row</VAR> already exists in this table, it will be overwritten. The +value returned is unspecified. +</DL> +<P> + +<A NAME="IDX939"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:retrieve</B> +<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which +returns the row associated with primary keys <VAR>key1</VAR>, <VAR>key2</VAR> +<small>...</small> if it exists, or <CODE>#f</CODE> otherwise. +</DL> +<P> + +<TABLE><tr><td> </td><td class=example><pre>((plat 'row:retrieve) 'linux) => (linux i386 linux gcc) +((plat 'row:retrieve) 'multics) => #f +</pre></td></tr></table><P> + +<A NAME="IDX940"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:remove</B> +<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which +removes and returns the row associated with primary keys <VAR>key1</VAR>, +<VAR>key2</VAR> <small>...</small> if it exists, or <CODE>#f</CODE> otherwise. +</DL> +<P> + +<A NAME="IDX941"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:delete</B> +<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which +deletes the row associated with primary keys <VAR>key1</VAR>, <VAR>key2</VAR> +<small>...</small> if it exists. The value returned is unspecified. +</DL> +<P> + +<A NAME="Match-Keys"></A> +<HR SIZE="6"> +<A NAME="SEC149"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC148"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC150"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.2.2 Match-Keys </H4> +<!--docid::SEC149::--> +<P> + +<A NAME="IDX942"></A> +The (optional) <VAR>match-key1</VAR> <small>...</small> arguments are used to restrict +actions of a whole-table operation to a subset of that table. Those +procedures (returned by methods) which accept match-key arguments will +accept any number of match-key arguments between zero and the number of +primary keys in the table. Any unspecified <VAR>match-key</VAR> arguments +default to <CODE>#f</CODE>. +</P> +<P> + +The <VAR>match-key1</VAR> <small>...</small> restrict the actions of the table command +to those records whose primary keys each satisfy the corresponding +<VAR>match-key</VAR> argument. The arguments and their actions are: +</P> +<P> + +<BLOCKQUOTE> +<DL COMPACT> +<DT><CODE>#f</CODE> +<DD>The false value matches any key in the corresponding position. +<DT>an object of type procedure +<DD>This procedure must take a single argument, the key in the corresponding +position. Any key for which the procedure returns a non-false value is +a match; Any key for which the procedure returns a <CODE>#f</CODE> is not. +<DT>other values +<DD>Any other value matches only those keys <CODE>equal?</CODE> to it. +</DL> +</BLOCKQUOTE> +<P> + +<A NAME="IDX943"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>get*</B> <I>column-name</I> +<DD>Returns a procedure of optional arguments <VAR>match-key1</VAR> <small>...</small> which +returns a list of the values for the specified column for all rows in +this table. The optional <VAR>match-key1</VAR> <small>...</small> arguments restrict +actions to a subset of the table. +<P> + +<TABLE><tr><td> </td><td class=example><pre>((plat 'get* 'processor)) => +(i386 i8086 i386 i8086 i386 i386 i8086 m68000 + m68000 m68000 m68000 m68000 powerpc) + +((plat 'get* 'processor) #f) => +(i386 i8086 i386 i8086 i386 i386 i8086 m68000 + m68000 m68000 m68000 m68000 powerpc) + +(define (a-key? key) + (char=? #\a (string-ref (symbol->string key) 0))) + +((plat 'get* 'processor) a-key?) => +(m68000 m68000 m68000 m68000 m68000 powerpc) + +((plat 'get* 'name) a-key?) => +(atari-st-turbo-c atari-st-gcc amiga-sas/c-5.10 + amiga-aztec amiga-dice-c aix) +</pre></td></tr></table></DL> +<P> + +<A NAME="Multi-Row Operations"></A> +<HR SIZE="6"> +<A NAME="SEC150"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC149"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC151"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.2.3 Multi-Row Operations </H4> +<!--docid::SEC150::--> +<P> + +<A NAME="IDX944"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:retrieve*</B> +<DD>Returns a procedure of optional arguments <VAR>match-key1</VAR> <small>...</small> +which returns a list of all rows in this table. The optional +<VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a subset of the +table. For details see See section <A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A>. +</DL> +<P> + +<TABLE><tr><td> </td><td class=example><pre>((plat 'row:retrieve*) a-key?) => +((atari-st-turbo-c m68000 atari turbo-c) + (atari-st-gcc m68000 atari gcc) + (amiga-sas/c-5.10 m68000 amiga sas/c) + (amiga-aztec m68000 amiga aztec) + (amiga-dice-c m68000 amiga dice-c) + (aix powerpc aix -)) +</pre></td></tr></table><P> + +<A NAME="IDX945"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:remove*</B> +<DD>Returns a procedure of optional arguments <VAR>match-key1</VAR> <small>...</small> which +removes and returns a list of all rows in this table. The optional +<VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a subset of the +table. +</DL> +<P> + +<A NAME="IDX946"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:delete*</B> +<DD>Returns a procedure of optional arguments <VAR>match-key1</VAR> <small>...</small> +which Deletes all rows from this table. The optional <VAR>match-key1</VAR> +<small>...</small> arguments restrict deletions to a subset of the table. The +value returned is unspecified. The descriptor table and catalog entry +for this table are not affected. +</DL> +<P> + +<A NAME="IDX947"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>for-each-row</B> +<DD>Returns a procedure of arguments <VAR>proc</VAR> <VAR>match-key1</VAR> <small>...</small> +which calls <VAR>proc</VAR> with each <VAR>row</VAR> in this table. The +optional <VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a +subset of the table. For details see See section <A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A>. +</DL> +<P> + +Note that <CODE>row:insert*</CODE> and <CODE>row:update*</CODE> do <EM>not</EM> use +match-keys. +</P> +<P> + +<A NAME="IDX948"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:insert*</B> +<DD>Returns a procedure of one argument, <VAR>rows</VAR>, which adds each row in +the list of rows, <VAR>rows</VAR>, to this table. If a row for the primary +key specified by an element of <VAR>rows</VAR> already exists in this table, +an error is signaled. The value returned is unspecified. +</DL> +<P> + +<A NAME="IDX949"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>row:update*</B> +<DD>Returns a procedure of one argument, <VAR>rows</VAR>, which adds each row in +the list of rows, <VAR>rows</VAR>, to this table. If a row for the primary +key specified by an element of <VAR>rows</VAR> already exists in this table, +it will be overwritten. The value returned is unspecified. +</DL> +<P> + +<A NAME="Indexed Sequential Access Methods"></A> +<HR SIZE="6"> +<A NAME="SEC151"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC150"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC152"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.2.4 Indexed Sequential Access Methods </H4> +<!--docid::SEC151::--> +<P> + +<A NAME="IDX950"></A> +<EM>Indexed Sequential Access Methods</EM> are a way of arranging +database information so that records can be accessed both by key and +by key sequence (ordering). <EM>ISAM</EM> is not part of Codd's +relational model. Hardcore relational programmers might use some +least-upper-bound join for every row to get them into an order. +</P> +<P> + +Associative memory in B-Trees is an example of a database +implementation which can support a native key ordering. SLIB's +<CODE>alist-table</CODE> implementation uses <CODE>sort</CODE> to implement +<CODE>for-each-row-in-order</CODE>, but does not support <CODE>isam-next</CODE> +and <CODE>isam-prev</CODE>. +</P> +<P> + +The multi-primary-key ordering employed by these operations is the +lexicographic collation of those primary-key fields in their given +order. For example: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(12 a 34) < (12 a 36) < (12 b 1) < (13 a 0) +</pre></td></tr></table><P> + +<A NAME="Sequential Index Operations"></A> +<HR SIZE="6"> +<A NAME="SEC152"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC151"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC153"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.2.5 Sequential Index Operations </H4> +<!--docid::SEC152::--> +<P> + +The following procedures are individually optional depending on the +base-table implememtation. If an operation is <EM>not</EM> supported, +then calling the table with that operation symbol will return false. +</P> +<P> + +<A NAME="IDX951"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>for-each-row-in-order</B> +<DD>Returns a procedure of arguments <VAR>proc</VAR> <VAR>match-key1</VAR> <small>...</small> +which calls <VAR>proc</VAR> with each <VAR>row</VAR> in this table in the +(implementation-dependent) natural, repeatable ordering for rows. The +optional <VAR>match-key1</VAR> <small>...</small> arguments restrict actions to a +subset of the table. For details see See section <A HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A>. +</DL> +<P> + +<A NAME="IDX952"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>isam-next</B> +<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which +returns the key-list identifying the lowest record higher than +<VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which is stored in the relational-table; +or false if no higher record is present. +<P> + +<A NAME="IDX953"></A> +<DT><U>Operation:</U> relational-table <B>isam-next</B> <I>column-name</I> +<DD>The symbol <VAR>column-name</VAR> names a key field. In the list returned +by <CODE>isam-next</CODE>, that field, or a field to its left, will be +changed. This allows one to skip over less significant key fields. +</P> +</DL> +<P> + +<A NAME="IDX954"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>isam-prev</B> +<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which +returns the key-list identifying the highest record less than +<VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which is stored in the relational-table; +or false if no lower record is present. +<P> + +<A NAME="IDX955"></A> +<DT><U>Operation:</U> relational-table <B>isam-prev</B> <I>index</I> +<DD>The symbol <VAR>column-name</VAR> names a key field. In the list returned +by <CODE>isam-next</CODE>, that field, or a field to its left, will be +changed. This allows one to skip over less significant key fields. +</P> +</DL> +<P> + +For example, if a table has key fields: +<TABLE><tr><td> </td><td class=example><pre>(col1 col2) +(9 5) +(9 6) +(9 7) +(9 8) +(12 5) +(12 6) +(12 7) +</pre></td></tr></table><P> + +Then: +<TABLE><tr><td> </td><td class=example><pre>((table 'isam-next) '(9 5)) => (9 6) +((table 'isam-next 'col2) '(9 5)) => (9 6) +((table 'isam-next 'col1) '(9 5)) => (12 5) +((table 'isam-prev) '(12 7)) => (12 6) +((table 'isam-prev 'col2) '(12 7)) => (12 6) +((table 'isam-prev 'col1) '(12 7)) => (9 8) +</pre></td></tr></table><P> + +<A NAME="Table Administration"></A> +<HR SIZE="6"> +<A NAME="SEC153"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC152"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC154"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC147"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.2.6 Table Administration </H4> +<!--docid::SEC153::--> +<P> + +<A NAME="IDX956"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>column-names</B> +<DD><A NAME="IDX957"></A> +<DT><U>Operation:</U> relational-table <B>column-foreigns</B> +<DD><A NAME="IDX958"></A> +<DT><U>Operation:</U> relational-table <B>column-domains</B> +<DD><A NAME="IDX959"></A> +<DT><U>Operation:</U> relational-table <B>column-types</B> +<DD>Return a list of the column names, foreign-key table names, domain +names, or type names respectively for this table. These 4 methods are +different from the others in that the list is returned, rather than a +procedure to obtain the list. +<P> + +<A NAME="IDX960"></A> +<DT><U>Operation:</U> relational-table <B>primary-limit</B> +<DD>Returns the number of primary keys fields in the relations in this +table. +</P> +</DL> +<P> + +<A NAME="IDX961"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-table <B>close-table</B> +<DD>Subsequent operations to this table will signal an error. +</DL> +<P> + +<A NAME="Database Interpolation"></A> +<HR SIZE="6"> +<A NAME="SEC154"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC153"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.1.3 Database Interpolation </H3> +<!--docid::SEC154::--> +<P> + +<CODE>(require 'database-interpolate)</CODE> +</P> +<P> + +Indexed sequential access methods allow finding the keys (having +associations) closest to a given value. This facilitates the +interpolation of associations between those in the table. +</P> +<P> + +<A NAME="IDX962"></A> +</P> +<DL> +<DT><U>Function:</U> <B>interpolate-from-table</B> <I>table column</I> +<DD><VAR>Table</VAR> should be a relational table with one numeric primary key +field which supports the <CODE>isam-prev</CODE> and <CODE>isam-next</CODE> +operations. <VAR>column</VAR> should be a symbol or exact positive integer +designating a numerically valued column of <VAR>table</VAR>. +<P> + +<CODE>interpolate-from-table</CODE> calculates and returns a value +proportionally intermediate between its values in the next and +previous key records contained in <VAR>table</VAR>. For keys larger than +all the stored keys the value associated with the largest stored key +is used. For keys smaller than all the stored keys the value +associated with the smallest stored key is used. +</P> +</DL> +<P> + +<A NAME="Embedded Commands"></A> +<HR SIZE="6"> +<A NAME="SEC155"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC154"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC156"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.1.4 Embedded Commands </H3> +<!--docid::SEC155::--> +<P> + +<CODE>(require 'database-commands)</CODE> +</P> +<P> + +This enhancement wraps a utility layer on <CODE>relational-database</CODE> +which provides: +</P> +<P> + +<UL> +<LI> +Automatic execution of initialization commands stored in database. +<LI> +Transparent execution of database commands stored in <CODE>*commands*</CODE> +table in database. +</UL> +<P> + +When an enhanced relational-database is called with a symbol which +matches a <VAR>name</VAR> in the <CODE>*commands*</CODE> table, the associated +procedure expression is evaluated and applied to the enhanced +relational-database. A procedure should then be returned which the user +can invoke on (optional) arguments. +</P> +<P> + +The command <CODE>*initialize*</CODE> is special. If present in the +<CODE>*commands*</CODE> table, <CODE>open-database</CODE> or <CODE>open-database!</CODE> +will return the value of the <CODE>*initialize*</CODE> command. Notice that +arbitrary code can be run when the <CODE>*initialize*</CODE> procedure is +automatically applied to the enhanced relational-database. +</P> +<P> + +Note also that if you wish to shadow or hide from the user +relational-database methods described in <A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A>, this +can be done by a dispatch in the closure returned by the +<CODE>*initialize*</CODE> expression rather than by entries in the +<CODE>*commands*</CODE> table if it is desired that the underlying methods +remain accessible to code in the <CODE>*commands*</CODE> table. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC158">6.1.4.3 Define-tables Example</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC159">6.1.4.4 The *commands* Table</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC160">6.1.4.5 Command Service</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Database Extension"></A> +<HR SIZE="6"> +<A NAME="SEC156"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC157"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.4.1 Database Extension </H4> +<!--docid::SEC156::--> +<P> + +<A NAME="IDX963"></A> +</P> +<DL> +<DT><U>Function:</U> <B>wrap-command-interface</B> <I>rdb</I> +<DD>Returns relational database <VAR>rdb</VAR> wrapped with additional commands +defined in its *commands* table. +</DL> +<P> + +<A NAME="IDX964"></A> +</P> +<DL> +<DT><U>Function:</U> <B>add-command-tables</B> <I>rdb</I> +<DD>The relational database <VAR>rdb</VAR> must be mutable. +<VAR>add-command-tables</VAR> adds a *command* table to <VAR>rdb</VAR>; then +returns <CODE>(wrap-command-interface <VAR>rdb</VAR>)</CODE>. +</DL> +<P> + +<A NAME="IDX965"></A> +</P> +<DL> +<DT><U>Function:</U> <B>define-*commands*</B> <I>rdb spec-0 <small>...</small></I> +<DD><P> + +Adds commands to the <CODE>*commands*</CODE> table as specified in +<VAR>spec-0</VAR> <small>...</small> to the open relational-database <VAR>rdb</VAR>. Each +<VAR>spec</VAR> has the form: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>((<name> <rdb>) "comment" <expression1> <expression2> <small>...</small>) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>((<name> <rdb>) <expression1> <expression2> <small>...</small>) +</pre></td></tr></table><P> + +where <name> is the command name, <rdb> is a formal passed the +calling relational database, "comment" describes the +command, and <expression1>, <expression1>, <small>...</small> are the +body of the procedure. +</P> +<P> + +<CODE>define-*commands*</CODE> adds to the <CODE>*commands*</CODE> table a command +<name>: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(lambda (<name> <rdb>) <expression1> <expression2> <small>...</small>) +</pre></td></tr></table><P> + +</P> +</DL> +<P> + +<A NAME="IDX966"></A> +</P> +<DL> +<DT><U>Function:</U> <B>open-command-database</B> <I>filename</I> +<DD><A NAME="IDX967"></A> +<DT><U>Function:</U> <B>open-command-database</B> <I>filename base-table-type</I> +<DD>Returns an open enhanced relational database associated with +<VAR>filename</VAR>. The database will be opened with base-table type +<VAR>base-table-type</VAR>) if supplied. If <VAR>base-table-type</VAR> is not +supplied, <CODE>open-command-database</CODE> will attempt to deduce the correct +base-table-type. If the database can not be opened or if it lacks the +<CODE>*commands*</CODE> table, <CODE>#f</CODE> is returned. +<P> + +<A NAME="IDX968"></A> +<DT><U>Function:</U> <B>open-command-database!</B> <I>filename</I> +<DD><A NAME="IDX969"></A> +<DT><U>Function:</U> <B>open-command-database!</B> <I>filename base-table-type</I> +<DD>Returns <EM>mutable</EM> open enhanced relational database <small>...</small> +</P> +<P> + +<A NAME="IDX970"></A> +<DT><U>Function:</U> <B>open-command-database</B> <I>database</I> +<DD>Returns <VAR>database</VAR> if it is an immutable relational database; #f +otherwise. +</P> +<P> + +<A NAME="IDX971"></A> +<DT><U>Function:</U> <B>open-command-database!</B> <I>database</I> +<DD>Returns <VAR>database</VAR> if it is a mutable relational database; #f +otherwise. +</P> +</DL> +<P> + +<A NAME="Command Intrinsics"></A> +<HR SIZE="6"> +<A NAME="SEC157"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC156"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC158"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.4.2 Command Intrinsics </H4> +<!--docid::SEC157::--> +<P> + +Some commands are defined in all extended relational-databases. The are +called just like <A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A>. +</P> +<P> + +<A NAME="IDX972"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>add-domain</B> <I>domain-row</I> +<DD>Adds <VAR>domain-row</VAR> to the <EM>domains</EM> table if there is no row in +the domains table associated with key <CODE>(car <VAR>domain-row</VAR>)</CODE> and +returns <CODE>#t</CODE>. Otherwise returns <CODE>#f</CODE>. +<P> + +For the fields and layout of the domain table, See section <A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A>. Currently, these fields are +<UL> +<LI> +domain-name +<LI> +foreign-table +<LI> +domain-integrity-rule +<LI> +type-id +<LI> +type-param +</UL> +<P> + +The following example adds 3 domains to the `<SAMP>build</SAMP>' database. +`<SAMP>Optstring</SAMP>' is either a string or <CODE>#f</CODE>. <CODE>filename</CODE> is a +string and <CODE>build-whats</CODE> is a symbol. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(for-each (build 'add-domain) + '((optstring #f + (lambda (x) (or (not x) (string? x))) + string + #f) + (filename #f #f string #f) + (build-whats #f #f symbol #f))) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX973"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>delete-domain</B> <I>domain-name</I> +<DD>Removes and returns the <VAR>domain-name</VAR> row from the <EM>domains</EM> +table. +</DL> +<P> + +<A NAME="IDX974"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>domain-checker</B> <I>domain</I> +<DD>Returns a procedure to check an argument for conformance to domain +<VAR>domain</VAR>. +</DL> +<P> + +<A NAME="Define-tables Example"></A> +<HR SIZE="6"> +<A NAME="SEC158"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC157"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC159"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.4.3 Define-tables Example </H4> +<!--docid::SEC158::--> +<P> + +The following example shows a new database with the name of +`<TT>foo.db</TT>' being created with tables describing processor families +and processor/os/compiler combinations. The database is then +solidified; saved and changed to immutable. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'databases) +<A NAME="IDX975"></A>(define my-rdb (create-database "foo.db" 'alist-table)) +(define-tables my-rdb + '(processor-family + ((family atom)) + ((also-ran processor-family)) + ((m68000 #f) + (m68030 m68000) + (i386 i8086) + (i8086 #f) + (powerpc #f))) + + '(platform + ((name symbol)) + ((processor processor-family) + (os symbol) + (compiler symbol)) + ((aix powerpc aix -) + (amiga-dice-c m68000 amiga dice-c) + (amiga-aztec m68000 amiga aztec) + (amiga-sas/c-5.10 m68000 amiga sas/c) + (atari-st-gcc m68000 atari gcc) + (atari-st-turbo-c m68000 atari turbo-c) + (borland-c-3.1 i8086 ms-dos borland-c) + (djgpp i386 ms-dos gcc) + (linux i386 linux gcc) + (microsoft-c i8086 ms-dos microsoft-c) + (os/2-emx i386 os/2 gcc) + (turbo-c-2 i8086 ms-dos turbo-c) + (watcom-9.0 i386 ms-dos watcom)))) + +(solidify-database my-rdb) +</pre></td></tr></table><P> + +<A NAME="The *commands* Table"></A> +<HR SIZE="6"> +<A NAME="SEC159"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC158"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC160"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.4.4 The *commands* Table </H4> +<!--docid::SEC159::--> +<P> + +The table <CODE>*commands*</CODE> in an <EM>enhanced</EM> relational-database has +the fields (with domains): +<TABLE><tr><td> </td><td class=example><pre>PRI name symbol + parameters parameter-list + procedure expression + documentation string +</pre></td></tr></table><P> + +The <CODE>parameters</CODE> field is a foreign key (domain +<CODE>parameter-list</CODE>) of the <CODE>*catalog-data*</CODE> table and should +have the value of a table described by <CODE>*parameter-columns*</CODE>. This +<CODE>parameter-list</CODE> table describes the arguments suitable for passing +to the associated command. The intent of this table is to be of a form +such that different user-interfaces (for instance, pull-down menus or +plain-text queries) can operate from the same table. A +<CODE>parameter-list</CODE> table has the following fields: +<TABLE><tr><td> </td><td class=example><pre>PRI index ordinal + name symbol + arity parameter-arity + domain domain + defaulter expression + expander expression + documentation string +</pre></td></tr></table><P> + +The <CODE>arity</CODE> field can take the values: +</P> +<P> + +</P> +<DL COMPACT> +<DT><CODE>single</CODE> +<DD>Requires a single parameter of the specified domain. +<DT><CODE>optional</CODE> +<DD>A single parameter of the specified domain or zero parameters is +acceptable. +<DT><CODE>boolean</CODE> +<DD>A single boolean parameter or zero parameters (in which case <CODE>#f</CODE> +is substituted) is acceptable. +<DT><CODE>nary</CODE> +<DD>Any number of parameters of the specified domain are acceptable. The +argument passed to the command function is always a list of the +parameters. +<DT><CODE>nary1</CODE> +<DD>One or more of parameters of the specified domain are acceptable. The +argument passed to the command function is always a list of the +parameters. +</DL> +<P> + +The <CODE>domain</CODE> field specifies the domain which a parameter or +parameters in the <CODE>index</CODE>th field must satisfy. +</P> +<P> + +The <CODE>defaulter</CODE> field is an expression whose value is either +<CODE>#f</CODE> or a procedure of one argument (the parameter-list) which +returns a <EM>list</EM> of the default value or values as appropriate. +Note that since the <CODE>defaulter</CODE> procedure is called every time a +default parameter is needed for this column, <EM>sticky</EM> defaults can +be implemented using shared state with the domain-integrity-rule. +</P> +<P> + +<A NAME="Command Service"></A> +<HR SIZE="6"> +<A NAME="SEC160"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC159"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC161"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.4.5 Command Service </H4> +<!--docid::SEC160::--> +<P> + +<A NAME="IDX976"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-command-server</B> <I>rdb table-name</I> +<DD>Returns a procedure of 2 arguments, a (symbol) command and a call-back +procedure. When this returned procedure is called, it looks up +<VAR>command</VAR> in table <VAR>table-name</VAR> and calls the call-back +procedure with arguments: +<DL COMPACT> +<DT><VAR>command</VAR> +<DD>The <VAR>command</VAR> +<DT><VAR>command-value</VAR> +<DD>The result of evaluating the expression in the <VAR>procedure</VAR> field of +<VAR>table-name</VAR> and calling it with <VAR>rdb</VAR>. +<DT><VAR>parameter-name</VAR> +<DD>A list of the <EM>official</EM> name of each parameter. Corresponds to the +<CODE>name</CODE> field of the <VAR>command</VAR>'s parameter-table. +<DT><VAR>positions</VAR> +<DD>A list of the positive integer index of each parameter. Corresponds to +the <CODE>index</CODE> field of the <VAR>command</VAR>'s parameter-table. +<DT><VAR>arities</VAR> +<DD>A list of the arities of each parameter. Corresponds to the +<CODE>arity</CODE> field of the <VAR>command</VAR>'s parameter-table. For a +description of <CODE>arity</CODE> see table above. +<DT><VAR>types</VAR> +<DD>A list of the type name of each parameter. Correspnds to the +<CODE>type-id</CODE> field of the contents of the <CODE>domain</CODE> of the +<VAR>command</VAR>'s parameter-table. +<DT><VAR>defaulters</VAR> +<DD>A list of the defaulters for each parameter. Corresponds to +the <CODE>defaulters</CODE> field of the <VAR>command</VAR>'s parameter-table. +<DT><VAR>domain-integrity-rules</VAR> +<DD>A list of procedures (one for each parameter) which tests whether a +value for a parameter is acceptable for that parameter. The procedure +should be called with each datum in the list for <CODE>nary</CODE> arity +parameters. +<DT><VAR>aliases</VAR> +<DD>A list of lists of <CODE>(alias parameter-name)</CODE>. There can be +more than one alias per <VAR>parameter-name</VAR>. +</DL> +</DL> +<P> + +For information about parameters, See section <A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A>. +</P> +<P> + +<A NAME="Command Example"></A> +<HR SIZE="6"> +<A NAME="SEC161"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC160"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC162"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC155"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.4.6 Command Example </H4> +<!--docid::SEC161::--> +<P> + +Here is an example of setting up a command with arguments and parsing +those arguments from a <CODE>getopt</CODE> style argument list +(see section <A HREF="slib_4.html#SEC62">4.4.1 Getopt</A>). +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'database-commands) +<A NAME="IDX977"></A>(require 'databases) +<A NAME="IDX978"></A>(require 'getopt-parameters) +<A NAME="IDX979"></A>(require 'parameters) +<A NAME="IDX980"></A>(require 'getopt) +<A NAME="IDX981"></A>(require 'fluid-let) +(require 'printf) + +(define my-rdb (add-command-tables (create-database #f 'alist-table))) + +(define-tables my-rdb + '(foo-params + *parameter-columns* + *parameter-columns* + ((1 single-string single string + (lambda (pl) '("str")) #f "single string") + (2 nary-symbols nary symbol + (lambda (pl) '()) #f "zero or more symbols") + (3 nary1-symbols nary1 symbol + (lambda (pl) '(symb)) #f "one or more symbols") + (4 optional-number optional ordinal + (lambda (pl) '()) #f "zero or one number") + (5 flag boolean boolean + (lambda (pl) '(#f)) #f "a boolean flag"))) + '(foo-pnames + ((name string)) + ((parameter-index ordinal)) + (("s" 1) + ("single-string" 1) + ("n" 2) + ("nary-symbols" 2) + ("N" 3) + ("nary1-symbols" 3) + ("o" 4) + ("optional-number" 4) + ("f" 5) + ("flag" 5))) + '(my-commands + ((name symbol)) + ((parameters parameter-list) + (parameter-names parameter-name-translation) + (procedure expression) + (documentation string)) + ((foo + foo-params + foo-pnames + (lambda (rdb) (lambda args (print args))) + "test command arguments")))) + +(define (dbutil:serve-command-line rdb command-table command argv) + (set! *argv* (if (vector? argv) (vector->list argv) argv)) + ((make-command-server rdb command-table) + command + (lambda (comname comval options positions + arities types defaulters dirs aliases) + (apply comval (getopt->arglist options positions + arities types defaulters dirs aliases))))) + +(define (cmd . opts) + (fluid-let ((*optind* 1)) + (printf "%-34s => " + (call-with-output-string + (lambda (pt) (write (cons 'cmd opts) pt)))) + (set! opts (cons "cmd" opts)) + (force-output) + (dbutil:serve-command-line + my-rdb 'my-commands 'foo (length opts) opts))) + +(cmd) => ("str" () (symb) () #f) +(cmd "-f") => ("str" () (symb) () #t) +(cmd "--flag") => ("str" () (symb) () #t) +(cmd "-o177") => ("str" () (symb) (177) #f) +(cmd "-o" "177") => ("str" () (symb) (177) #f) +(cmd "--optional" "621") => ("str" () (symb) (621) #f) +(cmd "--optional=621") => ("str" () (symb) (621) #f) +(cmd "-s" "speciality") => ("speciality" () (symb) () #f) +(cmd "-sspeciality") => ("speciality" () (symb) () #f) +(cmd "--single" "serendipity") => ("serendipity" () (symb) () #f) +(cmd "--single=serendipity") => ("serendipity" () (symb) () #f) +(cmd "-n" "gravity" "piety") => ("str" () (piety gravity) () #f) +(cmd "-ngravity" "piety") => ("str" () (piety gravity) () #f) +(cmd "--nary" "chastity") => ("str" () (chastity) () #f) +(cmd "--nary=chastity" "") => ("str" () ( chastity) () #f) +(cmd "-N" "calamity") => ("str" () (calamity) () #f) +(cmd "-Ncalamity") => ("str" () (calamity) () #f) +(cmd "--nary1" "surety") => ("str" () (surety) () #f) +(cmd "--nary1=surety") => ("str" () (surety) () #f) +(cmd "-N" "levity" "fealty") => ("str" () (fealty levity) () #f) +(cmd "-Nlevity" "fealty") => ("str" () (fealty levity) () #f) +(cmd "--nary1" "surety" "brevity") => ("str" () (brevity surety) () #f) +(cmd "--nary1=surety" "brevity") => ("str" () (brevity surety) () #f) +(cmd "-?") +-| +Usage: cmd [OPTION ARGUMENT ...] ... + + -f, --flag + -o, --optional[=]<number> + -n, --nary[=]<symbols> ... + -N, --nary1[=]<symbols> ... + -s, --single[=]<string> + +ERROR: getopt->parameter-list "unrecognized option" "-?" +</pre></td></tr></table><P> + +<A NAME="Database Macros"></A> +<HR SIZE="6"> +<A NAME="SEC162"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC161"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC163"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.1.5 Database Macros </H3> +<!--docid::SEC162::--> +<P> + +<CODE>(require 'within-database)</CODE> +</P> +<P> + +The object-oriented programming interface to SLIB relational databases +has failed to support clear, understandable, and modular code-writing +for database applications. +</P> +<P> + +This seems to be a failure of the object-oriented paradigm where the +type of an object is not manifest (or even traceable) in source code. +</P> +<P> + +<CODE>within-database</CODE>, along with the `<SAMP>databases</SAMP>' package, +reorganizes high-level database functions toward a more declarative +style. Using this package, one can tag database table and command +declarations for emacs: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>etags -lscheme -r'/ *(define-\(command\|table\) (\([^; \t]+\)/\2/' \ + source1.scm ... +</pre></td></tr></table><P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC163">6.1.5.1 Within-database Example</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="IDX982"></A> +</P> +<DL> +<DT><U>Function:</U> <B>within-database</B> <I>database statement-1 <small>...</small></I> +<DD><P> + +<CODE>within-database</CODE> creates a lexical scope in which the commands +<CODE>define-table</CODE> and <CODE>define-command</CODE> create tables and +<CODE>*commands*</CODE>-table entries respectively in open relational +database <VAR>database</VAR>. +</P> +<P> + +<CODE>within-database</CODE> Returns <VAR>database</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX983"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>define-command</B> <I>(<name> <rdb>) "comment" <expression1> <expression2> <small>...</small></I> +<DD><A NAME="IDX984"></A> +<DT><U>Syntax:</U> <B>define-command</B> <I>(<name> <rdb>) <expression1> <expression2> <small>...</small></I> +<DD><P> + +Adds to the <CODE>*commands*</CODE> table a command +<name>: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(lambda (<name> <rdb>) <expression1> <expression2> <small>...</small>) +</pre></td></tr></table><P> + +</P> +</DL> +<P> + +<A NAME="IDX985"></A> +</P> +<DL> +<DT><U>Syntax:</U> <B>define-table</B> <I><name> <descriptor-name> <descriptor-name> <rows></I> +<DD><A NAME="IDX986"></A> +<DT><U>Syntax:</U> <B>define-table</B> <I><name> <primary-key-fields> <other-fields> <rows></I> +<DD><P> + +where <name> is the table name, <descriptor-name> is the symbol +name of a descriptor table, <primary-key-fields> and +<other-fields> describe the primary keys and other fields +respectively, and <rows> is a list of data rows to be added to the +table. +</P> +<P> + +<primary-key-fields> and <other-fields> are lists of field +descriptors of the form: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(<column-name> <domain>) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>(<column-name> <domain> <column-integrity-rule>) +</pre></td></tr></table><P> + +where <column-name> is the column name, <domain> is the domain +of the column, and <column-integrity-rule> is an expression whose +value is a procedure of one argument (which returns <CODE>#f</CODE> to signal +an error). +</P> +<P> + +If <domain> is not a defined domain name and it matches the name of +this table or an already defined (in one of <VAR>spec-0</VAR> <small>...</small>) single +key field table, a foreign-key domain will be created for it. +</P> +<P> + +</P> +</DL> +<P> + +<A NAME="Within-database Example"></A> +<HR SIZE="6"> +<A NAME="SEC163"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC162"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC164"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC162"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.1.5.1 Within-database Example </H4> +<!--docid::SEC163::--> +<P> + +Here is an example of <CODE>within-database</CODE> macros: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'within-database) + +(define my-rdb + (add-command-tables + (create-database "foo.db" 'alist-table))) + +(within-database my-rdb + (define-command (*initialize* rdb) + "Print Welcome" + (display "Welcome") + (newline) + rdb) + (define-command (without-documentation rdb) + (display "without-documentation called") + (newline)) + (define-table (processor-family + ((family atom)) + ((also-ran processor-family))) + (m68000 #f) + (m68030 m68000) + (i386 i8086) + (i8086 #f) + (powerpc #f)) + (define-table (platform + ((name symbol)) + ((processor processor-family) + (os symbol) + (compiler symbol))) + (aix powerpc aix -) + ;; ... + (amiga-aztec m68000 amiga aztec) + (amiga-sas/c-5.10 m68000 amiga sas/c) + (atari-st-gcc m68000 atari gcc) + ;; ... + (watcom-9.0 i386 ms-dos watcom)) + (define-command (get-processor rdb) + "Get processor for given platform." + (((rdb 'open-table) 'platform #f) 'get 'processor))) + +(close-database my-rdb) + +(set! my-rdb (open-command-database! "foo.db")) +-| +Welcome + +(my-rdb 'without-documentation) +-| +without-documentation called + +((my-rdb 'get-processor) 'amiga-sas/c-5.10) +=> m68000 + +(close-database my-rdb) +</pre></td></tr></table><P> + +<A NAME="Database Browser"></A> +<HR SIZE="6"> +<A NAME="SEC164"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC163"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC165"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC141"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.1.6 Database Browser </H3> +<!--docid::SEC164::--> +<P> + +(require 'database-browse) +</P> +<P> + +<A NAME="IDX987"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>browse</B> <I>database</I> +<DD><P> + +Prints the names of all the tables in <VAR>database</VAR> and sets browse's +default to <VAR>database</VAR>. +</P> +<P> + +<A NAME="IDX988"></A> +<DT><U>Procedure:</U> <B>browse</B> +<DD></P> +<P> + +Prints the names of all the tables in the default database. +</P> +<P> + +<A NAME="IDX989"></A> +<DT><U>Procedure:</U> <B>browse</B> <I>table-name</I> +<DD></P> +<P> + +For each record of the table named by the symbol <VAR>table-name</VAR>, +prints a line composed of all the field values. +</P> +<P> + +<A NAME="IDX990"></A> +<DT><U>Procedure:</U> <B>browse</B> <I>pathname</I> +<DD></P> +<P> + +Opens the database named by the string <VAR>pathname</VAR>, prints the names +of all its tables, and sets browse's default to the database. +</P> +<P> + +<A NAME="IDX991"></A> +<DT><U>Procedure:</U> <B>browse</B> <I>database table-name</I> +<DD></P> +<P> + +Sets browse's default to <VAR>database</VAR> and prints the records of the +table named by the symbol <VAR>table-name</VAR>. +</P> +<P> + +<A NAME="IDX992"></A> +<DT><U>Procedure:</U> <B>browse</B> <I>pathname table-name</I> +<DD></P> +<P> + +Opens the database named by the string <VAR>pathname</VAR> and sets browse's +default to it; <CODE>browse</CODE> prints the records of the table named by +the symbol <VAR>table-name</VAR>. +</P> +<P> + +</P> +</DL> +<P> + +<A NAME="Relational Infrastructure"></A> +<HR SIZE="6"> +<A NAME="SEC165"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC164"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 6.2 Relational Infrastructure </H2> +<!--docid::SEC165::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC166">6.2.1 Base Table</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC177">6.2.4 Database Operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Base Table"></A> +<HR SIZE="6"> +<A NAME="SEC166"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC165"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC167"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC165"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.2.1 Base Table </H3> +<!--docid::SEC166::--> +<P> + +<A NAME="IDX993"></A> +A <EM>base-table</EM> is the primitive database layer upon which SLIB +relational databases are built. At the minimum, it must support the +types integer, symbol, string, and boolean. The base-table may restrict +the size of integers, symbols, and strings it supports. +</P> +<P> + +A base table implementation is available as the value of the identifier +naming it (eg. <VAR>alist-table</VAR>) after requiring the symbol of that +name. +</P> +<P> + +<A NAME="IDX994"></A> +</P> +<DL> +<DT><U>Feature:</U> <B>alist-table</B> +<DD><CODE>(require 'alist-table)</CODE> +<A NAME="IDX995"></A> +<P> + +Association-list base tables support all Scheme types and are suitable +for small databases. In order to be retrieved after being written to a +file, the data stored should include only objects which are readable and +writeable in the Scheme implementation. +</P> +<P> + +The <EM>alist-table</EM> base-table implementation is included in the +SLIB distribution. +</P> +</DL> +<P> + +<EM>WB</EM> is a B-tree database package with SCM interfaces. Being +disk-based, WB databases readily store and access hundreds of +megabytes of data. WB comes with two base-table embeddings. +</P> +<P> + +<A NAME="IDX996"></A> +</P> +<DL> +<DT><U>Feature:</U> <B>wb-table</B> +<DD><CODE>(require 'wb-table)</CODE> +<A NAME="IDX997"></A> +<P> + +<A NAME="IDX998"></A> +<CODE>wb-table</CODE> supports scheme expressions for keys and values whose +text representations are less than 255 characters in length. +See section `wb-table' in <CITE>WB</CITE>. +</P> +</DL> +<P> + +<A NAME="IDX999"></A> +</P> +<DL> +<DT><U>Feature:</U> <B>rwb-isam</B> +<DD><CODE>(require 'rwb-isam)</CODE> +<A NAME="IDX1000"></A> +<P> + +<EM>rwb-isam</EM> is a sophisticated base-table implementation built on +WB and SCM which uses binary numerical formats for key and non-key +fields. It supports IEEE floating-point and fixed-precision integer +keys with the correct numerical collation order. +</P> +</DL> +<P> + +This rest of this section documents the interface for a base table +implementation from which the <A HREF="slib_6.html#SEC141">6.1 Relational Database</A> package +constructs a Relational system. It will be of interest primarily to +those wishing to port or write new base-table implementations. +</P> +<P> + +<A NAME="IDX1001"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>*base-table-implementations*</B> +<DD>To support automatic dispatch for <CODE>open-database</CODE>, each base-table +module adds an association to <VAR>*base-table-implementations*</VAR> when +loaded. This association is the list of the base-table symbol and the +value returned by <CODE>(make-relational-system <VAR>base-table</VAR>)</CODE>. +</DL> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC169">6.2.1.3 Base Field Types</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="The Base"></A> +<HR SIZE="6"> +<A NAME="SEC167"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC168"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.2.1.1 The Base </H4> +<!--docid::SEC167::--> +<P> + +All of these functions are accessed through a single procedure by +calling that procedure with the symbol name of the operation. A +procedure will be returned if that operation is supported and <CODE>#f</CODE> +otherwise. For example: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'alist-table) +<A NAME="IDX1002"></A><A NAME="IDX1003"></A>(define my-base (alist-table 'make-base)) +my-base => *a procedure* +(define foo (alist-table 'foo)) +foo => #f +</pre></td></tr></table><P> + +<A NAME="IDX1004"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-base</B> <I>filename key-dimension column-types</I> +<DD>Returns a new, open, low-level database (collection of tables) +associated with <VAR>filename</VAR>. This returned database has an empty +table associated with <VAR>catalog-id</VAR>. The positive integer +<VAR>key-dimension</VAR> is the number of keys composed to make a +<VAR>primary-key</VAR> for the catalog table. The list of symbols +<VAR>column-types</VAR> describes the types of each column for that table. +If the database cannot be created as specified, <CODE>#f</CODE> is returned. +<P> + +Calling the <CODE>close-base</CODE> method on this database and possibly other +operations will cause <VAR>filename</VAR> to be written to. If +<VAR>filename</VAR> is <CODE>#f</CODE> a temporary, non-disk based database will be +created if such can be supported by the base table implelentation. +</P> +</DL> +<P> + +<A NAME="IDX1005"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>open-base</B> <I>filename mutable</I> +<DD>Returns an open low-level database associated with <VAR>filename</VAR>. If +<VAR>mutable</VAR> is <CODE>#t</CODE>, this database will have methods capable of +effecting change to the database. If <VAR>mutable</VAR> is <CODE>#f</CODE>, only +methods for inquiring the database will be available. If the database +cannot be opened as specified <CODE>#f</CODE> is returned. +<P> + +Calling the <CODE>close-base</CODE> (and possibly other) method on a +<VAR>mutable</VAR> database will cause <VAR>filename</VAR> to be written to. +</P> +</DL> +<P> + +<A NAME="IDX1006"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>write-base</B> <I>lldb filename</I> +<DD>Causes the low-level database <VAR>lldb</VAR> to be written to +<VAR>filename</VAR>. If the write is successful, also causes <VAR>lldb</VAR> to +henceforth be associated with <VAR>filename</VAR>. Calling the +<CODE>close-database</CODE> (and possibly other) method on <VAR>lldb</VAR> may +cause <VAR>filename</VAR> to be written to. If <VAR>filename</VAR> is <CODE>#f</CODE> +this database will be changed to a temporary, non-disk based database if +such can be supported by the underlying base table implelentation. If +the operations completed successfully, <CODE>#t</CODE> is returned. +Otherwise, <CODE>#f</CODE> is returned. +</DL> +<P> + +<A NAME="IDX1007"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>sync-base</B> <I>lldb</I> +<DD>Causes the file associated with the low-level database <VAR>lldb</VAR> to be +updated to reflect its current state. If the associated filename is +<CODE>#f</CODE>, no action is taken and <CODE>#f</CODE> is returned. If this +operation completes successfully, <CODE>#t</CODE> is returned. Otherwise, +<CODE>#f</CODE> is returned. +</DL> +<P> + +<A NAME="IDX1008"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>close-base</B> <I>lldb</I> +<DD>Causes the low-level database <VAR>lldb</VAR> to be written to its associated +file (if any). If the write is successful, subsequent operations to +<VAR>lldb</VAR> will signal an error. If the operations complete +successfully, <CODE>#t</CODE> is returned. Otherwise, <CODE>#f</CODE> is returned. +</DL> +<P> + +<A NAME="Base Tables"></A> +<HR SIZE="6"> +<A NAME="SEC168"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC167"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC169"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.2.1.2 Base Tables </H4> +<!--docid::SEC168::--> +<P> + +<A NAME="IDX1009"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-table</B> <I>lldb key-dimension column-types</I> +<DD>Returns the ordinal <VAR>base-id</VAR> for a new base table, otherwise +returns <CODE>#f</CODE>. The base table can then be opened using +<CODE>(open-table <VAR>lldb</VAR> <VAR>base-id</VAR>)</CODE>. The positive integer +<VAR>key-dimension</VAR> is the number of keys composed to make a +<VAR>primary-key</VAR> for this table. The list of symbols +<VAR>column-types</VAR> describes the types of each column. +</DL> +<P> + +<A NAME="IDX1010"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>open-table</B> <I>lldb base-id key-dimension column-types</I> +<DD>Returns a <VAR>handle</VAR> for an existing base table in the low-level +database <VAR>lldb</VAR> if that table exists and can be opened in the mode +indicated by <VAR>mutable</VAR>, otherwise returns <CODE>#f</CODE>. +<P> + +As with <CODE>make-table</CODE>, the positive integer <VAR>key-dimension</VAR> is +the number of keys composed to make a <VAR>primary-key</VAR> for this table. +The list of symbols <VAR>column-types</VAR> describes the types of each +column. +</P> +</DL> +<P> + +<A NAME="IDX1011"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>kill-table</B> <I>lldb base-id key-dimension column-types</I> +<DD>Returns <CODE>#t</CODE> if the base table associated with <VAR>base-id</VAR> was +removed from the low level database <VAR>lldb</VAR>, and <CODE>#f</CODE> otherwise. +</DL> +<P> + +<A NAME="IDX1012"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>catalog-id</B> +<DD>A constant <VAR>base-id</VAR> ordinal suitable for passing as a parameter to +<CODE>open-table</CODE>. <VAR>catalog-id</VAR> will be used as the base table for +the system catalog. +</DL> +<P> + +<A NAME="Base Field Types"></A> +<HR SIZE="6"> +<A NAME="SEC169"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC168"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC170"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.2.1.3 Base Field Types </H4> +<!--docid::SEC169::--> +<P> + +<A NAME="IDX1013"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>supported-type?</B> <I>symbol</I> +<DD>Returns <CODE>#t</CODE> if <VAR>symbol</VAR> names a type allowed as a column +value by the implementation, and <CODE>#f</CODE> otherwise. At a minimum, +an implementation must support the types <CODE>integer</CODE>, +<CODE>ordinal</CODE>, <CODE>symbol</CODE>, <CODE>string</CODE>, and <CODE>boolean</CODE>. +</DL> +<P> + +<A NAME="IDX1014"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>supported-key-type?</B> <I>symbol</I> +<DD>Returns <CODE>#t</CODE> if <VAR>symbol</VAR> names a type allowed as a key value +by the implementation, and <CODE>#f</CODE> otherwise. At a minimum, an +implementation must support the types <CODE>ordinal</CODE>, and +<CODE>symbol</CODE>. +</DL> +<P> + +An <EM>ordinal</EM> is an exact positive integer. The other types are +standard Scheme. +</P> +<P> + +<A NAME="Composite Keys"></A> +<HR SIZE="6"> +<A NAME="SEC170"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC169"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC171"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.2.1.4 Composite Keys </H4> +<!--docid::SEC170::--> +<P> + +<A NAME="IDX1015"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-keyifier-1</B> <I>type</I> +<DD>Returns a procedure which accepts a single argument which must be of +type <VAR>type</VAR>. This returned procedure returns an object suitable for +being a <VAR>key</VAR> argument in the functions whose descriptions follow. +<P> + +Any 2 arguments of the supported type passed to the returned function +which are not <CODE>equal?</CODE> must result in returned values which are not +<CODE>equal?</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1016"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-list-keyifier</B> <I>key-dimension types</I> +<DD>The list of symbols <VAR>types</VAR> must have at least <VAR>key-dimension</VAR> +elements. Returns a procedure which accepts a list of length +<VAR>key-dimension</VAR> and whose types must corresopond to the types named +by <VAR>types</VAR>. This returned procedure combines the elements of its +list argument into an object suitable for being a <VAR>key</VAR> argument in +the functions whose descriptions follow. +<P> + +Any 2 lists of supported types (which must at least include symbols and +non-negative integers) passed to the returned function which are not +<CODE>equal?</CODE> must result in returned values which are not +<CODE>equal?</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1017"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-key-extractor</B> <I>key-dimension types column-number</I> +<DD>Returns a procedure which accepts objects produced by application of the +result of <CODE>(make-list-keyifier <VAR>key-dimension</VAR> <VAR>types</VAR>)</CODE>. +This procedure returns a <VAR>key</VAR> which is <CODE>equal?</CODE> to the +<VAR>column-number</VAR>th element of the list which was passed to create +<VAR>composite-key</VAR>. The list <VAR>types</VAR> must have at least +<VAR>key-dimension</VAR> elements. +</DL> +<P> + +<A NAME="IDX1018"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-key->list</B> <I>key-dimension types</I> +<DD>Returns a procedure which accepts objects produced by application of +the result of <CODE>(make-list-keyifier <VAR>key-dimension</VAR> +<VAR>types</VAR>)</CODE>. This procedure returns a list of <VAR>key</VAR>s which are +elementwise <CODE>equal?</CODE> to the list which was passed to create +<VAR>composite-key</VAR>. +</DL> +<P> + +<A NAME="Base Record Operations"></A> +<HR SIZE="6"> +<A NAME="SEC171"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC170"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC172"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.2.1.5 Base Record Operations </H4> +<!--docid::SEC171::--> +<P> + +In the following functions, the <VAR>key</VAR> argument can always be assumed +to be the value returned by a call to a <EM>keyify</EM> routine. +</P> +<P> + +<A NAME="IDX1019"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>present?</B> <I>handle key</I> +<DD>Returns a non-<CODE>#f</CODE> value if there is a row associated with +<VAR>key</VAR> in the table opened in <VAR>handle</VAR> and <CODE>#f</CODE> otherwise. +</DL> +<P> + +<A NAME="IDX1020"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-getter</B> <I>key-dimension types</I> +<DD>Returns a procedure which takes arguments <VAR>handle</VAR> and <VAR>key</VAR>. +This procedure returns a list of the non-primary values of the relation +(in the base table opened in <VAR>handle</VAR>) whose primary key is +<VAR>key</VAR> if it exists, and <CODE>#f</CODE> otherwise. +</DL> +<P> + +<CODE>make-getter-1</CODE> is a new operation. The relational-database +module works with older base-table implementations by using +<CODE>make-getter</CODE>. +</P> +<P> + +<A NAME="IDX1021"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-getter-1</B> <I>key-dimension types index</I> +<DD>Returns a procedure which takes arguments <VAR>handle</VAR> and <VAR>key</VAR>. +This procedure returns the value of the <VAR>index</VAR>th field (in the +base table opened in <VAR>handle</VAR>) whose primary key is <VAR>key</VAR> if +it exists, and <CODE>#f</CODE> otherwise. +<P> + +<VAR>index</VAR> must be larger than <VAR>key-dimension</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1022"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-putter</B> <I>key-dimension types</I> +<DD>Returns a procedure which takes arguments <VAR>handle</VAR> and <VAR>key</VAR> and +<VAR>value-list</VAR>. This procedure associates the primary key <VAR>key</VAR> +with the values in <VAR>value-list</VAR> (in the base table opened in +<VAR>handle</VAR>) and returns an unspecified value. +</DL> +<P> + +<A NAME="IDX1023"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>delete</B> <I>handle key</I> +<DD>Removes the row associated with <VAR>key</VAR> from the table opened in +<VAR>handle</VAR>. An unspecified value is returned. +</DL> +<P> + +<A NAME="Match Keys"></A> +<HR SIZE="6"> +<A NAME="SEC172"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC171"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC173"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.2.1.6 Match Keys </H4> +<!--docid::SEC172::--> +<P> + +<A NAME="IDX1024"></A> +<A NAME="IDX1025"></A> +<A NAME="IDX1026"></A> +A <VAR>match-keys</VAR> argument is a list of length equal to +the number of primary keys. The <VAR>match-keys</VAR> restrict the actions +of the table command to those records whose primary keys all satisfy the +corresponding element of the <VAR>match-keys</VAR> list. The elements and +their actions are: +</P> +<P> + +<BLOCKQUOTE> +<DL COMPACT> +<DT><CODE>#f</CODE> +<DD>The false value matches any key in the corresponding position. +<DT>an object of type procedure +<DD>This procedure must take a single argument, the key in the corresponding +position. Any key for which the procedure returns a non-false value is +a match; Any key for which the procedure returns a <CODE>#f</CODE> is not. +<DT>other values +<DD>Any other value matches only those keys <CODE>equal?</CODE> to it. +</DL> +</BLOCKQUOTE> +<P> + +<A NAME="Aggregate Base Operations"></A> +<HR SIZE="6"> +<A NAME="SEC173"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC172"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC174"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.2.1.7 Aggregate Base Operations </H4> +<!--docid::SEC173::--> +<P> + +The <VAR>key-dimension</VAR> and <VAR>column-types</VAR> arguments are needed to +decode the composite-keys for matching with <VAR>match-keys</VAR>. +</P> +<P> + +<A NAME="IDX1027"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>delete*</B> <I>handle key-dimension column-types match-keys</I> +<DD>Removes all rows which satisfy <VAR>match-keys</VAR> from the table opened in +<VAR>handle</VAR>. An unspecified value is returned. +</DL> +<P> + +<A NAME="IDX1028"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>for-each-key</B> <I>handle procedure key-dimension column-types match-keys</I> +<DD>Calls <VAR>procedure</VAR> once with each <VAR>key</VAR> in the table opened in +<VAR>handle</VAR> which satisfy <VAR>match-keys</VAR> in an unspecified order. +An unspecified value is returned. +</DL> +<P> + +<A NAME="IDX1029"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>map-key</B> <I>handle procedure key-dimension column-types match-keys</I> +<DD>Returns a list of the values returned by calling <VAR>procedure</VAR> once +with each <VAR>key</VAR> in the table opened in <VAR>handle</VAR> which satisfy +<VAR>match-keys</VAR> in an unspecified order. +</DL> +<P> + +<A NAME="Base ISAM Operations"></A> +<HR SIZE="6"> +<A NAME="SEC174"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC173"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC175"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC166"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 6.2.1.8 Base ISAM Operations </H4> +<!--docid::SEC174::--> +<P> + +These operations are optional for a Base-Table implementation. +</P> +<P> + +<A NAME="IDX1030"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>ordered-for-each-key</B> <I>handle procedure key-dimension column-types match-keys</I> +<DD>Calls <VAR>procedure</VAR> once with each <VAR>key</VAR> in the table opened in +<VAR>handle</VAR> which satisfy <VAR>match-keys</VAR> in the natural order for +the types of the primary key fields of that table. An unspecified value +is returned. +</DL> +<P> + +<A NAME="IDX1031"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-nexter</B> <I>handle key-dimension column-types index</I> +<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which +returns the key-list identifying the lowest record higher than +<VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which is stored in the base-table and +which differs in column <VAR>index</VAR> or a lower indexed key; or false +if no higher record is present. +</DL> +<P> + +<A NAME="IDX1032"></A> +</P> +<DL> +<DT><U>Operation:</U> base-table <B>make-prever</B> <I>handle key-dimension column-types index</I> +<DD>Returns a procedure of arguments <VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which +returns the key-list identifying the highest record less than +<VAR>key1</VAR> <VAR>key2</VAR> <small>...</small> which is stored in the base-table and +which differs in column <VAR>index</VAR> or a lower indexed key; or false +if no higher record is present. +</DL> +<P> + +<A NAME="Catalog Representation"></A> +<HR SIZE="6"> +<A NAME="SEC175"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC174"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC176"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC165"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.2.2 Catalog Representation </H3> +<!--docid::SEC175::--> +<P> + +Each database (in an implementation) has a <EM>system catalog</EM> which +describes all the user accessible tables in that database (including +itself). +</P> +<P> + +The system catalog base table has the following fields. <CODE>PRI</CODE> +indicates a primary key for that table. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>PRI table-name + column-limit the highest column number + coltab-name descriptor table name + bastab-id data base table identifier + user-integrity-rule + view-procedure A scheme thunk which, when called, + produces a handle for the view. coltab + and bastab are specified if and only if + view-procedure is not. +</pre></td></tr></table><P> + +Descriptors for base tables (not views) are tables (pointed to by +system catalog). Descriptor (base) tables have the fields: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>PRI column-number sequential integers from 1 + primary-key? boolean TRUE for primary key components + column-name + column-integrity-rule + domain-name +</pre></td></tr></table><P> + +A <EM>primary key</EM> is any column marked as <CODE>primary-key?</CODE> in the +corresponding descriptor table. All the <CODE>primary-key?</CODE> columns +must have lower column numbers than any non-<CODE>primary-key?</CODE> columns. +Every table must have at least one primary key. Primary keys must be +sufficient to distinguish all rows from each other in the table. All of +the system defined tables have a single primary key. +</P> +<P> + +A <EM>domain</EM> is a category describing the allowable values to occur in +a column. It is described by a (base) table with the fields: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>PRI domain-name + foreign-table + domain-integrity-rule + type-id + type-param +</pre></td></tr></table><P> + +The <EM>type-id</EM> field value is a symbol. This symbol may be used by +the underlying base table implementation in storing that field. +</P> +<P> + +If the <CODE>foreign-table</CODE> field is non-<CODE>#f</CODE> then that field names +a table from the catalog. The values for that domain must match a +primary key of the table referenced by the <VAR>type-param</VAR> (or +<CODE>#f</CODE>, if allowed). This package currently does not support +composite foreign-keys. +</P> +<P> + +The types for which support is planned are: +<TABLE><tr><td> </td><td class=example><pre> atom + symbol + string [<length>] + number [<base>] + money <currency> + date-time + boolean + + foreign-key <table-name> + expression + virtual <expression> +</pre></td></tr></table><P> + +<A NAME="Relational Database Objects"></A> +<HR SIZE="6"> +<A NAME="SEC176"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC175"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC177"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC165"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.2.3 Relational Database Objects </H3> +<!--docid::SEC176::--> +<P> + +This object-oriented interface is deprecated for typical database +applications; <A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A> provides an application programmer +interface which is easier to understand and use. +</P> +<P> + +<A NAME="IDX1033"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-relational-system</B> <I>base-table-implementation</I> +<DD><P> + +Returns a procedure implementing a relational database using the +<VAR>base-table-implementation</VAR>. +</P> +<P> + +All of the operations of a base table implementation are accessed +through a procedure defined by <CODE>require</CODE>ing that implementation. +Similarly, all of the operations of the relational database +implementation are accessed through the procedure returned by +<CODE>make-relational-system</CODE>. For instance, a new relational database +could be created from the procedure returned by +<CODE>make-relational-system</CODE> by: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'alist-table) +<A NAME="IDX1034"></A>(define relational-alist-system + (make-relational-system alist-table)) +(define create-alist-database + (relational-alist-system 'create-database)) +(define my-database + (create-alist-database "mydata.db")) +</pre></td></tr></table></DL> +<P> + +What follows are the descriptions of the methods available from +relational system returned by a call to <CODE>make-relational-system</CODE>. +</P> +<P> + +<A NAME="IDX1035"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-system <B>create-database</B> <I>filename</I> +<DD><P> + +Returns an open, nearly empty relational database associated with +<VAR>filename</VAR>. The only tables defined are the system catalog and +domain table. Calling the <CODE>close-database</CODE> method on this database +and possibly other operations will cause <VAR>filename</VAR> to be written +to. If <VAR>filename</VAR> is <CODE>#f</CODE> a temporary, non-disk based database +will be created if such can be supported by the underlying base table +implelentation. If the database cannot be created as specified +<CODE>#f</CODE> is returned. For the fields and layout of descriptor tables, +<A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A> +</P> +</DL> +<P> + +<A NAME="IDX1036"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-system <B>open-database</B> <I>filename mutable?</I> +<DD><P> + +Returns an open relational database associated with <VAR>filename</VAR>. If +<VAR>mutable?</VAR> is <CODE>#t</CODE>, this database will have methods capable of +effecting change to the database. If <VAR>mutable?</VAR> is <CODE>#f</CODE>, only +methods for inquiring the database will be available. Calling the +<CODE>close-database</CODE> (and possibly other) method on a <VAR>mutable?</VAR> +database will cause <VAR>filename</VAR> to be written to. If the database +cannot be opened as specified <CODE>#f</CODE> is returned. +</P> +</DL> +<P> + +<A NAME="Database Operations"></A> +<HR SIZE="6"> +<A NAME="SEC177"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC176"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC178"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC165"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.2.4 Database Operations </H3> +<!--docid::SEC177::--> +<P> + +This object-oriented interface is deprecated for typical database +applications; <A HREF="slib_6.html#SEC142">6.1.1 Using Databases</A> provides an application programmer +interface which is easier to understand and use. +</P> +<P> + +These are the descriptions of the methods available from an open +relational database. A method is retrieved from a database by calling +the database with the symbol name of the operation. For example: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define my-database + (create-alist-database "mydata.db")) +(define telephone-table-desc + ((my-database 'create-table) 'telephone-table-desc)) +</pre></td></tr></table><P> + +<A NAME="IDX1037"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>close-database</B> +<DD>Causes the relational database to be written to its associated file (if +any). If the write is successful, subsequent operations to this +database will signal an error. If the operations completed +successfully, <CODE>#t</CODE> is returned. Otherwise, <CODE>#f</CODE> is returned. +</DL> +<P> + +<A NAME="IDX1038"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>write-database</B> <I>filename</I> +<DD>Causes the relational database to be written to <VAR>filename</VAR>. If the +write is successful, also causes the database to henceforth be +associated with <VAR>filename</VAR>. Calling the <CODE>close-database</CODE> (and +possibly other) method on this database will cause <VAR>filename</VAR> to be +written to. If <VAR>filename</VAR> is <CODE>#f</CODE> this database will be +changed to a temporary, non-disk based database if such can be supported +by the underlying base table implelentation. If the operations +completed successfully, <CODE>#t</CODE> is returned. Otherwise, <CODE>#f</CODE> is +returned. +</DL> +<P> + +<A NAME="IDX1039"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>sync-database</B> +<DD>Causes any pending updates to the database file to be written out. If +the operations completed successfully, <CODE>#t</CODE> is returned. +Otherwise, <CODE>#f</CODE> is returned. +</DL> +<P> + +<A NAME="IDX1040"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>solidify-database</B> +<DD>Causes any pending updates to the database file to be written out. If +the writes completed successfully, then the database is changed to be +immutable and <CODE>#t</CODE> is returned. Otherwise, <CODE>#f</CODE> is returned. +</DL> +<P> + +<A NAME="IDX1041"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>table-exists?</B> <I>table-name</I> +<DD>Returns <CODE>#t</CODE> if <VAR>table-name</VAR> exists in the system catalog, +otherwise returns <CODE>#f</CODE>. +</DL> +<P> + +<A NAME="IDX1042"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>open-table</B> <I>table-name mutable?</I> +<DD>Returns a <EM>methods</EM> procedure for an existing relational table in +this database if it exists and can be opened in the mode indicated by +<VAR>mutable?</VAR>, otherwise returns <CODE>#f</CODE>. +</DL> +<P> + +These methods will be present only in mutable databases. +</P> +<P> + +<A NAME="IDX1043"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>delete-table</B> <I>table-name</I> +<DD>Removes and returns the <VAR>table-name</VAR> row from the system catalog if +the table or view associated with <VAR>table-name</VAR> gets removed from the +database, and <CODE>#f</CODE> otherwise. +</DL> +<P> + +<A NAME="IDX1044"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>create-table</B> <I>table-desc-name</I> +<DD>Returns a methods procedure for a new (open) relational table for +describing the columns of a new base table in this database, otherwise +returns <CODE>#f</CODE>. For the fields and layout of descriptor tables, +See section <A HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A>. +<P> + +<A NAME="IDX1045"></A> +<DT><U>Operation:</U> relational-database <B>create-table</B> <I>table-name table-desc-name</I> +<DD>Returns a methods procedure for a new (open) relational table with +columns as described by <VAR>table-desc-name</VAR>, otherwise returns +<CODE>#f</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1046"></A> +</P> +<DL> +<DT><U>Operation:</U> relational-database <B>create-view</B> <I>??</I> +<DD><A NAME="IDX1047"></A> +<DT><U>Operation:</U> relational-database <B>project-table</B> <I>??</I> +<DD><A NAME="IDX1048"></A> +<DT><U>Operation:</U> relational-database <B>restrict-table</B> <I>??</I> +<DD><A NAME="IDX1049"></A> +<DT><U>Operation:</U> relational-database <B>cart-prod-tables</B> <I>??</I> +<DD>Not yet implemented. +</DL> +<P> + +<A NAME="Weight-Balanced Trees"></A> +<HR SIZE="6"> +<A NAME="SEC178"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC177"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC179"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 6.3 Weight-Balanced Trees </H2> +<!--docid::SEC178::--> +<P> + +<CODE>(require 'wt-tree)</CODE> +<A NAME="IDX1050"></A> +</P> +<P> + +<A NAME="IDX1051"></A> +<A NAME="IDX1052"></A> +<A NAME="IDX1053"></A> +<A NAME="IDX1054"></A> +Balanced binary trees are a useful data structure for maintaining large +sets of ordered objects or sets of associations whose keys are ordered. +MIT Scheme has an comprehensive implementation of weight-balanced binary +trees which has several advantages over the other data structures for +large aggregates: +</P> +<P> + +<UL> +<LI> +In addition to the usual element-level operations like insertion, +deletion and lookup, there is a full complement of collection-level +operations, like set intersection, set union and subset test, all of +which are implemented with good orders of growth in time and space. +This makes weight balanced trees ideal for rapid prototyping of +functionally derived specifications. +<P> + +</P> +<LI> +An element in a tree may be indexed by its position under the ordering +of the keys, and the ordinal position of an element may be determined, +both with reasonable efficiency. +<P> + +</P> +<LI> +Operations to find and remove minimum element make weight balanced trees +simple to use for priority queues. +<P> + +</P> +<LI> +The implementation is <EM>functional</EM> rather than <EM>imperative</EM>. +This means that operations like `inserting' an association in a tree do +not destroy the old tree, in much the same way that <CODE>(+ 1 x)</CODE> +modifies neither the constant 1 nor the value bound to <CODE>x</CODE>. The +trees are referentially transparent thus the programmer need not worry +about copying the trees. Referential transparency allows space +efficiency to be achieved by sharing subtrees. +<P> + +</UL> +<P> + +These features make weight-balanced trees suitable for a wide range of +applications, especially those that +require large numbers of sets or discrete maps. Applications that have +a few global databases and/or concentrate on element-level operations like +insertion and lookup are probably better off using hash-tables or +red-black trees. +</P> +<P> + +The <EM>size</EM> of a tree is the number of associations that it +contains. Weight balanced binary trees are balanced to keep the sizes +of the subtrees of each node within a constant factor of each other. +This ensures logarithmic times for single-path operations (like lookup +and insertion). A weight balanced tree takes space that is proportional +to the number of associations in the tree. For the current +implementation, the constant of proportionality is six words per +association. +</P> +<P> + +<A NAME="IDX1055"></A> +<A NAME="IDX1056"></A> +<A NAME="IDX1057"></A> +<A NAME="IDX1058"></A> +Weight balanced trees can be used as an implementation for either +discrete sets or discrete maps (associations). Sets are implemented by +ignoring the datum that is associated with the key. Under this scheme +if an associations exists in the tree this indicates that the key of the +association is a member of the set. Typically a value such as +<CODE>()</CODE>, <CODE>#t</CODE> or <CODE>#f</CODE> is associated with the key. +</P> +<P> + +Many operations can be viewed as computing a result that, depending on +whether the tree arguments are thought of as sets or maps, is known by +two different names. An example is <CODE>wt-tree/member?</CODE>, which, when +regarding the tree argument as a set, computes the set membership +operation, but, when regarding the tree as a discrete map, +<CODE>wt-tree/member?</CODE> is the predicate testing if the map is defined at +an element in its domain. Most names in this package have been chosen +based on interpreting the trees as sets, hence the name +<CODE>wt-tree/member?</CODE> rather than <CODE>wt-tree/defined-at?</CODE>. +</P> +<P> + +<A NAME="IDX1059"></A> +<A NAME="IDX1060"></A> +The weight balanced tree implementation is a run-time-loadable option. +To use weight balanced trees, execute +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(load-option 'wt-tree) +</pre></td></tr></table><A NAME="IDX1061"></A> +<P> + +once before calling any of the procedures defined here. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Construction of Weight-Balanced Trees"></A> +<HR SIZE="6"> +<A NAME="SEC179"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC178"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC180"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC178"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.3.1 Construction of Weight-Balanced Trees </H3> +<!--docid::SEC179::--> +<P> + +Binary trees require there to be a total order on the keys used to +arrange the elements in the tree. Weight balanced trees are organized +by <EM>types</EM>, where the type is an object encapsulating the ordering +relation. Creating a tree is a two-stage process. First a tree type +must be created from the predicate which gives the ordering. The tree +type is then used for making trees, either empty or singleton trees or +trees from other aggregate structures like association lists. Once +created, a tree `knows' its type and the type is used to test +compatibility between trees in operations taking two trees. Usually a +small number of tree types are created at the beginning of a program and +used many times throughout the program's execution. +</P> +<P> + +<A NAME="IDX1062"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>make-wt-tree-type</B> <I>key<?</I> +<DD>This procedure creates and returns a new tree type based on the ordering +predicate <VAR>key<?</VAR>. +<VAR>Key<?</VAR> must be a total ordering, having the property that for all +key values <CODE>a</CODE>, <CODE>b</CODE> and <CODE>c</CODE>: +<P> + +<TABLE><tr><td> </td><td class=example><pre>(key<? a a) => #f +(and (key<? a b) (key<? b a)) => #f +(if (and (key<? a b) (key<? b c)) + (key<? a c) + #t) => #t +</pre></td></tr></table><P> + +Two key values are assumed to be equal if neither is less than the other +by <VAR>key<?</VAR>. +</P> +<P> + +Each call to <CODE>make-wt-tree-type</CODE> returns a distinct value, and +trees are only compatible if their tree types are <CODE>eq?</CODE>. A +consequence is that trees that are intended to be used in binary tree +operations must all be created with a tree type originating from the +same call to <CODE>make-wt-tree-type</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1063"></A> +</P> +<DL> +<DT><U>variable+:</U> <B>number-wt-type</B> +<DD>A standard tree type for trees with numeric keys. <CODE>Number-wt-type</CODE> +could have been defined by +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define number-wt-type (make-wt-tree-type <)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1064"></A> +</P> +<DL> +<DT><U>variable+:</U> <B>string-wt-type</B> +<DD>A standard tree type for trees with string keys. <CODE>String-wt-type</CODE> +could have been defined by +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define string-wt-type (make-wt-tree-type string<?)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1065"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>make-wt-tree</B> <I>wt-tree-type</I> +<DD>This procedure creates and returns a newly allocated weight balanced +tree. The tree is empty, i.e. it contains no associations. +<VAR>Wt-tree-type</VAR> is a weight balanced tree type obtained by calling +<CODE>make-wt-tree-type</CODE>; the returned tree has this type. +</DL> +<P> + +<A NAME="IDX1066"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>singleton-wt-tree</B> <I>wt-tree-type key datum</I> +<DD>This procedure creates and returns a newly allocated weight balanced +tree. The tree contains a single association, that of <VAR>datum</VAR> with +<VAR>key</VAR>. <VAR>Wt-tree-type</VAR> is a weight balanced tree type obtained +by calling <CODE>make-wt-tree-type</CODE>; the returned tree has this type. +</DL> +<P> + +<A NAME="IDX1067"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>alist->wt-tree</B> <I>tree-type alist</I> +<DD>Returns a newly allocated weight-balanced tree that contains the same +associations as <VAR>alist</VAR>. This procedure is equivalent to: +<P> + +<TABLE><tr><td> </td><td class=example><pre>(lambda (type alist) + (let ((tree (make-wt-tree type))) + (for-each (lambda (association) + (wt-tree/add! tree + (car association) + (cdr association))) + alist) + tree)) +</pre></td></tr></table></DL> +<P> + +<A NAME="Basic Operations on Weight-Balanced Trees"></A> +<HR SIZE="6"> +<A NAME="SEC180"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC179"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC181"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC178"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.3.2 Basic Operations on Weight-Balanced Trees </H3> +<!--docid::SEC180::--> +<P> + +This section describes the basic tree operations on weight balanced +trees. These operations are the usual tree operations for insertion, +deletion and lookup, some predicates and a procedure for determining the +number of associations in a tree. +</P> +<P> + +<A NAME="IDX1068"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/empty?</B> <I>wt-tree</I> +<DD>Returns <CODE>#t</CODE> if <VAR>wt-tree</VAR> contains no associations, otherwise +returns <CODE>#f</CODE>. +</DL> +<P> + +<A NAME="IDX1069"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/size</B> <I>wt-tree</I> +<DD>Returns the number of associations in <VAR>wt-tree</VAR>, an exact +non-negative integer. This operation takes constant time. +</DL> +<P> + +<A NAME="IDX1070"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/add</B> <I>wt-tree key datum</I> +<DD>Returns a new tree containing all the associations in <VAR>wt-tree</VAR> and +the association of <VAR>datum</VAR> with <VAR>key</VAR>. If <VAR>wt-tree</VAR> already +had an association for <VAR>key</VAR>, the new association overrides the old. +The average and worst-case times required by this operation are +proportional to the logarithm of the number of associations in +<VAR>wt-tree</VAR>. +</DL> +<P> + +<A NAME="IDX1071"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/add!</B> <I>wt-tree key datum</I> +<DD>Associates <VAR>datum</VAR> with <VAR>key</VAR> in <VAR>wt-tree</VAR> and returns an +unspecified value. If <VAR>wt-tree</VAR> already has an association for +<VAR>key</VAR>, that association is replaced. The average and worst-case +times required by this operation are proportional to the logarithm of +the number of associations in <VAR>wt-tree</VAR>. +</DL> +<P> + +<A NAME="IDX1072"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/member?</B> <I>key wt-tree</I> +<DD>Returns <CODE>#t</CODE> if <VAR>wt-tree</VAR> contains an association for +<VAR>key</VAR>, otherwise returns <CODE>#f</CODE>. The average and worst-case +times required by this operation are proportional to the logarithm of +the number of associations in <VAR>wt-tree</VAR>. +</DL> +<P> + +<A NAME="IDX1073"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/lookup</B> <I>wt-tree key default</I> +<DD>Returns the datum associated with <VAR>key</VAR> in <VAR>wt-tree</VAR>. If +<VAR>wt-tree</VAR> doesn't contain an association for <VAR>key</VAR>, +<VAR>default</VAR> is returned. The average and worst-case times required by +this operation are proportional to the logarithm of the number of +associations in <VAR>wt-tree</VAR>. +</DL> +<P> + +<A NAME="IDX1074"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/delete</B> <I>wt-tree key</I> +<DD>Returns a new tree containing all the associations in <VAR>wt-tree</VAR>, +except that if <VAR>wt-tree</VAR> contains an association for <VAR>key</VAR>, it +is removed from the result. The average and worst-case times required +by this operation are proportional to the logarithm of the number of +associations in <VAR>wt-tree</VAR>. +</DL> +<P> + +<A NAME="IDX1075"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/delete!</B> <I>wt-tree key</I> +<DD>If <VAR>wt-tree</VAR> contains an association for <VAR>key</VAR> the association +is removed. Returns an unspecified value. The average and worst-case +times required by this operation are proportional to the logarithm of +the number of associations in <VAR>wt-tree</VAR>. +</DL> +<P> + +<A NAME="Advanced Operations on Weight-Balanced Trees"></A> +<HR SIZE="6"> +<A NAME="SEC181"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC180"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC182"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC178"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.3.3 Advanced Operations on Weight-Balanced Trees </H3> +<!--docid::SEC181::--> +<P> + +In the following the <EM>size</EM> of a tree is the number of associations +that the tree contains, and a <EM>smaller</EM> tree contains fewer +associations. +</P> +<P> + +<A NAME="IDX1076"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/split<</B> <I>wt-tree bound</I> +<DD>Returns a new tree containing all and only the associations in +<VAR>wt-tree</VAR> which have a key that is less than <VAR>bound</VAR> in the +ordering relation of the tree type of <VAR>wt-tree</VAR>. The average and +worst-case times required by this operation are proportional to the +logarithm of the size of <VAR>wt-tree</VAR>. +</DL> +<P> + +<A NAME="IDX1077"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/split></B> <I>wt-tree bound</I> +<DD>Returns a new tree containing all and only the associations in +<VAR>wt-tree</VAR> which have a key that is greater than <VAR>bound</VAR> in the +ordering relation of the tree type of <VAR>wt-tree</VAR>. The average and +worst-case times required by this operation are proportional to the +logarithm of size of <VAR>wt-tree</VAR>. +</DL> +<P> + +<A NAME="IDX1078"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/union</B> <I>wt-tree-1 wt-tree-2</I> +<DD>Returns a new tree containing all the associations from both trees. +This operation is asymmetric: when both trees have an association for +the same key, the returned tree associates the datum from <VAR>wt-tree-2</VAR> +with the key. Thus if the trees are viewed as discrete maps then +<CODE>wt-tree/union</CODE> computes the map override of <VAR>wt-tree-1</VAR> by +<VAR>wt-tree-2</VAR>. If the trees are viewed as sets the result is the set +union of the arguments. +The worst-case time required by this operation +is proportional to the sum of the sizes of both trees. +If the minimum key of one tree is greater than the maximum key of +the other tree then the time required is at worst proportional to +the logarithm of the size of the larger tree. +</DL> +<P> + +<A NAME="IDX1079"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/intersection</B> <I>wt-tree-1 wt-tree-2</I> +<DD>Returns a new tree containing all and only those associations from +<VAR>wt-tree-1</VAR> which have keys appearing as the key of an association +in <VAR>wt-tree-2</VAR>. Thus the associated data in the result are those +from <VAR>wt-tree-1</VAR>. If the trees are being used as sets the result is +the set intersection of the arguments. As a discrete map operation, +<CODE>wt-tree/intersection</CODE> computes the domain restriction of +<VAR>wt-tree-1</VAR> to (the domain of) <VAR>wt-tree-2</VAR>. +The time required by this operation is never worse that proportional to +the sum of the sizes of the trees. +</DL> +<P> + +<A NAME="IDX1080"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/difference</B> <I>wt-tree-1 wt-tree-2</I> +<DD>Returns a new tree containing all and only those associations from +<VAR>wt-tree-1</VAR> which have keys that <EM>do not</EM> appear as the key of +an association in <VAR>wt-tree-2</VAR>. If the trees are viewed as sets the +result is the asymmetric set difference of the arguments. As a discrete +map operation, it computes the domain restriction of <VAR>wt-tree-1</VAR> to +the complement of (the domain of) <VAR>wt-tree-2</VAR>. +The time required by this operation is never worse that proportional to +the sum of the sizes of the trees. +</DL> +<P> + +<A NAME="IDX1081"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/subset?</B> <I>wt-tree-1 wt-tree-2</I> +<DD>Returns <CODE>#t</CODE> iff the key of each association in <VAR>wt-tree-1</VAR> is +the key of some association in <VAR>wt-tree-2</VAR>, otherwise returns <CODE>#f</CODE>. +Viewed as a set operation, <CODE>wt-tree/subset?</CODE> is the improper subset +predicate. +A proper subset predicate can be constructed: +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define (proper-subset? s1 s2) + (and (wt-tree/subset? s1 s2) + (< (wt-tree/size s1) (wt-tree/size s2)))) +</pre></td></tr></table><P> + +As a discrete map operation, <CODE>wt-tree/subset?</CODE> is the subset +test on the domain(s) of the map(s). In the worst-case the time +required by this operation is proportional to the size of +<VAR>wt-tree-1</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1082"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/set-equal?</B> <I>wt-tree-1 wt-tree-2</I> +<DD>Returns <CODE>#t</CODE> iff for every association in <VAR>wt-tree-1</VAR> there is +an association in <VAR>wt-tree-2</VAR> that has the same key, and <EM>vice +versa</EM>. +<P> + +Viewing the arguments as sets <CODE>wt-tree/set-equal?</CODE> is the set +equality predicate. As a map operation it determines if two maps are +defined on the same domain. +</P> +<P> + +This procedure is equivalent to +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(lambda (wt-tree-1 wt-tree-2) + (and (wt-tree/subset? wt-tree-1 wt-tree-2 + (wt-tree/subset? wt-tree-2 wt-tree-1))) +</pre></td></tr></table><P> + +In the worst-case the time required by this operation is proportional to +the size of the smaller tree. +</P> +</DL> +<P> + +<A NAME="IDX1083"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/fold</B> <I>combiner initial wt-tree</I> +<DD>This procedure reduces <VAR>wt-tree</VAR> by combining all the associations, +using an reverse in-order traversal, so the associations are visited in +reverse order. <VAR>Combiner</VAR> is a procedure of three arguments: a key, +a datum and the accumulated result so far. Provided <VAR>combiner</VAR> +takes time bounded by a constant, <CODE>wt-tree/fold</CODE> takes time +proportional to the size of <VAR>wt-tree</VAR>. +<P> + +A sorted association list can be derived simply: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(wt-tree/fold (lambda (key datum list) + (cons (cons key datum) list)) + '() + <VAR>wt-tree</VAR>)) +</pre></td></tr></table><P> + +The data in the associations can be summed like this: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(wt-tree/fold (lambda (key datum sum) (+ sum datum)) + 0 + <VAR>wt-tree</VAR>) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1084"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/for-each</B> <I>action wt-tree</I> +<DD>This procedure traverses the tree in-order, applying <VAR>action</VAR> to +each association. +The associations are processed in increasing order of their keys. +<VAR>Action</VAR> is a procedure of two arguments which take the key and +datum respectively of the association. +Provided <VAR>action</VAR> takes time bounded by a constant, +<CODE>wt-tree/for-each</CODE> takes time proportional to in the size of +<VAR>wt-tree</VAR>. +The example prints the tree: +<P> + +<TABLE><tr><td> </td><td class=example><pre>(wt-tree/for-each (lambda (key value) + (display (list key value))) + <VAR>wt-tree</VAR>)) +</pre></td></tr></table></DL> +<P> + +<A NAME="Indexing Operations on Weight-Balanced Trees"></A> +<HR SIZE="6"> +<A NAME="SEC182"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC181"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC178"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 6.3.4 Indexing Operations on Weight-Balanced Trees </H3> +<!--docid::SEC182::--> +<P> + +Weight balanced trees support operations that view the tree as sorted +sequence of associations. Elements of the sequence can be accessed by +position, and the position of an element in the sequence can be +determined, both in logarthmic time. +</P> +<P> + +<A NAME="IDX1085"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/index</B> <I>wt-tree index</I> +<DD><A NAME="IDX1086"></A> +<DT><U>procedure+:</U> <B>wt-tree/index-datum</B> <I>wt-tree index</I> +<DD><A NAME="IDX1087"></A> +<DT><U>procedure+:</U> <B>wt-tree/index-pair</B> <I>wt-tree index</I> +<DD>Returns the 0-based <VAR>index</VAR>th association of <VAR>wt-tree</VAR> in the +sorted sequence under the tree's ordering relation on the keys. +<CODE>wt-tree/index</CODE> returns the <VAR>index</VAR>th key, +<CODE>wt-tree/index-datum</CODE> returns the datum associated with the +<VAR>index</VAR>th key and <CODE>wt-tree/index-pair</CODE> returns a new pair +<CODE>(<VAR>key</VAR> . <VAR>datum</VAR>)</CODE> which is the <CODE>cons</CODE> of the +<VAR>index</VAR>th key and its datum. The average and worst-case times +required by this operation are proportional to the logarithm of the +number of associations in the tree. +<P> + +These operations signal an error if the tree is empty, if +<VAR>index</VAR><CODE><0</CODE>, or if <VAR>index</VAR> is greater than or equal to the +number of associations in the tree. +</P> +<P> + +Indexing can be used to find the median and maximum keys in the tree as +follows: +</P> +</DL> +<P> + +<TABLE><tr><td> </td><td class=example><pre>median: (wt-tree/index <VAR>wt-tree</VAR> (quotient (wt-tree/size <VAR>wt-tree</VAR>) 2)) + +maximum: (wt-tree/index <VAR>wt-tree</VAR> (-1+ (wt-tree/size <VAR>wt-tree</VAR>))) +</pre></td></tr></table><P> + +<A NAME="IDX1088"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/rank</B> <I>wt-tree key</I> +<DD>Determines the 0-based position of <VAR>key</VAR> in the sorted sequence of +the keys under the tree's ordering relation, or <CODE>#f</CODE> if the tree +has no association with for <VAR>key</VAR>. This procedure returns either an +exact non-negative integer or <CODE>#f</CODE>. The average and worst-case +times required by this operation are proportional to the logarithm of +the number of associations in the tree. +</DL> +<P> + +<A NAME="IDX1089"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/min</B> <I>wt-tree</I> +<DD><A NAME="IDX1090"></A> +<DT><U>procedure+:</U> <B>wt-tree/min-datum</B> <I>wt-tree</I> +<DD><A NAME="IDX1091"></A> +<DT><U>procedure+:</U> <B>wt-tree/min-pair</B> <I>wt-tree</I> +<DD>Returns the association of <VAR>wt-tree</VAR> that has the least key under +the tree's ordering relation. <CODE>wt-tree/min</CODE> returns the least key, +<CODE>wt-tree/min-datum</CODE> returns the datum associated with the least key +and <CODE>wt-tree/min-pair</CODE> returns a new pair <CODE>(key . datum)</CODE> +which is the <CODE>cons</CODE> of the minimum key and its datum. The average +and worst-case times required by this operation are proportional to the +logarithm of the number of associations in the tree. +<P> + +These operations signal an error if the tree is empty. +They could be written +<TABLE><tr><td> </td><td class=example><pre>(define (wt-tree/min tree) (wt-tree/index tree 0)) +(define (wt-tree/min-datum tree) (wt-tree/index-datum tree 0)) +(define (wt-tree/min-pair tree) (wt-tree/index-pair tree 0)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1092"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/delete-min</B> <I>wt-tree</I> +<DD>Returns a new tree containing all of the associations in <VAR>wt-tree</VAR> +except the association with the least key under the <VAR>wt-tree</VAR>'s +ordering relation. An error is signalled if the tree is empty. The +average and worst-case times required by this operation are proportional +to the logarithm of the number of associations in the tree. This +operation is equivalent to +<P> + +<TABLE><tr><td> </td><td class=example><pre>(wt-tree/delete <VAR>wt-tree</VAR> (wt-tree/min <VAR>wt-tree</VAR>)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1093"></A> +</P> +<DL> +<DT><U>procedure+:</U> <B>wt-tree/delete-min!</B> <I>wt-tree</I> +<DD>Removes the association with the least key under the <VAR>wt-tree</VAR>'s +ordering relation. An error is signalled if the tree is empty. The +average and worst-case times required by this operation are proportional +to the logarithm of the number of associations in the tree. This +operation is equivalent to +<P> + +<TABLE><tr><td> </td><td class=example><pre>(wt-tree/delete! <VAR>wt-tree</VAR> (wt-tree/min <VAR>wt-tree</VAR>)) +</pre></td></tr></table></DL> +<P> + +<A NAME="Other Packages"></A> +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_7.html b/slib_7.html new file mode 100644 index 0000000..932a042 --- /dev/null +++ b/slib_7.html @@ -0,0 +1,8218 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Other Packages</TITLE> + +<META NAME="description" CONTENT="SLIB: Other Packages"> +<META NAME="keywords" CONTENT="SLIB: Other Packages"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC183"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC182"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_6.html#SEC140"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1> 7. Other Packages </H1> +<!--docid::SEC183::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC184">7.1 Data Structures</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Various data structures.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC207">7.2 Sorting and Searching</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC225">7.3 Procedures</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Miscellaneous utility procedures.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC235">7.4 Standards Support</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Support for Scheme Standards.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC263">7.5 Session Support</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">REPL and Debugging.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC269">7.6 System Interface</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'system, 'getenv, and other programs.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC276">7.7 Extra-SLIB Packages</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Outside the envelope.</TD></TR> +</TABLE> +<P> + +<A NAME="Data Structures"></A> +<HR SIZE="6"> +<A NAME="SEC184"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC185"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 7.1 Data Structures </H2> +<!--docid::SEC184::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'array</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'subarray</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'array-for-each</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'alist</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'byte</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'byte-number</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'matfile</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'pnm</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'collect</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'dynamic</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'hash-table</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC197">7.1.12 Macroless Object System</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'object</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'priority-queue</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC205">7.1.17 Queues</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'queue</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC206">7.1.18 Records</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'record</TD></TR> +</TABLE> +<P> + +<A NAME="Arrays"></A> +<HR SIZE="6"> +<A NAME="SEC185"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC186"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.1 Arrays </H3> +<!--docid::SEC185::--> +<P> + +<CODE>(require 'array)</CODE> +<A NAME="IDX1094"></A> +</P> +<P> + +<A NAME="IDX1095"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array?</B> <I>obj</I> +<DD><P> + +Returns <CODE>#t</CODE> if the <VAR>obj</VAR> is an array, and <CODE>#f</CODE> if not. +</P> +</DL> +<EM>Note:</EM> Arrays are not disjoint from other Scheme types. Strings +and vectors also satisfy <CODE>array?</CODE>. A disjoint array predicate can +be written: +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define (strict-array? obj) + (and (array? obj) (not (string? obj)) (not (vector? obj)))) +</pre></td></tr></table><P> + +<A NAME="IDX1096"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array=?</B> <I>array1 array2</I> +<DD><P> + +Returns <CODE>#t</CODE> if <VAR>array1</VAR> and <VAR>array2</VAR> have the same rank and shape and the +corresponding elements of <VAR>array1</VAR> and <VAR>array2</VAR> are <CODE>equal?</CODE>. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(array=? (create-array '#(foo) 3 3) + (create-array '#(foo) '(0 2) '(0 2))) + => #t +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1097"></A> +</P> +<DL> +<DT><U>Function:</U> <B>create-array</B> <I>prototype bound1 bound2 <small>...</small></I> +<DD><P> + +Creates and returns an array of type <VAR>prototype</VAR> with dimensions <VAR>bound1</VAR>, <VAR>bound2</VAR>, +<small>...</small> and filled with elements from <VAR>prototype</VAR>. <VAR>prototype</VAR> must be an array, +vector, or string. The implementation-dependent type of the returned +array will be the same as the type of <VAR>prototype</VAR>; except if that would be a +vector or string with non-zero origin, in which case some variety of +array will be returned. +</P> +<P> + +If the <VAR>prototype</VAR> has no elements, then the initial contents of the returned +array are unspecified. Otherwise, the returned array will be filled +with the element at the origin of <VAR>prototype</VAR>. +</P> +</DL> +These functions return a prototypical uniform-array enclosing the +optional argument (which must be of the correct type). If the +uniform-array type is supported by the implementation, then it is +returned; defaulting to the next larger precision type; resorting +finally to vector. +<P> + +<A NAME="IDX1098"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ac64</B> <I>z</I> +<DD><P> + +<A NAME="IDX1099"></A> +<DT><U>Function:</U> <B>ac64</B> +<DD>Returns a high-precision complex uniform-array prototype. +</P> +</DL> +<P> + +<A NAME="IDX1100"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ac32</B> <I>z</I> +<DD><P> + +<A NAME="IDX1101"></A> +<DT><U>Function:</U> <B>ac32</B> +<DD>Returns a complex uniform-array prototype. +</P> +</DL> +<P> + +<A NAME="IDX1102"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ar64</B> <I>x</I> +<DD><P> + +<A NAME="IDX1103"></A> +<DT><U>Function:</U> <B>ar64</B> +<DD>Returns a high-precision real uniform-array prototype. +</P> +</DL> +<P> + +<A NAME="IDX1104"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ar32</B> <I>x</I> +<DD><P> + +<A NAME="IDX1105"></A> +<DT><U>Function:</U> <B>ar32</B> +<DD>Returns a real uniform-array prototype. +</P> +</DL> +<P> + +<A NAME="IDX1106"></A> +</P> +<DL> +<DT><U>Function:</U> <B>as64</B> <I>n</I> +<DD><P> + +<A NAME="IDX1107"></A> +<DT><U>Function:</U> <B>as64</B> +<DD>Returns an exact signed integer uniform-array prototype with at least +64 bits of precision. +</P> +</DL> +<P> + +<A NAME="IDX1108"></A> +</P> +<DL> +<DT><U>Function:</U> <B>as32</B> <I>n</I> +<DD><P> + +<A NAME="IDX1109"></A> +<DT><U>Function:</U> <B>as32</B> +<DD>Returns an exact signed integer uniform-array prototype with at least +32 bits of precision. +</P> +</DL> +<P> + +<A NAME="IDX1110"></A> +</P> +<DL> +<DT><U>Function:</U> <B>as16</B> <I>n</I> +<DD><P> + +<A NAME="IDX1111"></A> +<DT><U>Function:</U> <B>as16</B> +<DD>Returns an exact signed integer uniform-array prototype with at least +16 bits of precision. +</P> +</DL> +<P> + +<A NAME="IDX1112"></A> +</P> +<DL> +<DT><U>Function:</U> <B>as8</B> <I>n</I> +<DD><P> + +<A NAME="IDX1113"></A> +<DT><U>Function:</U> <B>as8</B> +<DD>Returns an exact signed integer uniform-array prototype with at least +8 bits of precision. +</P> +</DL> +<P> + +<A NAME="IDX1114"></A> +</P> +<DL> +<DT><U>Function:</U> <B>au64</B> <I>k</I> +<DD><P> + +<A NAME="IDX1115"></A> +<DT><U>Function:</U> <B>au64</B> +<DD>Returns an exact non-negative integer uniform-array prototype with at +least 64 bits of precision. +</P> +</DL> +<P> + +<A NAME="IDX1116"></A> +</P> +<DL> +<DT><U>Function:</U> <B>au32</B> <I>k</I> +<DD><P> + +<A NAME="IDX1117"></A> +<DT><U>Function:</U> <B>au32</B> +<DD>Returns an exact non-negative integer uniform-array prototype with at +least 32 bits of precision. +</P> +</DL> +<P> + +<A NAME="IDX1118"></A> +</P> +<DL> +<DT><U>Function:</U> <B>au16</B> <I>k</I> +<DD><P> + +<A NAME="IDX1119"></A> +<DT><U>Function:</U> <B>au16</B> +<DD>Returns an exact non-negative integer uniform-array prototype with at +least 16 bits of precision. +</P> +</DL> +<P> + +<A NAME="IDX1120"></A> +</P> +<DL> +<DT><U>Function:</U> <B>au8</B> <I>k</I> +<DD><P> + +<A NAME="IDX1121"></A> +<DT><U>Function:</U> <B>au8</B> +<DD>Returns an exact non-negative integer uniform-array prototype with at +least 8 bits of precision. +</P> +</DL> +<P> + +<A NAME="IDX1122"></A> +</P> +<DL> +<DT><U>Function:</U> <B>at1</B> <I>bool</I> +<DD><P> + +<A NAME="IDX1123"></A> +<DT><U>Function:</U> <B>at1</B> +<DD>Returns a boolean uniform-array prototype. +</P> +</DL> +When constructing an array, <VAR>bound</VAR> is either an inclusive range of +indices expressed as a two element list, or an upper bound expressed as +a single integer. So +<P> + +<TABLE><tr><td> </td><td class=example><pre>(create-array '#(foo) 3 3) == (create-array '#(foo) '(0 2) '(0 2)) +</pre></td></tr></table><P> + +<A NAME="IDX1124"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-shared-array</B> <I>array mapper bound1 bound2 <small>...</small></I> +<DD><P> + +<CODE>make-shared-array</CODE> can be used to create shared subarrays of other +arrays. The <VAR>mapper</VAR> is a function that translates coordinates in +the new array into coordinates in the old array. A <VAR>mapper</VAR> must be +linear, and its range must stay within the bounds of the old array, but +it can be otherwise arbitrary. A simple example: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define fred (create-array '#(#f) 8 8)) +(define freds-diagonal + (make-shared-array fred (lambda (i) (list i i)) 8)) +(array-set! freds-diagonal 'foo 3) +(array-ref fred 3 3) + => FOO +(define freds-center + (make-shared-array fred (lambda (i j) (list (+ 3 i) (+ 3 j))) + 2 2)) +(array-ref freds-center 0 0) + => FOO +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1125"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array-rank</B> <I>obj</I> +<DD><P> + +Returns the number of dimensions of <VAR>obj</VAR>. If <VAR>obj</VAR> is not an array, 0 is +returned. +</P> +</DL> +<P> + +<A NAME="IDX1126"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array-shape</B> <I>array</I> +<DD><P> + +Returns a list of inclusive bounds. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(array-shape (create-array '#() 3 5)) + => ((0 2) (0 4)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1127"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array-dimensions</B> <I>array</I> +<DD><P> + +<CODE>array-dimensions</CODE> is similar to <CODE>array-shape</CODE> but replaces +elements with a 0 minimum with one greater than the maximum. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(array-dimensions (create-array '#() 3 5)) + => (3 5) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1128"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array-in-bounds?</B> <I>array index1 index2 <small>...</small></I> +<DD><P> + +Returns <CODE>#t</CODE> if its arguments would be acceptable to +<CODE>array-ref</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1129"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array-ref</B> <I>array index1 index2 <small>...</small></I> +<DD><P> + +Returns the (<VAR>index1</VAR>, <VAR>index2</VAR>, <small>...</small>) element of <VAR>array</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1130"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>array-set!</B> <I>array obj index1 index2 <small>...</small></I> +<DD><P> + +Stores <VAR>obj</VAR> in the (<VAR>index1</VAR>, <VAR>index2</VAR>, <small>...</small>) element of <VAR>array</VAR>. The value returned +by <CODE>array-set!</CODE> is unspecified. +</P> +</DL> +<P> + +<A NAME="Subarrays"></A> +<HR SIZE="6"> +<A NAME="SEC186"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC185"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC187"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.2 Subarrays </H3> +<!--docid::SEC186::--> +<P> + +<CODE>(require 'subarray)</CODE> +<A NAME="IDX1131"></A> +</P> +<P> + +<A NAME="IDX1132"></A> +</P> +<DL> +<DT><U>Function:</U> <B>subarray</B> <I>array select <small>...</small></I> +<DD><P> + +selects a subset of an array. For <VAR>array</VAR> of rank n, there must be at least +n <VAR>selects</VAR> arguments. For 0 <= <I>j</I> < n, <VAR>selects</VAR><I>j</I> is either an integer, a +list of two integers within the range for the <I>j</I>th index, or #f. +</P> +<P> + +When <VAR>selects</VAR><I>j</I> is a list of two integers, then the <I>j</I>th index is +restricted to that subrange in the returned array. +</P> +<P> + +When <VAR>selects</VAR><I>j</I> is #f, then the full range of the <I>j</I>th index is +accessible in the returned array. An elided argument is equivalent to #f. +</P> +<P> + +When <VAR>selects</VAR><I>j</I> is an integer, then the rank of the returned array is +less than <VAR>array</VAR>, and only elements whose <I>j</I>th index equals <VAR>selects</VAR><I>j</I> are +shared. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>> (define ra '#2A((a b c) (d e f))) +#<unspecified> +> (subarray ra 0 #f) +#1A(a b c) +> (subarray ra 1 #f) +#1A(d e f) +> (subarray ra #f 1) +#1A(b e) +> (subarray ra '(0 1) #f) +#2A((a b c) (d e f)) +> (subarray ra #f '(0 1)) +#2A((a b) (d e)) +> (subarray ra #f '(1 2)) +#2A((b c) (e f)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1133"></A> +</P> +<DL> +<DT><U>Function:</U> <B>subarray0</B> <I>array select <small>...</small></I> +<DD><P> + +Behaves like subarray, but aligns the returned array origin to +0 <small>...</small>. +</P> +</DL> +<P> + +<A NAME="IDX1134"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array-align</B> <I>array coord <small>...</small></I> +<DD><P> + +Returns an array shared with <VAR>array</VAR> but with a different origin. The <VAR>coords</VAR> +are the exact integer coordinates of the new origin. Indexes +corresponding to missing or #f coordinates are not realigned. +</P> +<P> + +For example: +<TABLE><tr><td> </td><td class=example><pre>(define ra2 (create-array '#(5) '(5 9) '(-4 0))) +(array-shape ra2) => ((5 9) (-4 0)) +(array-shape (array-align ra2 0 0)) => ((0 4) (0 4)) +(array-shape (array-align ra2 0)) => ((0 4) (-4 0)) +(array-shape (array-align ra2)) => ((5 9) (-4 0)) +(array-shape (array-align ra2 0 #f)) => ((0 4) (-4 0)) +(array-shape (array-align ra2 #f 0)) => ((5 9) (0 4)) +</pre></td></tr></table></DL> + +<A NAME="IDX1135"></A> +<DL> +<DT><U>Function:</U> <B>array-trim</B> <I>array trim <small>...</small></I> +<DD><P> + +Returns a subarray sharing contents with <VAR>array</VAR> except for slices removed +from either side of each dimension. Each of the <VAR>trims</VAR> is an exact +integer indicating how much to trim. A positive <VAR>s</VAR> trims the +data from the lower end and reduces the upper bound of the result; a +negative <VAR>s</VAR> trims from the upper end and increases the lower +bound. +</P> +<P> + +For example: +<TABLE><tr><td> </td><td class=example><pre>(array-trim '#(0 1 2 3 4) 1) => #1A(1 2 3 4) ;; shape is ((0 3)) +(array-trim '#(0 1 2 3 4) -1) => #1A(0 1 2 3) ;; shape is ((1 4)) + +(require 'array-for-each) +(define (centered-difference ra) + (array-map - (array-trim ra 1) (array-trim ra -1))) +(define (forward-difference ra) + (array-map - (array-trim ra 1) ra)) +(define (backward-difference ra) + (array-map - ra (array-trim ra -1))) + +(centered-difference '#(0 1 3 5 9 22)) + => #1A(3 4 6 17) ;;shape is ((1 4)) +(backward-difference '#(0 1 3 5 9 22)) + => #1A(1 2 2 4 13) ;; shape is ((1 5)) +(forward-difference '#(0 1 3 5 9 22)) + => #(1 2 2 4 13) ;; shape is ((0 4)) +</pre></td></tr></table></DL> +<P> + +<A NAME="Array Mapping"></A> +<HR SIZE="6"> +<A NAME="SEC187"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC186"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC188"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.3 Array Mapping </H3> +<!--docid::SEC187::--> +<P> + +<CODE>(require 'array-for-each)</CODE> +<A NAME="IDX1136"></A> +</P> +<P> + +<A NAME="IDX1137"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>array-map!</B> <I>array0 proc array1 <small>...</small></I> +<DD><P> + +<VAR>array1</VAR>, <small>...</small> must have the same number of dimensions as +<VAR>array0</VAR> and have a range for each index which includes the range +for the corresponding index in <VAR>array0</VAR>. <VAR>proc</VAR> is applied to +each tuple of elements of <VAR>array1</VAR> <small>...</small> and the result is stored +as the corresponding element in <VAR>array0</VAR>. The value returned is +unspecified. The order of application is unspecified. +</P> +</DL> +<P> + +<A NAME="IDX1138"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array-map</B> <I>prototype proc array1 array2 <small>...</small></I> +<DD><P> + +<VAR>array2</VAR>, <small>...</small> must have the same number of dimensions as +<VAR>array1</VAR> and have a range for each index which includes the +range for the corresponding index in <VAR>array1</VAR>. <VAR>proc</VAR> is +applied to each tuple of elements of <VAR>array1</VAR>, <VAR>array2</VAR>, +<small>...</small> and the result is stored as the corresponding element in a +new array of type <VAR>prototype</VAR>. The new array is returned. The +order of application is unspecified. +</P> +</DL> +<P> + +<A NAME="IDX1139"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array-for-each</B> <I>proc array0 <small>...</small></I> +<DD><P> + +<VAR>proc</VAR> is applied to each tuple of elements of <VAR>array0</VAR> <small>...</small> +in row-major order. The value returned is unspecified. +</P> +</DL> +<P> + +<A NAME="IDX1140"></A> +</P> +<DL> +<DT><U>Function:</U> <B>array-indexes</B> <I>array</I> +<DD><P> + +Returns an array of lists of indexes for <VAR>array</VAR> such that, if +<VAR>li</VAR> is a list of indexes for which <VAR>array</VAR> is defined, +(equal? <VAR>li</VAR> (apply array-ref (array-indexes <VAR>array</VAR>) +<VAR>li</VAR>)). +</P> +</DL> +<P> + +<A NAME="IDX1141"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>array-index-map!</B> <I>array proc</I> +<DD><P> + +applies <VAR>proc</VAR> to the indices of each element of <VAR>array</VAR> in +turn, storing the result in the corresponding element. The value +returned and the order of application are unspecified. +</P> +<P> + +One can implement <VAR>array-indexes</VAR> as +<TABLE><tr><td> </td><td class=example><pre>(define (array-indexes array) + (let ((ra (apply create-array '#() (array-shape array)))) + (array-index-map! ra (lambda x x)) + ra)) +</pre></td></tr></table>Another example: +<TABLE><tr><td> </td><td class=example><pre>(define (apl:index-generator n) + (let ((v (make-vector n 1))) + (array-index-map! v (lambda (i) i)) + v)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1142"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>array-copy!</B> <I>source destination</I> +<DD><P> + +Copies every element from vector or array <VAR>source</VAR> to the +corresponding element of <VAR>destination</VAR>. <VAR>destination</VAR> must +have the same rank as <VAR>source</VAR>, and be at least as large in each +dimension. The order of copying is unspecified. +</P> +</DL> +<P> + +<A NAME="Association Lists"></A> +<HR SIZE="6"> +<A NAME="SEC188"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC187"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC189"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.4 Association Lists </H3> +<!--docid::SEC188::--> +<P> + +<CODE>(require 'alist)</CODE> +<A NAME="IDX1143"></A> +</P> +<P> + +Alist functions provide utilities for treating a list of key-value pairs +as an associative database. These functions take an equality predicate, +<VAR>pred</VAR>, as an argument. This predicate should be repeatable, +symmetric, and transitive. +</P> +<P> + +Alist functions can be used with a secondary index method such as hash +tables for improved performance. +</P> +<P> + +<A NAME="IDX1144"></A> +</P> +<DL> +<DT><U>Function:</U> <B>predicate->asso</B> <I>pred</I> +<DD><P> + +Returns an <EM>association function</EM> (like <CODE>assq</CODE>, <CODE>assv</CODE>, or +<A NAME="IDX1145"></A> +<CODE>assoc</CODE>) corresponding to <VAR>pred</VAR>. The returned function +returns a key-value pair whose key is <CODE>pred</CODE>-equal to its first +argument or <CODE>#f</CODE> if no key in the alist is <VAR>pred</VAR>-equal to the +first argument. +</P> +</DL> +<P> + +<A NAME="IDX1146"></A> +</P> +<DL> +<DT><U>Function:</U> <B>alist-inquirer</B> <I>pred</I> +<DD><P> + +Returns a procedure of 2 arguments, <VAR>alist</VAR> and <VAR>key</VAR>, which +returns the value associated with <VAR>key</VAR> in <VAR>alist</VAR> or <CODE>#f</CODE> if +<VAR>key</VAR> does not appear in <VAR>alist</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1147"></A> +</P> +<DL> +<DT><U>Function:</U> <B>alist-associator</B> <I>pred</I> +<DD><P> + +Returns a procedure of 3 arguments, <VAR>alist</VAR>, <VAR>key</VAR>, and +<VAR>value</VAR>, which returns an alist with <VAR>key</VAR> and <VAR>value</VAR> +associated. Any previous value associated with <VAR>key</VAR> will be +lost. This returned procedure may or may not have side effects on its +<VAR>alist</VAR> argument. An example of correct usage is: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define put (alist-associator string-ci=?)) +(define alist '()) +(set! alist (put alist "Foo" 9)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1148"></A> +</P> +<DL> +<DT><U>Function:</U> <B>alist-remover</B> <I>pred</I> +<DD><P> + +Returns a procedure of 2 arguments, <VAR>alist</VAR> and <VAR>key</VAR>, which +returns an alist with an association whose <VAR>key</VAR> is key removed. +This returned procedure may or may not have side effects on its +<VAR>alist</VAR> argument. An example of correct usage is: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define rem (alist-remover string-ci=?)) +(set! alist (rem alist "foo")) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1149"></A> +</P> +<DL> +<DT><U>Function:</U> <B>alist-map</B> <I>proc alist</I> +<DD><P> + +Returns a new association list formed by mapping <VAR>proc</VAR> over the +keys and values of <VAR>alist</VAR>. <VAR>proc</VAR> must be a function of 2 +arguments which returns the new value part. +</P> +</DL> +<P> + +<A NAME="IDX1150"></A> +</P> +<DL> +<DT><U>Function:</U> <B>alist-for-each</B> <I>proc alist</I> +<DD><P> + +Applies <VAR>proc</VAR> to each pair of keys and values of <VAR>alist</VAR>. +<VAR>proc</VAR> must be a function of 2 arguments. The returned value is +unspecified. +</P> +</DL> +<P> + +<A NAME="Byte"></A> +<HR SIZE="6"> +<A NAME="SEC189"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC188"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC190"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.5 Byte </H3> +<!--docid::SEC189::--> +<P> + +<CODE>(require 'byte)</CODE> +<A NAME="IDX1151"></A> +</P> +<P> + +Some algorithms are expressed in terms of arrays of small integers. +Using Scheme strings to implement these arrays is not portable vis-a-vis +the correspondence between integers and characters and non-ascii +character sets. These functions abstract the notion of a <EM>byte</EM>. +<A NAME="IDX1152"></A> +<A NAME="IDX1153"></A> +</P> +<P> + +<A NAME="IDX1154"></A> +</P> +<DL> +<DT><U>Function:</U> <B>byte-ref</B> <I>bytes k</I> +<DD><P> + +<VAR>k</VAR> must be a valid index of <VAR>bytes</VAR>. <CODE>byte-ref</CODE> returns byte <VAR>k</VAR> of <VAR>bytes</VAR> using +zero-origin indexing. +</P> +</DL> +<P> + +<A NAME="IDX1155"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>byte-set!</B> <I>bytes k byte</I> +<DD><P> + +<VAR>k</VAR> must be a valid index of <VAR>bytes</VAR>, and <VAR>byte</VAR> must be a small +nonnegative integer. <CODE>byte-set!</CODE> stores <VAR>byte</VAR> in element <VAR>k</VAR> of <VAR>bytes</VAR> and +returns an unspecified value. +</P> +</DL> +<P> + +<A NAME="IDX1156"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-bytes</B> <I>k byte</I> +<DD><P> + +<A NAME="IDX1157"></A> +<DT><U>Function:</U> <B>make-bytes</B> <I>k</I> +<DD><CODE>make-bytes</CODE> returns a newly allocated byte-array of length <VAR>k</VAR>. If <VAR>byte</VAR> is +given, then all elements of the byte-array are initialized to <VAR>byte</VAR>, +otherwise the contents of the byte-array are unspecified. +</P> +</DL> +<P> + +<A NAME="IDX1158"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bytes-length</B> <I>bytes</I> +<DD><P> + +<CODE>bytes-length</CODE> returns length of byte-array <VAR>bytes</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1159"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bytes</B> <I>byte <small>...</small></I> +<DD><P> + +Returns a newly allocated byte-array composed of the small +nonnegative arguments. +</P> +</DL> +<P> + +<A NAME="IDX1160"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bytes->list</B> <I>bytes</I> +<DD><P> + +<CODE>bytes->list</CODE> returns a newly allocated list of the bytes that make up the +given byte-array. +</P> +</DL> +<P> + +<A NAME="IDX1161"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list->bytes</B> <I>bytes</I> +<DD><P> + +<CODE>list->bytes</CODE> returns a newly allocated byte-array formed from the small +nonnegative integers in the list <VAR>bytes</VAR>. +</P> +</DL> +<CODE>Bytes->list</CODE> and <CODE>list->bytes</CODE> are inverses so far as +<CODE>equal?</CODE> is concerned. +<A NAME="IDX1162"></A> +<P> + +<A NAME="IDX1163"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bytes-copy</B> <I>bytes</I> +<DD><P> + +Returns a newly allocated copy of the given <VAR>bytes</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1164"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>bytes-reverse!</B> <I>bytes</I> +<DD><P> + +Reverses the order of byte-array <VAR>bytes</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1165"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bytes-reverse</B> <I>bytes</I> +<DD><P> + +Returns a newly allocated bytes-array consisting of the elements of +<VAR>bytes</VAR> in reverse order. +</P> +</DL> +<A NAME="IDX1166"></A> +Input and output of bytes should be with ports opened in <EM>binary</EM> +<A NAME="IDX1167"></A> +mode (see section <A HREF="slib_2.html#SEC16">2.3 Input/Output</A>). Calling <CODE>open-file</CODE> with 'rb or +<A NAME="IDX1168"></A> +'wb modes argument will return a binary port if the Scheme +implementation supports it. +<P> + +<A NAME="IDX1169"></A> +</P> +<DL> +<DT><U>Function:</U> <B>write-byte</B> <I>byte port</I> +<DD><P> + +<A NAME="IDX1170"></A> +<DT><U>Function:</U> <B>write-byte</B> <I>byte</I> +<DD>Writes the byte <VAR>byte</VAR> (not an external representation of the byte) to +the given <VAR>port</VAR> and returns an unspecified value. The <VAR>port</VAR> argument may +be omitted, in which case it defaults to the value returned by +<CODE>current-output-port</CODE>. +<A NAME="IDX1171"></A> +</P> +</DL> +<P> + +<A NAME="IDX1172"></A> +</P> +<DL> +<DT><U>Function:</U> <B>read-byte</B> <I>port</I> +<DD><P> + +<A NAME="IDX1173"></A> +<DT><U>Function:</U> <B>read-byte</B> +<DD>Returns the next byte available from the input <VAR>port</VAR>, updating the <VAR>port</VAR> +to point to the following byte. If no more bytes are available, an +end-of-file object is returned. <VAR>port</VAR> may be omitted, in which case it +defaults to the value returned by <CODE>current-input-port</CODE>. +<A NAME="IDX1174"></A> +</P> +</DL> +When reading and writing binary numbers with <CODE>read-bytes</CODE> and +<CODE>write-bytes</CODE>, the sign of the length argument determines the +endianness (order) of bytes. Positive treats them as big-endian, +the first byte input or output is highest order. Negative treats +them as little-endian, the first byte input or output is the lowest +order. +<P> + +Once read in, SLIB treats byte sequences as big-endian. The +multi-byte sequences produced and used by number conversion routines +see section <A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A> are always big-endian. +</P> +<P> + +<A NAME="IDX1175"></A> +</P> +<DL> +<DT><U>Function:</U> <B>read-bytes</B> <I>n port</I> +<DD><P> + +<A NAME="IDX1176"></A> +<DT><U>Function:</U> <B>read-bytes</B> <I>n</I> +<DD><CODE>read-bytes</CODE> returns a newly allocated bytes-array filled with +<CODE>(abs <VAR>n</VAR>)</CODE> bytes read from <VAR>port</VAR>. If <VAR>n</VAR> is positive, then +the first byte read is stored at index 0; otherwise the last byte +read is stored at index 0. Note that the length of the returned +string will be less than <CODE>(abs <VAR>n</VAR>)</CODE> if <VAR>port</VAR> reaches +end-of-file. +</P> +<P> + +<VAR>port</VAR> may be omitted, in which case it defaults to the value returned +by <CODE>current-input-port</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1177"></A> +</P> +<DL> +<DT><U>Function:</U> <B>write-bytes</B> <I>bytes n port</I> +<DD><P> + +<A NAME="IDX1178"></A> +<DT><U>Function:</U> <B>write-bytes</B> <I>bytes n</I> +<DD><CODE>write-bytes</CODE> writes <CODE>(abs <VAR>n</VAR>)</CODE> bytes to output-port <VAR>port</VAR>. If <VAR>n</VAR> is +positive, then the first byte written is index 0 of <VAR>bytes</VAR>; otherwise +the last byte written is index 0 of <VAR>bytes</VAR>. <CODE>write-bytes</CODE> returns an unspecified +value. +</P> +<P> + +<VAR>port</VAR> may be omitted, in which case it defaults to the value returned +by <CODE>current-output-port</CODE>. +</P> +</DL> +<CODE>substring-read!</CODE> and <CODE>substring-write</CODE> provide +lower-level procedures for reading and writing blocks of bytes. The +relative size of <VAR>start</VAR> and <VAR>end</VAR> determines the order of +writing. +<P> + +<A NAME="IDX1179"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>substring-read!</B> <I>string start end port</I> +<DD><P> + +<A NAME="IDX1180"></A> +<DT><U>Procedure:</U> <B>substring-read!</B> <I>string start end</I> +<DD>Fills <VAR>string</VAR> with up to <CODE>(abs (- <VAR>start</VAR> <VAR>end</VAR>))</CODE> bytes +read from <VAR>port</VAR>. The first byte read is stored at index <VAR>string</VAR>. +<CODE>substring-read!</CODE> returns the number of bytes read. +</P> +<P> + +<VAR>port</VAR> may be omitted, in which case it defaults to the value returned +by <CODE>current-input-port</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1181"></A> +</P> +<DL> +<DT><U>Function:</U> <B>substring-write</B> <I>string start end port</I> +<DD><P> + +<A NAME="IDX1182"></A> +<DT><U>Function:</U> <B>substring-write</B> <I>string start end</I> +<DD><CODE>substring-write</CODE> writes <CODE>(abs (- <VAR>start</VAR> <VAR>end</VAR>))</CODE> bytes to +output-port <VAR>port</VAR>. The first byte written is index <VAR>start</VAR> of <VAR>string</VAR>. <CODE>substring-write</CODE> +returns the number of bytes written. +</P> +<P> + +<VAR>port</VAR> may be omitted, in which case it defaults to the value returned +by <CODE>current-output-port</CODE>. +</P> +</DL> +<P> + +<A NAME="Byte/Number Conversions"></A> +<HR SIZE="6"> +<A NAME="SEC190"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC189"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC192"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.6 Byte/Number Conversions </H3> +<!--docid::SEC190::--> +<P> + +<CODE>(require 'byte-number)</CODE> +<A NAME="IDX1183"></A> +</P> +<P> + +The multi-byte sequences produced and used by numeric conversion +routines are always big-endian. Endianness can be changed during +reading and writing bytes using <CODE>read-bytes</CODE> and +<CODE>write-bytes</CODE> See section <A HREF="slib_7.html#SEC189">read-bytes</A>. +</P> +<P> + +The sign of the length argument to bytes/integer conversion +procedures determines the signedness of the number. +</P> +<P> + +<A NAME="IDX1184"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bytes->integer</B> <I>bytes n</I> +<DD><P> + +Converts the first <CODE>(abs <VAR>n</VAR>)</CODE> bytes of big-endian <VAR>bytes</VAR> array +to an integer. If <VAR>n</VAR> is negative then the integer coded by the +bytes are treated as two's-complement (can be negative). +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(bytes->integer (bytes 0 0 0 15) -4) => 15 +(bytes->integer (bytes 0 0 0 15) 4) => 15 +(bytes->integer (bytes 255 255 255 255) -4) => -1 +(bytes->integer (bytes 255 255 255 255) 4) => 4294967295 +(bytes->integer (bytes 128 0 0 0) -4) => -2147483648 +(bytes->integer (bytes 128 0 0 0) 4) => 2147483648 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1185"></A> +</P> +<DL> +<DT><U>Function:</U> <B>integer->bytes</B> <I>n len</I> +<DD><P> + +Converts the integer <VAR>n</VAR> to a byte-array of <CODE>(abs <VAR>n</VAR>)</CODE> +bytes. If <VAR>n</VAR> and <VAR>len</VAR> are both negative, then the bytes in the +returned array are coded two's-complement. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(bytes->list (integer->bytes 15 -4)) => (0 0 0 15) +(bytes->list (integer->bytes 15 4)) => (0 0 0 15) +(bytes->list (integer->bytes -1 -4)) => (255 255 255 255) +(bytes->list (integer->bytes 4294967295 4)) => (255 255 255 255) +(bytes->list (integer->bytes -2147483648 -4)) => (128 0 0 0) +(bytes->list (integer->bytes 2147483648 4)) => (128 0 0 0) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1186"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bytes->ieee-float</B> <I>bytes</I> +<DD><P> + +<VAR>bytes</VAR> must be a 4-element byte-array. <CODE>bytes->ieee-float</CODE> calculates and returns the +value of <VAR>bytes</VAR> interpreted as a big-endian IEEE 4-byte (32-bit) number. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(bytes->ieee-float (bytes #x40 0 0 0)) => 2.0 +(bytes->ieee-float (bytes #x40 #xd0 0 0)) => 6.5 +(bytes->ieee-float (bytes #xc0 #xd0 0 0)) => -6.5 + +(bytes->ieee-float (bytes 0 #x80 0 0)) => 11.754943508222875e-39 +(bytes->ieee-float (bytes 0 #x40 0 0)) => 5.877471754111437e-39 +(bytes->ieee-float (bytes 0 0 0 1)) => 1.401298464324817e-45 + +(bytes->ieee-float (bytes #xff #x80 0 0)) => -1/0 +(bytes->ieee-float (bytes #x7f #x80 0 0)) => 1/0 +(bytes->ieee-float (bytes #x7f #x80 0 1)) => 0/0 +</pre></td></tr></table><P> + +<A NAME="IDX1187"></A> +</P> +<DL> +<DT><U>Function:</U> <B>bytes->ieee-double</B> <I>bytes</I> +<DD><P> + +<VAR>bytes</VAR> must be a 8-element byte-array. <CODE>bytes->ieee-double</CODE> calculates and returns the +value of <VAR>bytes</VAR> interpreted as a big-endian IEEE 8-byte (64-bit) number. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(bytes->ieee-double (bytes 0 0 0 0 0 0 0 0)) => 0.0 +(bytes->ieee-double (bytes #x40 0 0 0 0 0 0 0)) => 2 +(bytes->ieee-double (bytes #x40 #x1A 0 0 0 0 0 0)) => 6.5 +(bytes->ieee-double (bytes #xC0 #x1A 0 0 0 0 0 0)) => -6.5 + +(bytes->ieee-double (bytes 0 8 0 0 0 0 0 0)) => 11.125369292536006e-309 +(bytes->ieee-double (bytes 0 4 0 0 0 0 0 0)) => 5.562684646268003e-309 +(bytes->ieee-double (bytes 0 0 0 0 0 0 0 1)) => 4.0e-324 + +(bytes->ieee-double (bytes #xFF #xF0 0 0 0 0 0 0)) => -1/0 +(bytes->ieee-double (bytes #x7F #xF0 0 0 0 0 0 0)) => 1/0 +(bytes->ieee-double (bytes #x7F #xF8 0 0 0 0 0 0)) => 0/0 +</pre></td></tr></table><P> + +<A NAME="IDX1188"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ieee-float->bytes</B> <I>x</I> +<DD><P> + +Returns a 4-element byte-array encoding the IEEE single-precision +floating-point of <VAR>x</VAR>. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(bytes->list (ieee-float->bytes 2.0)) => (64 0 0 0) +(bytes->list (ieee-float->bytes 6.5)) => (64 208 0 0) +(bytes->list (ieee-float->bytes -6.5)) => (192 208 0 0) + +(bytes->list (ieee-float->bytes 11.754943508222875e-39)) => ( 0 128 0 0) +(bytes->list (ieee-float->bytes 5.877471754111438e-39)) => ( 0 64 0 0) +(bytes->list (ieee-float->bytes 1.401298464324817e-45)) => ( 0 0 0 1) + +(bytes->list (ieee-float->bytes -1/0)) => (255 128 0 0) +(bytes->list (ieee-float->bytes 1/0)) => (127 128 0 0) +(bytes->list (ieee-float->bytes 0/0)) => (127 128 0 1) +</pre></td></tr></table><P> + +<A NAME="IDX1189"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ieee-double->bytes</B> <I>x</I> +<DD><P> + +Returns a 8-element byte-array encoding the IEEE double-precision +floating-point of <VAR>x</VAR>. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(bytes->list (ieee-double->bytes 2.0)) => (64 0 0 0 0 0 0 0) +(bytes->list (ieee-double->bytes 6.5)) => (64 26 0 0 0 0 0 0) +(bytes->list (ieee-double->bytes -6.5)) => (192 26 0 0 0 0 0 0) + +(bytes->list (ieee-double->bytes 11.125369292536006e-309)) + => ( 0 8 0 0 0 0 0 0) +(bytes->list (ieee-double->bytes 5.562684646268003e-309)) + => ( 0 4 0 0 0 0 0 0) +(bytes->list (ieee-double->bytes 4.0e-324)) + => ( 0 0 0 0 0 0 0 1) + +(bytes->list (ieee-double->bytes -1/0)) => (255 240 0 0 0 0 0 0) +(bytes->list (ieee-double->bytes 1/0)) => (127 240 0 0 0 0 0 0) +(bytes->list (ieee-double->bytes 0/0)) => (127 248 0 0 0 0 0 0) +</pre></td></tr></table><P> + +<A NAME="SEC191"></A> +<H4> Byte Collation Order </H4> +<!--docid::SEC191::--> +<P> + +The <CODE>string<?</CODE> ordering of big-endian byte-array +representations of fixed and IEEE floating-point numbers agrees with +the numerical ordering only when those numbers are non-negative. +</P> +<P> + +Straighforward modification of these formats can extend the +byte-collating order to work for their entire ranges. This +agreement enables the full range of numbers as keys in +<EM>indexed-sequential-access-method</EM> databases. +<A NAME="IDX1190"></A> +</P> +<P> + +<A NAME="IDX1191"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>integer-byte-collate!</B> <I>byte-vector</I> +<DD><P> + +Modifies sign bit of <VAR>byte-vector</VAR> so that <CODE>string<?</CODE> ordering of +two's-complement byte-vectors matches numerical order. <CODE>integer-byte-collate!</CODE> returns +<VAR>byte-vector</VAR> and is its own functional inverse. +</P> +</DL> +<P> + +<A NAME="IDX1192"></A> +</P> +<DL> +<DT><U>Function:</U> <B>integer-byte-collate</B> <I>byte-vector</I> +<DD><P> + +Returns copy of <VAR>byte-vector</VAR> with sign bit modified so that <CODE>string<?</CODE> +ordering of two's-complement byte-vectors matches numerical order. +<CODE>integer-byte-collate</CODE> is its own functional inverse. +</P> +</DL> +<P> + +<A NAME="IDX1193"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>ieee-byte-collate!</B> <I>byte-vector</I> +<DD><P> + +Modifies <VAR>byte-vector</VAR> so that <CODE>string<?</CODE> ordering of IEEE floating-point +byte-vectors matches numerical order. <CODE>ieee-byte-collate!</CODE> returns <VAR>byte-vector</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1194"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>ieee-byte-decollate!</B> <I>byte-vector</I> +<DD><P> + +Given <VAR>byte-vector</VAR> modified by <CODE>IEEE-byte-collate!</CODE>, reverses the <VAR>byte-vector</VAR> +modifications. +</P> +</DL> +<P> + +<A NAME="IDX1195"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ieee-byte-collate</B> <I>byte-vector</I> +<DD><P> + +Returns copy of <VAR>byte-vector</VAR> encoded so that <CODE>string<?</CODE> ordering of IEEE +floating-point byte-vectors matches numerical order. +</P> +</DL> +<P> + +<A NAME="IDX1196"></A> +</P> +<DL> +<DT><U>Function:</U> <B>ieee-byte-decollate</B> <I>byte-vector</I> +<DD><P> + +Given <VAR>byte-vector</VAR> returned by <CODE>IEEE-byte-collate</CODE>, reverses the <VAR>byte-vector</VAR> +modifications. +</P> +</DL> +<P> + +<A NAME="MAT-File Format"></A> +<HR SIZE="6"> +<A NAME="SEC192"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC190"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC193"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.7 MAT-File Format </H3> +<!--docid::SEC192::--> +<P> + +<CODE>(require 'matfile)</CODE> +<A NAME="IDX1197"></A> +<A NAME="IDX1198"></A> +</P> +<P> + +<A HREF="http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/matfile_format.pdf">http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/matfile_format.pdf</A> +</P> +<P> + +This package reads MAT-File Format version 4 (MATLAB) binary data +files. MAT-files written from big-endian or little-endian computers +having IEEE format numbers are currently supported. Support for files +written from VAX or Cray machines could also be added. +</P> +<P> + +The numeric and text matrix types handled; support for <EM>sparse</EM> +<A NAME="IDX1199"></A> +matrices awaits a sample file. +</P> +<P> + +<A NAME="IDX1200"></A> +</P> +<DL> +<DT><U>Function:</U> <B>matfile:read</B> <I>filename</I> +<DD><VAR>filename</VAR> should be a string naming an existing file containing a +MATLAB Version 4 MAT-File. The <CODE>matfile:read</CODE> procedure reads matrices from the +file and returns a list of the results; a list of the name string and +array for each matrix. +</DL> +<P> + +<A NAME="IDX1201"></A> +</P> +<DL> +<DT><U>Function:</U> <B>matfile:load</B> <I>filename</I> +<DD><VAR>filename</VAR> should be a string naming an existing file containing a +MATLAB Version 4 MAT-File. The <CODE>matfile:load</CODE> procedure reads matrices from the +file and defines the <CODE>string-ci->symbol</CODE> for each matrix to its +corresponding array. <CODE>matfile:load</CODE> returns a list of the symbols defined. +</DL> +<P> + +<A NAME="Portable Image Files"></A> +<HR SIZE="6"> +<A NAME="SEC193"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC192"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC194"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.8 Portable Image Files </H3> +<!--docid::SEC193::--> +<P> + +<CODE>(require 'pnm)</CODE> +<A NAME="IDX1202"></A> +</P> +<P> + +<A NAME="IDX1203"></A> +</P> +<DL> +<DT><U>Function:</U> <B>pnm:type-dimensions</B> <I>path</I> +<DD><P> + +The string <VAR>path</VAR> must name a <EM>portable bitmap graphics</EM> file. +<A NAME="IDX1204"></A> +<CODE>pnm:type-dimensions</CODE> returns a list of 4 items: +<OL> +<LI> +A symbol describing the type of the file named by <VAR>path</VAR>. +<LI> +The image width in pixels. +<LI> +The image height in pixels. +<LI> +The maximum value of pixels assume in the file. +</OL> +<P> + +The current set of file-type symbols is: +</P> +<DL COMPACT> +<DT>pbm +<DD><DT>pbm-raw +<DD><A NAME="IDX1205"></A> +<A NAME="IDX1206"></A> +Black-and-White image; pixel values are 0 or 1. +<DT>pgm +<DD><DT>pgm-raw +<DD><A NAME="IDX1207"></A> +<A NAME="IDX1208"></A> +Gray (monochrome) image; pixel values are from 0 to <VAR>maxval</VAR> +specified in file header. +<DT>ppm +<DD><DT>ppm-raw +<DD><A NAME="IDX1209"></A> +<A NAME="IDX1210"></A> +RGB (full color) image; red, green, and blue interleaved pixel values +are from 0 to <VAR>maxval</VAR> +</DL> +</DL> +<P> + +<A NAME="IDX1211"></A> +</P> +<DL> +<DT><U>Function:</U> <B>pnm:image-file->array</B> <I>path array</I> +<DD><P> + +Reads the <EM>portable bitmap graphics</EM> file named by <VAR>path</VAR> into +<A NAME="IDX1212"></A> +<VAR>array</VAR>. <VAR>array</VAR> must be the correct size and type for +<VAR>path</VAR>. <VAR>array</VAR> is returned. +</P> +<P> + +<A NAME="IDX1213"></A> +<DT><U>Function:</U> <B>pnm:image-file->array</B> <I>path</I> +<DD></P> +<P> + +<CODE>pnm:image-file->array</CODE> creates and returns an array with the +<EM>portable bitmap graphics</EM> file named by <VAR>path</VAR> read into it. +<A NAME="IDX1214"></A> +</P> +</DL> +<P> + +<A NAME="IDX1215"></A> +</P> +<DL> +<DT><U>Function:</U> <B>pnm:array-write</B> <I>type array maxval path comment <small>...</small></I> +<DD><P> + +Writes the contents of <VAR>array</VAR> to a <VAR>type</VAR> image file named <VAR>path</VAR>. The file +will have pixel values between 0 and <VAR>maxval</VAR>, which must be compatible +with <VAR>type</VAR>. For `<SAMP>pbm</SAMP>' files, <VAR>maxval</VAR> must be `<SAMP>1</SAMP>'. +<VAR>comment</VAR>s are included in the file header. +</P> +</DL> +<P> + +<A NAME="Collections"></A> +<HR SIZE="6"> +<A NAME="SEC194"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC193"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC195"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.9 Collections </H3> +<!--docid::SEC194::--> +<P> + +<CODE>(require 'collect)</CODE> +<A NAME="IDX1216"></A> +</P> +<P> + +Routines for managing collections. Collections are aggregate data +structures supporting iteration over their elements, similar to the +Dylan(TM) language, but with a different interface. They have +<EM>elements</EM> indexed by corresponding <EM>keys</EM>, although the keys +may be implicit (as with lists). +</P> +<P> + +New types of collections may be defined as YASOS objects (see section <A HREF="slib_3.html#SEC40">3.8 Yasos</A>). +They must support the following operations: +</P> +<P> + +<UL> +<LI> +<CODE>(collection? <VAR>self</VAR>)</CODE> (always returns <CODE>#t</CODE>); +<P> + +</P> +<LI> +<CODE>(size <VAR>self</VAR>)</CODE> returns the number of elements in the collection; +<P> + +</P> +<LI> +<CODE>(print <VAR>self</VAR> <VAR>port</VAR>)</CODE> is a specialized print operation +for the collection which prints a suitable representation on the given +<VAR>port</VAR> or returns it as a string if <VAR>port</VAR> is <CODE>#t</CODE>; +<P> + +</P> +<LI> +<A NAME="IDX1217"></A> +<CODE>(gen-elts <VAR>self</VAR>)</CODE> returns a thunk which on successive +invocations yields elements of <VAR>self</VAR> in order or gives an error if +it is invoked more than <CODE>(size <VAR>self</VAR>)</CODE> times; +<P> + +</P> +<LI> +<A NAME="IDX1218"></A> +<CODE>(gen-keys <VAR>self</VAR>)</CODE> is like <CODE>gen-elts</CODE>, but yields the +collection's keys in order. +</UL> +<P> + +They might support specialized <CODE>for-each-key</CODE> and +<CODE>for-each-elt</CODE> operations. +</P> +<P> + +<A NAME="IDX1219"></A> +</P> +<DL> +<DT><U>Function:</U> <B>collection?</B> <I>obj</I> +<DD>A predicate, true initially of lists, vectors and strings. New sorts of +collections must answer <CODE>#t</CODE> to <CODE>collection?</CODE>. +</DL> +<P> + +<A NAME="IDX1220"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>map-elts</B> <I>proc collection1 <small>...</small></I> +<DD><A NAME="IDX1221"></A> +<DT><U>Procedure:</U> <B>do-elts</B> <I>proc collection1 <small>...</small></I> +<DD><VAR>proc</VAR> is a procedure taking as many arguments as there are +<VAR>collections</VAR> (at least one). The <VAR>collections</VAR> are iterated +over in their natural order and <VAR>proc</VAR> is applied to the elements +yielded by each iteration in turn. The order in which the arguments are +supplied corresponds to te order in which the <VAR>collections</VAR> appear. +<CODE>do-elts</CODE> is used when only side-effects of <VAR>proc</VAR> are of +interest and its return value is unspecified. <CODE>map-elts</CODE> returns a +collection (actually a vector) of the results of the applications of +<VAR>proc</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(map-elts + (list 1 2 3) (vector 1 2 3)) + => #(2 4 6) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1222"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>map-keys</B> <I>proc collection1 <small>...</small></I> +<DD><A NAME="IDX1223"></A> +<DT><U>Procedure:</U> <B>do-keys</B> <I>proc collection1 <small>...</small></I> +<DD>These are analogous to <CODE>map-elts</CODE> and <CODE>do-elts</CODE>, but each +iteration is over the <VAR>collections</VAR>' <EM>keys</EM> rather than their +elements. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(map-keys + (list 1 2 3) (vector 1 2 3)) + => #(0 2 4) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1224"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>for-each-key</B> <I>collection proc</I> +<DD><A NAME="IDX1225"></A> +<DT><U>Procedure:</U> <B>for-each-elt</B> <I>collection proc</I> +<DD>These are like <CODE>do-keys</CODE> and <CODE>do-elts</CODE> but only for a single +collection; they are potentially more efficient. +</DL> +<P> + +<A NAME="IDX1226"></A> +</P> +<DL> +<DT><U>Function:</U> <B>reduce</B> <I>proc seed collection1 <small>...</small></I> +<DD>A generalization of the list-based <CODE>reduce-init</CODE> +(see section <A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A>) to collections which will shadow the +list-based version if <CODE>(require 'collect)</CODE> follows +<A NAME="IDX1227"></A> +<CODE>(require 'common-list-functions)</CODE> (see section <A HREF="slib_7.html#SEC208">7.2.1 Common List Functions</A>). +<A NAME="IDX1228"></A> +<P> + +Examples: +<TABLE><tr><td> </td><td class=example><pre>(reduce + 0 (vector 1 2 3)) + => 6 +(reduce union '() '((a b c) (b c d) (d a))) + => (c b d a). +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1229"></A> +</P> +<DL> +<DT><U>Function:</U> <B>any?</B> <I>pred collection1 <small>...</small></I> +<DD>A generalization of the list-based <CODE>some</CODE> (see section <A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A>) to collections. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(any? odd? (list 2 3 4 5)) + => #t +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1230"></A> +</P> +<DL> +<DT><U>Function:</U> <B>every?</B> <I>pred collection1 <small>...</small></I> +<DD>A generalization of the list-based <CODE>every</CODE> +(see section <A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A>) to collections. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(every? collection? '((1 2) #(1 2))) + => #t +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1231"></A> +</P> +<DL> +<DT><U>Function:</U> <B>empty?</B> <I>collection</I> +<DD>Returns <CODE>#t</CODE> iff there are no elements in <VAR>collection</VAR>. +<P> + +<CODE>(empty? <VAR>collection</VAR>) == (zero? (size <VAR>collection</VAR>))</CODE> +</P> +</DL> +<P> + +<A NAME="IDX1232"></A> +</P> +<DL> +<DT><U>Function:</U> <B>size</B> <I>collection</I> +<DD>Returns the number of elements in <VAR>collection</VAR>. +</DL> +<P> + +<A NAME="IDX1233"></A> +</P> +<DL> +<DT><U>Function:</U> <B>Setter</B> <I>list-ref</I> +<DD>See <A HREF="slib_3.html#SEC43">3.8.3 Setters</A> for a definition of <EM>setter</EM>. N.B. +<CODE>(setter list-ref)</CODE> doesn't work properly for element 0 of a +list. +</DL> +<P> + +Here is a sample collection: <CODE>simple-table</CODE> which is also a +<CODE>table</CODE>. +<TABLE><tr><td> </td><td class=example><pre>(define-predicate TABLE?) +(define-operation (LOOKUP table key failure-object)) +(define-operation (ASSOCIATE! table key value)) ;; returns key +(define-operation (REMOVE! table key)) ;; returns value + +(define (MAKE-SIMPLE-TABLE) + (let ( (table (list)) ) + (object + ;; table behaviors + ((TABLE? self) #t) + ((SIZE self) (size table)) + ((PRINT self port) (format port "#<SIMPLE-TABLE>")) + ((LOOKUP self key failure-object) + (cond + ((assq key table) => cdr) + (else failure-object) + )) + ((ASSOCIATE! self key value) + (cond + ((assq key table) + => (lambda (bucket) (set-cdr! bucket value) key)) + (else + (set! table (cons (cons key value) table)) + key) + )) + ((REMOVE! self key);; returns old value + (cond + ((null? table) (slib:error "TABLE:REMOVE! Key not found: " key)) + ((eq? key (caar table)) + (let ( (value (cdar table)) ) + (set! table (cdr table)) + value) + ) + (else + (let loop ( (last table) (this (cdr table)) ) + (cond + ((null? this) + (slib:error "TABLE:REMOVE! Key not found: " key)) + ((eq? key (caar this)) + (let ( (value (cdar this)) ) + (set-cdr! last (cdr this)) + value) + ) + (else + (loop (cdr last) (cdr this))) + ) ) ) + )) + ;; collection behaviors + ((COLLECTION? self) #t) + ((GEN-KEYS self) (collect:list-gen-elts (map car table))) + ((GEN-ELTS self) (collect:list-gen-elts (map cdr table))) + ((FOR-EACH-KEY self proc) + (for-each (lambda (bucket) (proc (car bucket))) table) + ) + ((FOR-EACH-ELT self proc) + (for-each (lambda (bucket) (proc (cdr bucket))) table) + ) ) ) ) +</pre></td></tr></table><P> + +<A NAME="Dynamic Data Type"></A> +<HR SIZE="6"> +<A NAME="SEC195"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC194"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC196"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.10 Dynamic Data Type </H3> +<!--docid::SEC195::--> +<P> + +<CODE>(require 'dynamic)</CODE> +<A NAME="IDX1234"></A> +</P> +<P> + +<A NAME="IDX1235"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-dynamic</B> <I>obj</I> +<DD>Create and returns a new <EM>dynamic</EM> whose global value is <VAR>obj</VAR>. +</DL> +<P> + +<A NAME="IDX1236"></A> +</P> +<DL> +<DT><U>Function:</U> <B>dynamic?</B> <I>obj</I> +<DD>Returns true if and only if <VAR>obj</VAR> is a dynamic. No object +satisfying <CODE>dynamic?</CODE> satisfies any of the other standard type +predicates. +</DL> +<P> + +<A NAME="IDX1237"></A> +</P> +<DL> +<DT><U>Function:</U> <B>dynamic-ref</B> <I>dyn</I> +<DD>Return the value of the given dynamic in the current dynamic +environment. +</DL> +<P> + +<A NAME="IDX1238"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>dynamic-set!</B> <I>dyn obj</I> +<DD>Change the value of the given dynamic to <VAR>obj</VAR> in the current +dynamic environment. The returned value is unspecified. +</DL> +<P> + +<A NAME="IDX1239"></A> +</P> +<DL> +<DT><U>Function:</U> <B>call-with-dynamic-binding</B> <I>dyn obj thunk</I> +<DD>Invoke and return the value of the given thunk in a new, nested dynamic +environment in which the given dynamic has been bound to a new location +whose initial contents are the value <VAR>obj</VAR>. This dynamic +environment has precisely the same extent as the invocation of the thunk +and is thus captured by continuations created within that invocation and +re-established by those continuations when they are invoked. +</DL> +<P> + +The <CODE>dynamic-bind</CODE> macro is not implemented. +</P> +<P> + +<A NAME="Hash Tables"></A> +<HR SIZE="6"> +<A NAME="SEC196"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC195"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC197"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.11 Hash Tables </H3> +<!--docid::SEC196::--> +<P> + +<CODE>(require 'hash-table)</CODE> +<A NAME="IDX1240"></A> +</P> +<P> + +<A NAME="IDX1241"></A> +</P> +<DL> +<DT><U>Function:</U> <B>predicate->hash</B> <I>pred</I> +<DD><P> + +Returns a hash function (like <CODE>hashq</CODE>, <CODE>hashv</CODE>, or +<CODE>hash</CODE>) corresponding to the equality predicate <VAR>pred</VAR>. +<VAR>pred</VAR> should be <CODE>eq?</CODE>, <CODE>eqv?</CODE>, <CODE>equal?</CODE>, <CODE>=</CODE>, +<CODE>char=?</CODE>, <CODE>char-ci=?</CODE>, <CODE>string=?</CODE>, or +<CODE>string-ci=?</CODE>. +</P> +</DL> +A hash table is a vector of association lists. +<P> + +<A NAME="IDX1242"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-hash-table</B> <I>k</I> +<DD><P> + +Returns a vector of <VAR>k</VAR> empty (association) lists. +</P> +</DL> +Hash table functions provide utilities for an associative database. +These functions take an equality predicate, <VAR>pred</VAR>, as an argument. +<VAR>pred</VAR> should be <CODE>eq?</CODE>, <CODE>eqv?</CODE>, <CODE>equal?</CODE>, <CODE>=</CODE>, +<CODE>char=?</CODE>, <CODE>char-ci=?</CODE>, <CODE>string=?</CODE>, or +<CODE>string-ci=?</CODE>. +<P> + +<A NAME="IDX1243"></A> +</P> +<DL> +<DT><U>Function:</U> <B>predicate->hash-asso</B> <I>pred</I> +<DD><P> + +Returns a hash association function of 2 arguments, <VAR>key</VAR> and +<VAR>hashtab</VAR>, corresponding to <VAR>pred</VAR>. The returned function +returns a key-value pair whose key is <VAR>pred</VAR>-equal to its first +argument or <CODE>#f</CODE> if no key in <VAR>hashtab</VAR> is <VAR>pred</VAR>-equal to +the first argument. +</P> +</DL> +<P> + +<A NAME="IDX1244"></A> +</P> +<DL> +<DT><U>Function:</U> <B>hash-inquirer</B> <I>pred</I> +<DD><P> + +Returns a procedure of 2 arguments, <VAR>hashtab</VAR> and <VAR>key</VAR>, which +returns the value associated with <VAR>key</VAR> in <VAR>hashtab</VAR> or +<CODE>#f</CODE> if <VAR>key</VAR> does not appear in <VAR>hashtab</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1245"></A> +</P> +<DL> +<DT><U>Function:</U> <B>hash-associator</B> <I>pred</I> +<DD><P> + +Returns a procedure of 3 arguments, <VAR>hashtab</VAR>, <VAR>key</VAR>, and +<VAR>value</VAR>, which modifies <VAR>hashtab</VAR> so that <VAR>key</VAR> and +<VAR>value</VAR> associated. Any previous value associated with <VAR>key</VAR> +will be lost. +</P> +</DL> +<P> + +<A NAME="IDX1246"></A> +</P> +<DL> +<DT><U>Function:</U> <B>hash-remover</B> <I>pred</I> +<DD><P> + +Returns a procedure of 2 arguments, <VAR>hashtab</VAR> and <VAR>key</VAR>, which +modifies <VAR>hashtab</VAR> so that the association whose key is <VAR>key</VAR> is +removed. +</P> +</DL> +<P> + +<A NAME="IDX1247"></A> +</P> +<DL> +<DT><U>Function:</U> <B>hash-map</B> <I>proc hash-table</I> +<DD><P> + +Returns a new hash table formed by mapping <VAR>proc</VAR> over the +keys and values of <VAR>hash-table</VAR>. <VAR>proc</VAR> must be a function of 2 +arguments which returns the new value part. +</P> +</DL> +<P> + +<A NAME="IDX1248"></A> +</P> +<DL> +<DT><U>Function:</U> <B>hash-for-each</B> <I>proc hash-table</I> +<DD><P> + +Applies <VAR>proc</VAR> to each pair of keys and values of <VAR>hash-table</VAR>. +<VAR>proc</VAR> must be a function of 2 arguments. The returned value is +unspecified. +</P> +</DL> +<P> + +<A NAME="IDX1249"></A> +</P> +<DL> +<DT><U>Function:</U> <B>hash-rehasher</B> <I>pred</I> +<DD><P> + +<CODE>hash-rehasher</CODE> accepts a hash table predicate and returns a function of two +arguments <VAR>hashtab</VAR> and <VAR>new-k</VAR> which is specialized for +that predicate. +</P> +<P> + +This function is used for nondestrutively resizing a hash table. +<VAR>hashtab</VAR> should be an existing hash-table using <VAR>pred</VAR>, <VAR>new-k</VAR> +is the size of a new hash table to be returned. The new hash table +will have all of the associations of the old hash table. +</P> +</DL> +<P> + +<A NAME="Object"></A> +<HR SIZE="6"> +<A NAME="SEC197"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC196"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC198"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.12 Macroless Object System </H3> +<!--docid::SEC197::--> +<P> + +<CODE>(require 'object)</CODE> +<A NAME="IDX1250"></A> +</P> +<P> + +This is the Macroless Object System written by Wade Humeniuk +(whumeniu@datap.ca). Conceptual Tributes: <A HREF="slib_3.html#SEC40">3.8 Yasos</A>, MacScheme's +%object, CLOS, Lack of R4RS macros. +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC198"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC197"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC199"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.13 Concepts </H3> +<!--docid::SEC198::--> +<DL COMPACT> + +<DT>OBJECT +<DD>An object is an ordered association-list (by <CODE>eq?</CODE>) of methods +(procedures). Methods can be added (<CODE>make-method!</CODE>), deleted +(<CODE>unmake-method!</CODE>) and retrieved (<CODE>get-method</CODE>). Objects may +inherit methods from other objects. The object binds to the environment +it was created in, allowing closures to be used to hide private +procedures and data. +<P> + +</P> +<DT>GENERIC-METHOD +<DD>A generic-method associates (in terms of <CODE>eq?</CODE>) object's method. +This allows scheme function style to be used for objects. The calling +scheme for using a generic method is <CODE>(generic-method object param1 +param2 ...)</CODE>. +<P> + +</P> +<DT>METHOD +<DD>A method is a procedure that exists in the object. To use a method +get-method must be called to look-up the method. Generic methods +implement the get-method functionality. Methods may be added to an +object associated with any scheme obj in terms of eq? +<P> + +</P> +<DT>GENERIC-PREDICATE +<DD>A generic method that returns a boolean value for any scheme obj. +<P> + +</P> +<DT>PREDICATE +<DD>A object's method asscociated with a generic-predicate. Returns +<CODE>#t</CODE>. +</DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC199"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC198"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC200"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.14 Procedures </H3> +<!--docid::SEC199::--> +<P> + +<A NAME="IDX1251"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-object</B> <I>ancestor <small>...</small></I> +<DD>Returns an object. Current object implementation is a tagged vector. +<VAR>ancestor</VAR>s are optional and must be objects in terms of object?. +<VAR>ancestor</VAR>s methods are included in the object. Multiple +<VAR>ancestor</VAR>s might associate the same generic-method with a method. +In this case the method of the <VAR>ancestor</VAR> first appearing in the +list is the one returned by <CODE>get-method</CODE>. +</DL> +<P> + +<A NAME="IDX1252"></A> +</P> +<DL> +<DT><U>Function:</U> <B>object?</B> <I>obj</I> +<DD>Returns boolean value whether <VAR>obj</VAR> was created by make-object. +</DL> +<P> + +<A NAME="IDX1253"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-generic-method</B> <I>exception-procedure</I> +<DD>Returns a procedure which be associated with an object's methods. If +<VAR>exception-procedure</VAR> is specified then it is used to process +non-objects. +</DL> +<P> + +<A NAME="IDX1254"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-generic-predicate</B> +<DD>Returns a boolean procedure for any scheme object. +</DL> +<P> + +<A NAME="IDX1255"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-method!</B> <I>object generic-method method</I> +<DD>Associates <VAR>method</VAR> to the <VAR>generic-method</VAR> in the object. The +<VAR>method</VAR> overrides any previous association with the +<VAR>generic-method</VAR> within the object. Using <CODE>unmake-method!</CODE> +will restore the object's previous association with the +<VAR>generic-method</VAR>. <VAR>method</VAR> must be a procedure. +</DL> +<P> + +<A NAME="IDX1256"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-predicate!</B> <I>object generic-preciate</I> +<DD>Makes a predicate method associated with the <VAR>generic-predicate</VAR>. +</DL> +<P> + +<A NAME="IDX1257"></A> +</P> +<DL> +<DT><U>Function:</U> <B>unmake-method!</B> <I>object generic-method</I> +<DD>Removes an object's association with a <VAR>generic-method</VAR> . +</DL> +<P> + +<A NAME="IDX1258"></A> +</P> +<DL> +<DT><U>Function:</U> <B>get-method</B> <I>object generic-method</I> +<DD>Returns the object's method associated (if any) with the +<VAR>generic-method</VAR>. If no associated method exists an error is +flagged. +</DL> +<P> + +<HR SIZE="6"> +<A NAME="SEC200"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC199"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC201"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.15 Examples </H3> +<!--docid::SEC200::--> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'object) +<A NAME="IDX1259"></A> +(define instantiate (make-generic-method)) + +(define (make-instance-object . ancestors) + (define self (apply make-object + (map (lambda (obj) (instantiate obj)) ancestors))) + (make-method! self instantiate (lambda (self) self)) + self) + +(define who (make-generic-method)) +(define imigrate! (make-generic-method)) +(define emigrate! (make-generic-method)) +(define describe (make-generic-method)) +(define name (make-generic-method)) +(define address (make-generic-method)) +(define members (make-generic-method)) + +(define society + (let () + (define self (make-instance-object)) + (define population '()) + (make-method! self imigrate! + (lambda (new-person) + (if (not (eq? new-person self)) + (set! population (cons new-person population))))) + (make-method! self emigrate! + (lambda (person) + (if (not (eq? person self)) + (set! population + (comlist:remove-if (lambda (member) + (eq? member person)) + population))))) + (make-method! self describe + (lambda (self) + (map (lambda (person) (describe person)) population))) + (make-method! self who + (lambda (self) (map (lambda (person) (name person)) + population))) + (make-method! self members (lambda (self) population)) + self)) + +(define (make-person %name %address) + (define self (make-instance-object society)) + (make-method! self name (lambda (self) %name)) + (make-method! self address (lambda (self) %address)) + (make-method! self who (lambda (self) (name self))) + (make-method! self instantiate + (lambda (self) + (make-person (string-append (name self) "-son-of") + %address))) + (make-method! self describe + (lambda (self) (list (name self) (address self)))) + (imigrate! self) + self) +</pre></td></tr></table><P> + +<HR SIZE="6"> +<A NAME="SEC201"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC200"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC202"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.1.15.1 Inverter Documentation </H4> +<!--docid::SEC201::--> +Inheritance: +<TABLE><tr><td> </td><td class=example><pre> <inverter>::(<number> <description>) +</pre></td></tr></table>Generic-methods +<TABLE><tr><td> </td><td class=example><pre> <inverter>::value => <number>::value + <inverter>::set-value! => <number>::set-value! + <inverter>::describe => <description>::describe + <inverter>::help + <inverter>::invert + <inverter>::inverter? +</pre></td></tr></table><P> + +<HR SIZE="6"> +<A NAME="SEC202"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC201"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC203"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.1.15.2 Number Documention </H4> +<!--docid::SEC202::--> +Inheritance +<TABLE><tr><td> </td><td class=example><pre> <number>::() +</pre></td></tr></table>Slots +<TABLE><tr><td> </td><td class=example><pre> <number>::<x> +</pre></td></tr></table>Generic Methods +<TABLE><tr><td> </td><td class=example><pre> <number>::value + <number>::set-value! +</pre></td></tr></table><P> + +<HR SIZE="6"> +<A NAME="SEC203"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC202"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC204"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.1.15.3 Inverter code </H4> +<!--docid::SEC203::--> +<TABLE><tr><td> </td><td class=example><pre>(require 'object) +<A NAME="IDX1260"></A> +(define value (make-generic-method (lambda (val) val))) +(define set-value! (make-generic-method)) +(define invert (make-generic-method + (lambda (val) + (if (number? val) + (/ 1 val) + (error "Method not supported:" val))))) +(define noop (make-generic-method)) +(define inverter? (make-generic-predicate)) +(define describe (make-generic-method)) +(define help (make-generic-method)) + +(define (make-number x) + (define self (make-object)) + (make-method! self value (lambda (this) x)) + (make-method! self set-value! + (lambda (this new-value) (set! x new-value))) + self) + +(define (make-description str) + (define self (make-object)) + (make-method! self describe (lambda (this) str)) + (make-method! self help (lambda (this) "Help not available")) + self) + +(define (make-inverter) + (let* ((self (make-object + (make-number 1) + (make-description "A number which can be inverted"))) + (<value> (get-method self value))) + (make-method! self invert (lambda (self) (/ 1 (<value> self)))) + (make-predicate! self inverter?) + (unmake-method! self help) + (make-method! self help + (lambda (self) + (display "Inverter Methods:") (newline) + (display " (value inverter) ==> n") (newline))) + self)) + +;;;; Try it out + +(define invert! (make-generic-method)) + +(define x (make-inverter)) + +(make-method! x invert! (lambda (x) (set-value! x (/ 1 (value x))))) + +(value x) => 1 +(set-value! x 33) => undefined +(invert! x) => undefined +(value x) => 1/33 + +(unmake-method! x invert!) => undefined + +(invert! x) error--> ERROR: Method not supported: x +</pre></td></tr></table><P> + +<A NAME="Priority Queues"></A> +<HR SIZE="6"> +<A NAME="SEC204"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC203"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC205"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.16 Priority Queues </H3> +<!--docid::SEC204::--> +<P> + +<CODE>(require 'priority-queue)</CODE> +<A NAME="IDX1261"></A> +</P> +<P> + +This algorithm for priority queues is due to +<CITE>Introduction to Algorithms</CITE> +by T. Cormen, C. Leiserson, R. Rivest. +1989 MIT Press. +</P> +<P> + +<A NAME="IDX1262"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-heap</B> <I>pred<?</I> +<DD><P> + +Returns a binary heap suitable which can be used for priority queue +operations. +</P> +</DL> +<P> + +<A NAME="IDX1263"></A> +</P> +<DL> +<DT><U>Function:</U> <B>heap-length</B> <I>heap</I> +<DD><P> + +Returns the number of elements in <VAR>heap</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1264"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>heap-insert!</B> <I>heap item</I> +<DD><P> + +Inserts <VAR>item</VAR> into <VAR>heap</VAR>. <VAR>item</VAR> can be inserted multiple +times. The value returned is unspecified. +</P> +</DL> +<P> + +<A NAME="IDX1265"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>heap-extract-max!</B> <I>heap</I> +<DD><P> + +Returns the item which is larger than all others according to the +<VAR>pred<?</VAR> argument to <CODE>make-heap</CODE>. If there are no items in +<VAR>heap</VAR>, an error is signaled. +</P> +</DL> +<P> + +<A NAME="Queues"></A> +<HR SIZE="6"> +<A NAME="SEC205"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC204"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC206"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.17 Queues </H3> +<!--docid::SEC205::--> +<P> + +<CODE>(require 'queue)</CODE> +<A NAME="IDX1266"></A> +</P> +<P> + +A <EM>queue</EM> is a list where elements can be added to both the front +<A NAME="IDX1267"></A> +and rear, and removed from the front (i.e., they are what are often +called <EM>dequeues</EM>). A queue may also be used like a stack. +<A NAME="IDX1268"></A> +</P> +<P> + +<A NAME="IDX1269"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-queue</B> +<DD><P> + +Returns a new, empty queue. +</P> +</DL> +<P> + +<A NAME="IDX1270"></A> +</P> +<DL> +<DT><U>Function:</U> <B>queue?</B> <I>obj</I> +<DD><P> + +Returns <CODE>#t</CODE> if <VAR>obj</VAR> is a queue. +</P> +</DL> +<P> + +<A NAME="IDX1271"></A> +</P> +<DL> +<DT><U>Function:</U> <B>queue-empty?</B> <I>q</I> +<DD><P> + +Returns <CODE>#t</CODE> if the queue <VAR>q</VAR> is empty. +</P> +</DL> +<P> + +<A NAME="IDX1272"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>queue-push!</B> <I>q datum</I> +<DD><P> + +Adds <VAR>datum</VAR> to the front of queue <VAR>q</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1273"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>enqueue!</B> <I>q datum</I> +<DD><P> + +Adds <VAR>datum</VAR> to the rear of queue <VAR>q</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1274"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>dequeue!</B> <I>q</I> +<DD><P> + +<A NAME="IDX1275"></A> +<DT><U>Procedure:</U> <B>queue-pop!</B> <I>q</I> +<DD>Both of these procedures remove and return the datum at the front of +the queue. <CODE>queue-pop!</CODE> is used to suggest that the queue is +being used like a stack. +</P> +</DL> +All of the following functions raise an error if the queue <VAR>q</VAR> +is empty. +<P> + +<A NAME="IDX1276"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>dequeue-all!</B> <I>q</I> +<DD><P> + +Removes and returns (the list) of all contents of queue <VAR>q</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1277"></A> +</P> +<DL> +<DT><U>Function:</U> <B>queue-front</B> <I>q</I> +<DD><P> + +Returns the datum at the front of the queue <VAR>q</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1278"></A> +</P> +<DL> +<DT><U>Function:</U> <B>queue-rear</B> <I>q</I> +<DD><P> + +Returns the datum at the rear of the queue <VAR>q</VAR>. +</P> +</DL> +<P> + +<A NAME="Records"></A> +<HR SIZE="6"> +<A NAME="SEC206"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC205"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC184"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.1.18 Records </H3> +<!--docid::SEC206::--> +<P> + +<CODE>(require 'record)</CODE> +<A NAME="IDX1279"></A> +</P> +<P> + +The Record package provides a facility for user to define their own +record data types. +</P> +<P> + +<A NAME="IDX1280"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-record-type</B> <I>type-name field-names</I> +<DD>Returns a <EM>record-type descriptor</EM>, a value representing a new data +type disjoint from all others. The <VAR>type-name</VAR> argument must be a +string, but is only used for debugging purposes (such as the printed +representation of a record of the new type). The <VAR>field-names</VAR> +argument is a list of symbols naming the <EM>fields</EM> of a record of the +new type. It is an error if the list contains any duplicates. It is +unspecified how record-type descriptors are represented. +</DL> +<P> + +<A NAME="IDX1281"></A> +</P> +<DL> +<DT><U>Function:</U> <B>record-constructor</B> <I>rtd [field-names]</I> +<DD>Returns a procedure for constructing new members of the type represented +by <VAR>rtd</VAR>. The returned procedure accepts exactly as many arguments +as there are symbols in the given list, <VAR>field-names</VAR>; these are +used, in order, as the initial values of those fields in a new record, +which is returned by the constructor procedure. The values of any +fields not named in that list are unspecified. The <VAR>field-names</VAR> +argument defaults to the list of field names in the call to +<CODE>make-record-type</CODE> that created the type represented by <VAR>rtd</VAR>; +if the <VAR>field-names</VAR> argument is provided, it is an error if it +contains any duplicates or any symbols not in the default list. +</DL> +<P> + +<A NAME="IDX1282"></A> +</P> +<DL> +<DT><U>Function:</U> <B>record-predicate</B> <I>rtd</I> +<DD>Returns a procedure for testing membership in the type represented by +<VAR>rtd</VAR>. The returned procedure accepts exactly one argument and +returns a true value if the argument is a member of the indicated record +type; it returns a false value otherwise. +</DL> +<P> + +<A NAME="IDX1283"></A> +</P> +<DL> +<DT><U>Function:</U> <B>record-accessor</B> <I>rtd field-name</I> +<DD>Returns a procedure for reading the value of a particular field of a +member of the type represented by <VAR>rtd</VAR>. The returned procedure +accepts exactly one argument which must be a record of the appropriate +type; it returns the current value of the field named by the symbol +<VAR>field-name</VAR> in that record. The symbol <VAR>field-name</VAR> must be a +member of the list of field-names in the call to <CODE>make-record-type</CODE> +that created the type represented by <VAR>rtd</VAR>. +</DL> +<P> + +<A NAME="IDX1284"></A> +</P> +<DL> +<DT><U>Function:</U> <B>record-modifier</B> <I>rtd field-name</I> +<DD>Returns a procedure for writing the value of a particular field of a +member of the type represented by <VAR>rtd</VAR>. The returned procedure +accepts exactly two arguments: first, a record of the appropriate type, +and second, an arbitrary Scheme value; it modifies the field named by +the symbol <VAR>field-name</VAR> in that record to contain the given value. +The returned value of the modifier procedure is unspecified. The symbol +<VAR>field-name</VAR> must be a member of the list of field-names in the call +to <CODE>make-record-type</CODE> that created the type represented by +<VAR>rtd</VAR>. +</DL> +<P> + +In May of 1996, as a product of discussion on the <CODE>rrrs-authors</CODE> +mailing list, I rewrote `<TT>record.scm</TT>' to portably implement type +disjointness for record data types. +</P> +<P> + +As long as an implementation's procedures are opaque and the +<CODE>record</CODE> code is loaded before other programs, this will give +disjoint record types which are unforgeable and incorruptible by R4RS +procedures. +</P> +<P> + +As a consequence, the procedures <CODE>record?</CODE>, +<CODE>record-type-descriptor</CODE>, <CODE>record-type-name</CODE>.and +<CODE>record-type-field-names</CODE> are no longer supported. +</P> +<P> + +<A NAME="Sorting and Searching"></A> +<HR SIZE="6"> +<A NAME="SEC207"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC206"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 7.2 Sorting and Searching </H2> +<!--docid::SEC207::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC208">7.2.1 Common List Functions</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'common-list-functions</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC214">7.2.2 Tree operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'tree</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'chapter-order</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC216">7.2.4 Sorting</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'sort</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Keep your socks on.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC218">7.2.6 Hashing</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'hash</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC219">7.2.7 Space-Filling Curves</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'hilbert and 'sierpinski</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC222">7.2.8 Soundex</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Dimension Reduction of Last Names</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC223">7.2.9 String Search</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Also Search from a Port.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'diff and longest-common-subsequence</TD></TR> +</TABLE> +<P> + +<A NAME="Common List Functions"></A> +<HR SIZE="6"> +<A NAME="SEC208"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC209"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.1 Common List Functions </H3> +<!--docid::SEC208::--> +<P> + +<CODE>(require 'common-list-functions)</CODE> +<A NAME="IDX1285"></A> +</P> +<P> + +The procedures below follow the Common LISP equivalents apart from +optional arguments in some cases. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC209">7.2.1.1 List construction</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="List construction"></A> +<HR SIZE="6"> +<A NAME="SEC209"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC210"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.2.1.1 List construction </H4> +<!--docid::SEC209::--> +<P> + +<A NAME="IDX1286"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-list</B> <I>k</I> +<DD><A NAME="IDX1287"></A> +<DT><U>Function:</U> <B>make-list</B> <I>k init</I> +<DD><CODE>make-list</CODE> creates and returns a list of <VAR>k</VAR> elements. If +<VAR>init</VAR> is included, all elements in the list are initialized to +<VAR>init</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(make-list 3) + => (#<unspecified> #<unspecified> #<unspecified>) +(make-list 5 'foo) + => (foo foo foo foo foo) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1288"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list*</B> <I>obj1 obj2 <small>...</small></I> +<DD>Works like <CODE>list</CODE> except that the cdr of the last pair is the last +argument unless there is only one argument, when the result is just that +argument. Sometimes called <CODE>cons*</CODE>. E.g.: +<P> + +<TABLE><tr><td> </td><td class=example><pre>(list* 1) + => 1 +(list* 1 2 3) + => (1 2 . 3) +(list* 1 2 '(3 4)) + => (1 2 3 4) +(list* <VAR>args</VAR> '()) + == (list <VAR>args</VAR>) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1289"></A> +</P> +<DL> +<DT><U>Function:</U> <B>copy-list</B> <I>lst</I> +<DD><CODE>copy-list</CODE> makes a copy of <VAR>lst</VAR> using new pairs and returns +it. Only the top level of the list is copied, i.e., pairs forming +elements of the copied list remain <CODE>eq?</CODE> to the corresponding +elements of the original; the copy is, however, not <CODE>eq?</CODE> to the +original, but is <CODE>equal?</CODE> to it. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(copy-list '(foo foo foo)) + => (foo foo foo) +(define q '(foo bar baz bang)) +(define p q) +(eq? p q) + => #t +(define r (copy-list q)) +(eq? q r) + => #f +(equal? q r) + => #t +(define bar '(bar)) +(eq? bar (car (copy-list (list bar 'foo)))) +=> #t +</pre></td></tr></table></DL> +<P> + +<A NAME="Lists as sets"></A> +<HR SIZE="6"> +<A NAME="SEC210"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC209"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC211"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.2.1.2 Lists as sets </H4> +<!--docid::SEC210::--> +<P> + +<CODE>eqv?</CODE> is used to test for membership by procedures which treat +lists as sets. +</P> +<P> + +<A NAME="IDX1290"></A> +</P> +<DL> +<DT><U>Function:</U> <B>adjoin</B> <I>e l</I> +<DD><CODE>adjoin</CODE> returns the adjoint of the element <VAR>e</VAR> and the list +<VAR>l</VAR>. That is, if <VAR>e</VAR> is in <VAR>l</VAR>, <CODE>adjoin</CODE> returns +<VAR>l</VAR>, otherwise, it returns <CODE>(cons <VAR>e</VAR> <VAR>l</VAR>)</CODE>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(adjoin 'baz '(bar baz bang)) + => (bar baz bang) +(adjoin 'foo '(bar baz bang)) + => (foo bar baz bang) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1291"></A> +</P> +<DL> +<DT><U>Function:</U> <B>union</B> <I>l1 l2</I> +<DD><CODE>union</CODE> returns a list of all elements that are in <VAR>l1</VAR> or +<VAR>l2</VAR>. Duplicates between <VAR>l1</VAR> and <VAR>l2</VAR> are culled. +Duplicates within <VAR>l1</VAR> or within <VAR>l2</VAR> may or may not be +removed. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(union '(1 2 3 4) '(5 6 7 8)) + => (1 2 3 4 5 6 7 8) +(union '(0 1 2 3 4) '(3 4 5 6)) + => (5 6 0 1 2 3 4) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1292"></A> +</P> +<DL> +<DT><U>Function:</U> <B>intersection</B> <I>l1 l2</I> +<DD><CODE>intersection</CODE> returns a list of all elements that are in both +<VAR>l1</VAR> and <VAR>l2</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(intersection '(1 2 3 4) '(3 4 5 6)) + => (3 4) +(intersection '(1 2 3 4) '(5 6 7 8)) + => () +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1293"></A> +</P> +<DL> +<DT><U>Function:</U> <B>set-difference</B> <I>l1 l2</I> +<DD><CODE>set-difference</CODE> returns a list of all elements that are in +<VAR>l1</VAR> but not in <VAR>l2</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(set-difference '(1 2 3 4) '(3 4 5 6)) + => (1 2) +(set-difference '(1 2 3 4) '(1 2 3 4 5 6)) + => () +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1294"></A> +</P> +<DL> +<DT><U>Function:</U> <B>subset?</B> <I>list1 list2</I> +<DD>Returns <CODE>#t</CODE> if every element of <VAR>list1</VAR> is <CODE>eqv?</CODE> an +element of <VAR>list2</VAR>; otherwise returns <CODE>#f</CODE>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(subset? '(1 2 3 4) '(3 4 5 6)) + => #f +(subset? '(1 2 3 4) '(6 5 4 3 2 1 0)) + => #t +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1295"></A> +</P> +<DL> +<DT><U>Function:</U> <B>member-if</B> <I>pred lst</I> +<DD><CODE>member-if</CODE> returns the list headed by the first element of +<VAR>lst</VAR> to satisfy <CODE>(<VAR>pred</VAR> <VAR>element</VAR>)</CODE>. +<CODE>Member-if</CODE> returns <CODE>#f</CODE> if <VAR>pred</VAR> returns <CODE>#f</CODE> for +every <VAR>element</VAR> in <VAR>lst</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(member-if vector? '(a 2 b 4)) + => #f +(member-if number? '(a 2 b 4)) + => (2 b 4) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1296"></A> +</P> +<DL> +<DT><U>Function:</U> <B>some</B> <I>pred lst1 lst2 <small>...</small></I> +<DD><VAR>pred</VAR> is a boolean function of as many arguments as there are list +arguments to <CODE>some</CODE> i.e., <VAR>lst</VAR> plus any optional arguments. +<VAR>pred</VAR> is applied to successive elements of the list arguments in +order. <CODE>some</CODE> returns <CODE>#t</CODE> as soon as one of these +applications returns <CODE>#t</CODE>, and is <CODE>#f</CODE> if none returns +<CODE>#t</CODE>. All the lists should have the same length. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(some odd? '(1 2 3 4)) + => #t + +(some odd? '(2 4 6 8)) + => #f + +(some > '(1 3) '(2 4)) + => #f +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1297"></A> +</P> +<DL> +<DT><U>Function:</U> <B>every</B> <I>pred lst1 lst2 <small>...</small></I> +<DD><CODE>every</CODE> is analogous to <CODE>some</CODE> except it returns <CODE>#t</CODE> if +every application of <VAR>pred</VAR> is <CODE>#t</CODE> and <CODE>#f</CODE> +otherwise. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(every even? '(1 2 3 4)) + => #f + +(every even? '(2 4 6 8)) + => #t + +(every > '(2 3) '(1 4)) + => #f +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1298"></A> +</P> +<DL> +<DT><U>Function:</U> <B>notany</B> <I>pred lst1 <small>...</small></I> +<DD><CODE>notany</CODE> is analogous to <CODE>some</CODE> but returns <CODE>#t</CODE> if no +application of <VAR>pred</VAR> returns <CODE>#t</CODE> or <CODE>#f</CODE> as soon as any +one does. +</DL> +<P> + +<A NAME="IDX1299"></A> +</P> +<DL> +<DT><U>Function:</U> <B>notevery</B> <I>pred lst1 <small>...</small></I> +<DD><CODE>notevery</CODE> is analogous to <CODE>some</CODE> but returns <CODE>#t</CODE> as soon +as an application of <VAR>pred</VAR> returns <CODE>#f</CODE>, and <CODE>#f</CODE> +otherwise. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(notevery even? '(1 2 3 4)) + => #t + +(notevery even? '(2 4 6 8)) + => #f +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1300"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list-of??</B> <I>predicate</I> +<DD>Returns a predicate which returns true if its argument is a list every +element of which satisfies <VAR>predicate</VAR>. +<P> + +<A NAME="IDX1301"></A> +<DT><U>Function:</U> <B>list-of??</B> <I>predicate low-bound high-bound</I> +<DD><VAR>low-bound</VAR> and <VAR>high-bound</VAR> are non-negative integers. +<CODE>list-of??</CODE> returns a predicate which returns true if its argument +is a list of length between <VAR>low-bound</VAR> and <VAR>high-bound</VAR> +(inclusive); every element of which satisfies <VAR>predicate</VAR>. +</P> +<P> + +<A NAME="IDX1302"></A> +<DT><U>Function:</U> <B>list-of??</B> <I>predicate bound</I> +<DD><VAR>bound</VAR> is an integer. If <VAR>bound</VAR> is negative, <CODE>list-of??</CODE> +returns a predicate which returns true if its argument is a list of +length greater than <CODE>(- <VAR>bound</VAR>)</CODE>; every element of which +satisfies <VAR>predicate</VAR>. Otherwise, <CODE>list-of??</CODE> returns a +predicate which returns true if its argument is a list of length less +than or equal to <VAR>bound</VAR>; every element of which satisfies +<VAR>predicate</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1303"></A> +</P> +<DL> +<DT><U>Function:</U> <B>find-if</B> <I>pred lst</I> +<DD><CODE>find-if</CODE> searches for the first <VAR>element</VAR> in <VAR>lst</VAR> such +that <CODE>(<VAR>pred</VAR> <VAR>element</VAR>)</CODE> returns <CODE>#t</CODE>. If it finds +any such <VAR>element</VAR> in <VAR>lst</VAR>, <VAR>element</VAR> is returned. +Otherwise, <CODE>#f</CODE> is returned. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(find-if number? '(foo 1 bar 2)) + => 1 + +(find-if number? '(foo bar baz bang)) + => #f + +(find-if symbol? '(1 2 foo bar)) + => foo +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1304"></A> +</P> +<DL> +<DT><U>Function:</U> <B>remove</B> <I>elt lst</I> +<DD><CODE>remove</CODE> removes all occurrences of <VAR>elt</VAR> from <VAR>lst</VAR> using +<CODE>eqv?</CODE> to test for equality and returns everything that's left. +N.B.: other implementations (Chez, Scheme->C and T, at least) use +<CODE>equal?</CODE> as the equality test. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(remove 1 '(1 2 1 3 1 4 1 5)) + => (2 3 4 5) + +(remove 'foo '(bar baz bang)) + => (bar baz bang) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1305"></A> +</P> +<DL> +<DT><U>Function:</U> <B>remove-if</B> <I>pred lst</I> +<DD><CODE>remove-if</CODE> removes all <VAR>element</VAR>s from <VAR>lst</VAR> where +<CODE>(<VAR>pred</VAR> <VAR>element</VAR>)</CODE> is <CODE>#t</CODE> and returns everything +that's left. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(remove-if number? '(1 2 3 4)) + => () + +(remove-if even? '(1 2 3 4 5 6 7 8)) + => (1 3 5 7) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1306"></A> +</P> +<DL> +<DT><U>Function:</U> <B>remove-if-not</B> <I>pred lst</I> +<DD><CODE>remove-if-not</CODE> removes all <VAR>element</VAR>s from <VAR>lst</VAR> for which +<CODE>(<VAR>pred</VAR> <VAR>element</VAR>)</CODE> is <CODE>#f</CODE> and returns everything that's +left. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(remove-if-not number? '(foo bar baz)) + => () +(remove-if-not odd? '(1 2 3 4 5 6 7 8)) + => (1 3 5 7) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1307"></A> +</P> +<DL> +<DT><U>Function:</U> <B>has-duplicates?</B> <I>lst</I> +<DD>returns <CODE>#t</CODE> if 2 members of <VAR>lst</VAR> are <CODE>equal?</CODE>, <CODE>#f</CODE> +otherwise. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(has-duplicates? '(1 2 3 4)) + => #f + +(has-duplicates? '(2 4 3 4)) + => #t +</pre></td></tr></table></DL> +<P> + +The procedure <CODE>remove-duplicates</CODE> uses <CODE>member</CODE> (rather than +<CODE>memv</CODE>). +</P> +<P> + +<A NAME="IDX1308"></A> +</P> +<DL> +<DT><U>Function:</U> <B>remove-duplicates</B> <I>lst</I> +<DD>returns a copy of <VAR>lst</VAR> with its duplicate members removed. +Elements are considered duplicate if they are <CODE>equal?</CODE>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(remove-duplicates '(1 2 3 4)) + => (1 2 3 4) + +(remove-duplicates '(2 4 3 4)) + => (2 4 3) +</pre></td></tr></table></DL> +<P> + +<A NAME="Lists as sequences"></A> +<HR SIZE="6"> +<A NAME="SEC211"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC210"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC212"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.2.1.3 Lists as sequences </H4> +<!--docid::SEC211::--> +<P> + +<A NAME="IDX1309"></A> +</P> +<DL> +<DT><U>Function:</U> <B>position</B> <I>obj lst</I> +<DD><CODE>position</CODE> returns the 0-based position of <VAR>obj</VAR> in <VAR>lst</VAR>, +or <CODE>#f</CODE> if <VAR>obj</VAR> does not occur in <VAR>lst</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(position 'foo '(foo bar baz bang)) + => 0 +(position 'baz '(foo bar baz bang)) + => 2 +(position 'oops '(foo bar baz bang)) + => #f +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1310"></A> +</P> +<DL> +<DT><U>Function:</U> <B>reduce</B> <I>p lst</I> +<DD><CODE>reduce</CODE> combines all the elements of a sequence using a binary +operation (the combination is left-associative). For example, using +<CODE>+</CODE>, one can add up all the elements. <CODE>reduce</CODE> allows you to +apply a function which accepts only two arguments to more than 2 +objects. Functional programmers usually refer to this as <EM>foldl</EM>. +<CODE>collect:reduce</CODE> (see section <A HREF="slib_7.html#SEC194">7.1.9 Collections</A>) provides a version of +<CODE>collect</CODE> generalized to collections. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(reduce + '(1 2 3 4)) + => 10 +(define (bad-sum . l) (reduce + l)) +(bad-sum 1 2 3 4) + == (reduce + (1 2 3 4)) + == (+ (+ (+ 1 2) 3) 4) +=> 10 +(bad-sum) + == (reduce + ()) + => () +(reduce string-append '("hello" "cruel" "world")) + == (string-append (string-append "hello" "cruel") "world") + => "hellocruelworld" +(reduce anything '()) + => () +(reduce anything '(x)) + => x +</pre></td></tr></table><P> + +What follows is a rather non-standard implementation of <CODE>reverse</CODE> +in terms of <CODE>reduce</CODE> and a combinator elsewhere called +<EM>C</EM>. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>;;; Contributed by Jussi Piitulainen (jpiitula @ ling.helsinki.fi) + +(define commute + (lambda (f) + (lambda (x y) + (f y x)))) + +(define reverse + (lambda (args) + (reduce-init (commute cons) '() args))) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1311"></A> +</P> +<DL> +<DT><U>Function:</U> <B>reduce-init</B> <I>p init lst</I> +<DD><CODE>reduce-init</CODE> is the same as reduce, except that it implicitly +inserts <VAR>init</VAR> at the start of the list. <CODE>reduce-init</CODE> is +preferred if you want to handle the null list, the one-element, and +lists with two or more elements consistently. It is common to use the +operator's idempotent as the initializer. Functional programmers +usually call this <EM>foldl</EM>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(define (sum . l) (reduce-init + 0 l)) +(sum 1 2 3 4) + == (reduce-init + 0 (1 2 3 4)) + == (+ (+ (+ (+ 0 1) 2) 3) 4) + => 10 +(sum) + == (reduce-init + 0 '()) + => 0 + +(reduce-init string-append "@" '("hello" "cruel" "world")) +== +(string-append (string-append (string-append "@" "hello") + "cruel") + "world") +=> "@hellocruelworld" +</pre></td></tr></table><P> + +Given a differentiation of 2 arguments, <CODE>diff</CODE>, the following will +differentiate by any number of variables. +<TABLE><tr><td> </td><td class=example><pre>(define (diff* exp . vars) + (reduce-init diff exp vars)) +</pre></td></tr></table><P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>;;; Real-world example: Insertion sort using reduce-init. + +(define (insert l item) + (if (null? l) + (list item) + (if (< (car l) item) + (cons (car l) (insert (cdr l) item)) + (cons item l)))) +(define (insertion-sort l) (reduce-init insert '() l)) + +(insertion-sort '(3 1 4 1 5) + == (reduce-init insert () (3 1 4 1 5)) + == (insert (insert (insert (insert (insert () 3) 1) 4) 1) 5) + == (insert (insert (insert (insert (3)) 1) 4) 1) 5) + == (insert (insert (insert (1 3) 4) 1) 5) + == (insert (insert (1 3 4) 1) 5) + == (insert (1 1 3 4) 5) + => (1 1 3 4 5) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1312"></A> +</P> +<DL> +<DT><U>Function:</U> <B>last</B> <I>lst n</I> +<DD><CODE>last</CODE> returns the last <VAR>n</VAR> elements of <VAR>lst</VAR>. <VAR>n</VAR> +must be a non-negative integer. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(last '(foo bar baz bang) 2) + => (baz bang) +(last '(1 2 3) 0) + => 0 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1313"></A> +</P> +<DL> +<DT><U>Function:</U> <B>butlast</B> <I>lst n</I> +<DD><CODE>butlast</CODE> returns all but the last <VAR>n</VAR> elements of +<VAR>lst</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(butlast '(a b c d) 3) + => (a) +(butlast '(a b c d) 4) + => () +</pre></td></tr></table></DL> +<P> + +<CODE>last</CODE> and <CODE>butlast</CODE> split a list into two parts when given +identical arugments. +<TABLE><tr><td> </td><td class=example><pre>(last '(a b c d e) 2) + => (d e) +(butlast '(a b c d e) 2) + => (a b c) +</pre></td></tr></table><P> + +<A NAME="IDX1314"></A> +</P> +<DL> +<DT><U>Function:</U> <B>nthcdr</B> <I>n lst</I> +<DD><CODE>nthcdr</CODE> takes <VAR>n</VAR> <CODE>cdr</CODE>s of <VAR>lst</VAR> and returns the +result. Thus <CODE>(nthcdr 3 <VAR>lst</VAR>)</CODE> == <CODE>(cdddr +<VAR>lst</VAR>)</CODE> +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(nthcdr 2 '(a b c d)) + => (c d) +(nthcdr 0 '(a b c d)) + => (a b c d) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1315"></A> +</P> +<DL> +<DT><U>Function:</U> <B>butnthcdr</B> <I>n lst</I> +<DD><CODE>butnthcdr</CODE> returns all but the nthcdr <VAR>n</VAR> elements of +<VAR>lst</VAR>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(butnthcdr 3 '(a b c d)) + => (a b c) +(butnthcdr 4 '(a b c d)) + => (a b c d) +</pre></td></tr></table></DL> +<P> + +<CODE>nthcdr</CODE> and <CODE>butnthcdr</CODE> split a list into two parts when +given identical arugments. +<TABLE><tr><td> </td><td class=example><pre>(nthcdr 2 '(a b c d e)) + => (c d e) +(butnthcdr 2 '(a b c d e)) + => (a b) +</pre></td></tr></table><P> + +<A NAME="Destructive list operations"></A> +<HR SIZE="6"> +<A NAME="SEC212"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC211"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC213"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.2.1.4 Destructive list operations </H4> +<!--docid::SEC212::--> +<P> + +These procedures may mutate the list they operate on, but any such +mutation is undefined. +</P> +<P> + +<A NAME="IDX1316"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>nconc</B> <I>args</I> +<DD><CODE>nconc</CODE> destructively concatenates its arguments. (Compare this +with <CODE>append</CODE>, which copies arguments rather than destroying them.) +Sometimes called <CODE>append!</CODE> (see section <A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A>). +<P> + +Example: You want to find the subsets of a set. Here's the obvious way: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define (subsets set) + (if (null? set) + '(()) + (append (map (lambda (sub) (cons (car set) sub)) + (subsets (cdr set))) + (subsets (cdr set))))) +</pre></td></tr></table>But that does way more consing than you need. Instead, you could +replace the <CODE>append</CODE> with <CODE>nconc</CODE>, since you don't have any +need for all the intermediate results. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(define x '(a b c)) +(define y '(d e f)) +(nconc x y) + => (a b c d e f) +x + => (a b c d e f) +</pre></td></tr></table><P> + +<CODE>nconc</CODE> is the same as <CODE>append!</CODE> in `<TT>sc2.scm</TT>'. +</P> +</DL> +<P> + +<A NAME="IDX1317"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>nreverse</B> <I>lst</I> +<DD><CODE>nreverse</CODE> reverses the order of elements in <VAR>lst</VAR> by mutating +<CODE>cdr</CODE>s of the list. Sometimes called <CODE>reverse!</CODE>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(define foo '(a b c)) +(nreverse foo) + => (c b a) +foo + => (a) +</pre></td></tr></table><P> + +Some people have been confused about how to use <CODE>nreverse</CODE>, +thinking that it doesn't return a value. It needs to be pointed out +that +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(set! lst (nreverse lst)) +</pre></td></tr></table>is the proper usage, not +<TABLE><tr><td> </td><td class=example><pre>(nreverse lst) +</pre></td></tr></table>The example should suffice to show why this is the case. +</DL> +<P> + +<A NAME="IDX1318"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>delete</B> <I>elt lst</I> +<DD><A NAME="IDX1319"></A> +<DT><U>Procedure:</U> <B>delete-if</B> <I>pred lst</I> +<DD><A NAME="IDX1320"></A> +<DT><U>Procedure:</U> <B>delete-if-not</B> <I>pred lst</I> +<DD>Destructive versions of <CODE>remove</CODE> <CODE>remove-if</CODE>, and +<CODE>remove-if-not</CODE>. +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(define lst (list 'foo 'bar 'baz 'bang)) +(delete 'foo lst) + => (bar baz bang) +lst + => (foo bar baz bang) + +(define lst (list 1 2 3 4 5 6 7 8 9)) +(delete-if odd? lst) + => (2 4 6 8) +lst + => (1 2 4 6 8) +</pre></td></tr></table><P> + +Some people have been confused about how to use <CODE>delete</CODE>, +<CODE>delete-if</CODE>, and <CODE>delete-if</CODE>, thinking that they don't return +a value. It needs to be pointed out that +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(set! lst (delete el lst)) +</pre></td></tr></table>is the proper usage, not +<TABLE><tr><td> </td><td class=example><pre>(delete el lst) +</pre></td></tr></table>The examples should suffice to show why this is the case. +</DL> +<P> + +<A NAME="Non-List functions"></A> +<HR SIZE="6"> +<A NAME="SEC213"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC212"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC214"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC208"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.2.1.5 Non-List functions </H4> +<!--docid::SEC213::--> +<P> + +<A NAME="IDX1321"></A> +</P> +<DL> +<DT><U>Function:</U> <B>and?</B> <I>arg1 <small>...</small></I> +<DD><CODE>and?</CODE> checks to see if all its arguments are true. If they are, +<CODE>and?</CODE> returns <CODE>#t</CODE>, otherwise, <CODE>#f</CODE>. (In contrast to +<CODE>and</CODE>, this is a function, so all arguments are always evaluated +and in an unspecified order.) +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(and? 1 2 3) + => #t +(and #f 1 2) + => #f +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1322"></A> +</P> +<DL> +<DT><U>Function:</U> <B>or?</B> <I>arg1 <small>...</small></I> +<DD><CODE>or?</CODE> checks to see if any of its arguments are true. If any is +true, <CODE>or?</CODE> returns <CODE>#t</CODE>, and <CODE>#f</CODE> otherwise. (To +<CODE>or</CODE> as <CODE>and?</CODE> is to <CODE>and</CODE>.) +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(or? 1 2 #f) + => #t +(or? #f #f #f) + => #f +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1323"></A> +</P> +<DL> +<DT><U>Function:</U> <B>atom?</B> <I>object</I> +<DD>Returns <CODE>#t</CODE> if <VAR>object</VAR> is not a pair and <CODE>#f</CODE> if it is +pair. (Called <CODE>atom</CODE> in Common LISP.) +<TABLE><tr><td> </td><td class=example><pre>(atom? 1) + => #t +(atom? '(1 2)) + => #f +(atom? #(1 2)) ; dubious! + => #t +</pre></td></tr></table></DL> +<P> + +<A NAME="Tree Operations"></A> +<HR SIZE="6"> +<A NAME="SEC214"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC213"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC215"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.2 Tree operations </H3> +<!--docid::SEC214::--> +<P> + +<CODE>(require 'tree)</CODE> +<A NAME="IDX1324"></A> +</P> +<P> + +These are operations that treat lists a representations of trees. +</P> +<P> + +<A NAME="IDX1325"></A> +</P> +<DL> +<DT><U>Function:</U> <B>subst</B> <I>new old tree</I> +<DD><A NAME="IDX1326"></A> +<DT><U>Function:</U> <B>substq</B> <I>new old tree</I> +<DD><A NAME="IDX1327"></A> +<DT><U>Function:</U> <B>substv</B> <I>new old tree</I> +<DD><P> + +<A NAME="IDX1328"></A> +<DT><U>Function:</U> <B>subst</B> <I>new old tree equ?</I> +<DD><CODE>subst</CODE> makes a copy of <VAR>tree</VAR>, substituting <VAR>new</VAR> for +every subtree or leaf of <VAR>tree</VAR> which is <CODE>equal?</CODE> to <VAR>old</VAR> +and returns a modified tree. The original <VAR>tree</VAR> is unchanged, but +may share parts with the result. +</P> +<P> + +<CODE>substq</CODE> and <CODE>substv</CODE> are similar, but test against <VAR>old</VAR> +using <CODE>eq?</CODE> and <CODE>eqv?</CODE> respectively. If <CODE>subst</CODE> is +called with a fourth argument, <VAR>equ?</VAR> is the equality predicate. +</P> +<P> + +Examples: +<TABLE><tr><td> </td><td class=example><pre>(substq 'tempest 'hurricane '(shakespeare wrote (the hurricane))) + => (shakespeare wrote (the tempest)) +(substq 'foo '() '(shakespeare wrote (twelfth night))) + => (shakespeare wrote (twelfth night . foo) . foo) +(subst '(a . cons) '(old . pair) + '((old . spice) ((old . shoes) old . pair) (old . pair))) + => ((old . spice) ((old . shoes) a . cons) (a . cons)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1329"></A> +</P> +<DL> +<DT><U>Function:</U> <B>copy-tree</B> <I>tree</I> +<DD><P> + +Makes a copy of the nested list structure <VAR>tree</VAR> using new pairs and +returns it. All levels are copied, so that none of the pairs in the +tree are <CODE>eq?</CODE> to the original ones -- only the leaves are. +</P> +<P> + +Example: +<TABLE><tr><td> </td><td class=example><pre>(define bar '(bar)) +(copy-tree (list bar 'foo)) + => ((bar) foo) +(eq? bar (car (copy-tree (list bar 'foo)))) + => #f +</pre></td></tr></table></DL> +<P> + +<A NAME="Chapter Ordering"></A> +<HR SIZE="6"> +<A NAME="SEC215"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC214"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC216"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.3 Chapter Ordering </H3> +<!--docid::SEC215::--> +<P> + +<CODE>(require 'chapter-order)</CODE> +<A NAME="IDX1330"></A> +</P> +<P> + +The `<SAMP>chap:</SAMP>' functions deal with strings which are ordered like +chapter numbers (or letters) in a book. Each section of the string +consists of consecutive numeric or consecutive aphabetic characters of +like case. +</P> +<P> + +<A NAME="IDX1331"></A> +</P> +<DL> +<DT><U>Function:</U> <B>chap:string<?</B> <I>string1 string2</I> +<DD><P> + +Returns #t if the first non-matching run of alphabetic upper-case or +the first non-matching run of alphabetic lower-case or the first +non-matching run of numeric characters of <VAR>string1</VAR> is +<CODE>string<?</CODE> than the corresponding non-matching run of +characters of <VAR>string2</VAR>. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(chap:string<? "a.9" "a.10") => #t +(chap:string<? "4c" "4aa") => #t +(chap:string<? "Revised^{3.99}" "Revised^{4}") => #t +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1332"></A> +</P> +<DL> +<DT><U>Function:</U> <B>chap:string>?</B> <I>string1 string2</I> +<DD><A NAME="IDX1333"></A> +<DT><U>Function:</U> <B>chap:string<=?</B> <I>string1 string2</I> +<DD><A NAME="IDX1334"></A> +<DT><U>Function:</U> <B>chap:string>=?</B> <I>string1 string2</I> +<DD><P> + +Implement the corresponding chapter-order predicates. +</P> +</DL> +<P> + +<A NAME="IDX1335"></A> +</P> +<DL> +<DT><U>Function:</U> <B>chap:next-string</B> <I>string</I> +<DD><P> + +Returns the next string in the <EM>chapter order</EM>. If <VAR>string</VAR> +has no alphabetic or numeric characters, +<CODE>(string-append <VAR>string</VAR> "0")</CODE> is returnd. The argument to +chap:next-string will always be <CODE>chap:string<?</CODE> than the result. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(chap:next-string "a.9") => "a.10" +(chap:next-string "4c") => "4d" +(chap:next-string "4z") => "4aa" +(chap:next-string "Revised^{4}") => "Revised^{5}" + +</pre></td></tr></table></DL> +<P> + +<A NAME="Sorting"></A> +<HR SIZE="6"> +<A NAME="SEC216"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC215"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC217"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.4 Sorting </H3> +<!--docid::SEC216::--> +<P> + +<CODE>(require 'sort)</CODE> +<A NAME="IDX1336"></A> +</P> +<P> + +Many Scheme systems provide some kind of sorting functions. They do +not, however, always provide the <EM>same</EM> sorting functions, and +those that I have had the opportunity to test provided inefficient ones +(a common blunder is to use quicksort which does not perform well). +</P> +<P> + +Because <CODE>sort</CODE> and <CODE>sort!</CODE> are not in the standard, there is +very little agreement about what these functions look like. For +example, Dybvig says that Chez Scheme provides +<TABLE><tr><td> </td><td class=example><pre>(merge predicate list1 list2) +(merge! predicate list1 list2) +(sort predicate list) +(sort! predicate list) +</pre></td></tr></table>while MIT Scheme 7.1, following Common LISP, offers unstable +<TABLE><tr><td> </td><td class=example><pre>(sort list predicate) +</pre></td></tr></table>TI PC Scheme offers +<TABLE><tr><td> </td><td class=example><pre>(sort! list/vector predicate?) +</pre></td></tr></table>and Elk offers +<TABLE><tr><td> </td><td class=example><pre>(sort list/vector predicate?) +(sort! list/vector predicate?) +</pre></td></tr></table><P> + +Here is a comprehensive catalogue of the variations I have found. +</P> +<P> + +<OL> +<LI> +Both <CODE>sort</CODE> and <CODE>sort!</CODE> may be provided. +<LI> +<CODE>sort</CODE> may be provided without <CODE>sort!</CODE>. +<LI> +<CODE>sort!</CODE> may be provided without <CODE>sort</CODE>. +<LI> +Neither may be provided. +<LI> +The sequence argument may be either a list or a vector. +<LI> +The sequence argument may only be a list. +<LI> +The sequence argument may only be a vector. +<LI> +The comparison function may be expected to behave like <CODE><</CODE>. +<LI> +The comparison function may be expected to behave like <CODE><=</CODE>. +<LI> +The interface may be <CODE>(sort predicate? sequence)</CODE>. +<LI> +The interface may be <CODE>(sort sequence predicate?)</CODE>. +<LI> +The interface may be <CODE>(sort sequence &optional (predicate? <))</CODE>. +<LI> +The sort may be stable. +<LI> +The sort may be unstable. +</OL> +<P> + +All of this variation really does not help anybody. A nice simple merge +sort is both stable and fast (quite a lot faster than <EM>quick</EM> sort). +</P> +<P> + +I am providing this source code with no restrictions at all on its use +(but please retain D.H.D.Warren's credit for the original idea). You +may have to rename some of these functions in order to use them in a +system which already provides incompatible or inferior sorts. For each +of the functions, only the top-level define needs to be edited to do +that. +</P> +<P> + +I could have given these functions names which would not clash with any +Scheme that I know of, but I would like to encourage implementors to +converge on a single interface, and this may serve as a hint. The +argument order for all functions has been chosen to be as close to +Common LISP as made sense, in order to avoid NIH-itis. +</P> +<P> + +Each of the five functions has a required <EM>last</EM> parameter which is +a comparison function. A comparison function <CODE>f</CODE> is a function of +2 arguments which acts like <CODE><</CODE>. For example, +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(not (f x x)) +(and (f x y) (f y z)) == (f x z) +</pre></td></tr></table><P> + +The standard functions <CODE><</CODE>, <CODE>></CODE>, <CODE>char<?</CODE>, <CODE>char>?</CODE>, +<CODE>char-ci<?</CODE>, <CODE>char-ci>?</CODE>, <CODE>string<?</CODE>, <CODE>string>?</CODE>, +<CODE>string-ci<?</CODE>, and <CODE>string-ci>?</CODE> are suitable for use as +comparison functions. Think of <CODE>(less? x y)</CODE> as saying when +<CODE>x</CODE> must <EM>not</EM> precede <CODE>y</CODE>. +</P> +<P> + +<A NAME="IDX1337"></A> +</P> +<DL> +<DT><U>Function:</U> <B>sorted?</B> <I>sequence less?</I> +<DD>Returns <CODE>#t</CODE> when the sequence argument is in non-decreasing order +according to <VAR>less?</VAR> (that is, there is no adjacent pair <CODE><small>...</small> x +y <small>...</small></CODE> for which <CODE>(less? y x)</CODE>). +<P> + +Returns <CODE>#f</CODE> when the sequence contains at least one out-of-order +pair. It is an error if the sequence is not a list, vector, or +string. +</P> +</DL> +<P> + +<A NAME="IDX1338"></A> +</P> +<DL> +<DT><U>Function:</U> <B>merge</B> <I>list1 list2 less?</I> +<DD>This merges two lists, producing a completely new list as result. I +gave serious consideration to producing a Common-LISP-compatible +version. However, Common LISP's <CODE>sort</CODE> is our <CODE>sort!</CODE> (well, +in fact Common LISP's <CODE>stable-sort</CODE> is our <CODE>sort!</CODE>, merge sort +is <EM>fast</EM> as well as stable!) so adapting CL code to Scheme takes a +bit of work anyway. I did, however, appeal to CL to determine the +<EM>order</EM> of the arguments. +</DL> +<P> + +<A NAME="IDX1339"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>merge!</B> <I>list1 list2 less?</I> +<DD>Merges two lists, re-using the pairs of <VAR>list1</VAR> and <VAR>list2</VAR> to +build the result. If the code is compiled, and <VAR>less?</VAR> constructs +no new pairs, no pairs at all will be allocated. The first pair of the +result will be either the first pair of <VAR>list1</VAR> or the first pair of +<VAR>list2</VAR>, but you can't predict which. +<P> + +The code of <CODE>merge</CODE> and <CODE>merge!</CODE> could have been quite a bit +simpler, but they have been coded to reduce the amount of work done per +iteration. (For example, we only have one <CODE>null?</CODE> test per +iteration.) +</P> +<P> + +</P> +</DL> +<P> + +<A NAME="IDX1340"></A> +</P> +<DL> +<DT><U>Function:</U> <B>sort</B> <I>sequence less?</I> +<DD>Accepts either a list, vector, or string; and returns a new sequence +which is sorted. The new sequence is the same type as the input. +Always <CODE>(sorted? (sort sequence less?) less?)</CODE>. The original +sequence is not altered in any way. The new sequence shares its +<EM>elements</EM> with the old one; no elements are copied. +</DL> +<P> + +<A NAME="IDX1341"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>sort!</B> <I>sequence less?</I> +<DD>Returns its sorted result in the original boxes. If the original +sequence is a list, no new storage is allocated at all. If the +original sequence is a vector or string, the sorted elements are put +back in the same vector or string. +<P> + +Some people have been confused about how to use <CODE>sort!</CODE>, thinking +that it doesn't return a value. It needs to be pointed out that +<TABLE><tr><td> </td><td class=example><pre>(set! slist (sort! slist <)) +</pre></td></tr></table>is the proper usage, not +<TABLE><tr><td> </td><td class=example><pre>(sort! slist <) +</pre></td></tr></table></DL> +<P> + +Note that these functions do <EM>not</EM> accept a CL-style `<SAMP>:key</SAMP>' +argument. A simple device for obtaining the same expressiveness is to +define +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define (keyed less? key) + (lambda (x y) (less? (key x) (key y)))) +</pre></td></tr></table>and then, when you would have written +<TABLE><tr><td> </td><td class=example><pre>(sort a-sequence #'my-less :key #'my-key) +</pre></td></tr></table>in Common LISP, just write +<TABLE><tr><td> </td><td class=example><pre>(sort! a-sequence (keyed my-less? my-key)) +</pre></td></tr></table>in Scheme. +<P> + +<A NAME="Topological Sort"></A> +<HR SIZE="6"> +<A NAME="SEC217"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC216"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC218"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.5 Topological Sort </H3> +<!--docid::SEC217::--> +<P> + +<CODE>(require 'topological-sort)</CODE> or <CODE>(require 'tsort)</CODE> +<A NAME="IDX1342"></A> +<A NAME="IDX1343"></A> +</P> +<P> + +The algorithm is inspired by Cormen, Leiserson and Rivest (1990) +<CITE>Introduction to Algorithms</CITE>, chapter 23. +</P> +<P> + +<A NAME="IDX1344"></A> +</P> +<DL> +<DT><U>Function:</U> <B>tsort</B> <I>dag pred</I> +<DD><P> + +<A NAME="IDX1345"></A> +<DT><U>Function:</U> <B>topological-sort</B> <I>dag pred</I> +<DD>where +</P> +<DL COMPACT> +<DT><VAR>dag</VAR> +<DD>is a list of sublists. The car of each sublist is a vertex. The cdr is +the adjacency list of that vertex, i.e. a list of all vertices to which +there exists an edge from the car vertex. +<DT><VAR>pred</VAR> +<DD>is one of <CODE>eq?</CODE>, <CODE>eqv?</CODE>, <CODE>equal?</CODE>, <CODE>=</CODE>, +<CODE>char=?</CODE>, <CODE>char-ci=?</CODE>, <CODE>string=?</CODE>, or <CODE>string-ci=?</CODE>. +</DL> +<P> + +Sort the directed acyclic graph <VAR>dag</VAR> so that for every edge from +vertex <VAR>u</VAR> to <VAR>v</VAR>, <VAR>u</VAR> will come before <VAR>v</VAR> in the +resulting list of vertices. +</P> +<P> + +Time complexity: O (|V| + |E|) +</P> +<P> + +Example (from Cormen): +<BLOCKQUOTE> +Prof. Bumstead topologically sorts his clothing when getting +dressed. The first argument to <CODE>tsort</CODE> describes which +garments he needs to put on before others. (For example, +Prof Bumstead needs to put on his shirt before he puts on his +tie or his belt.) <CODE>tsort</CODE> gives the correct order of dressing: +</BLOCKQUOTE> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'tsort) +<A NAME="IDX1346"></A>(tsort '((shirt tie belt) + (tie jacket) + (belt jacket) + (watch) + (pants shoes belt) + (undershorts pants shoes) + (socks shoes)) + eq?) +=> +(socks undershorts pants shoes watch shirt belt tie jacket) +</pre></td></tr></table></DL> +<P> + +<A NAME="Hashing"></A> +<HR SIZE="6"> +<A NAME="SEC218"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC217"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC219"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.6 Hashing </H3> +<!--docid::SEC218::--> +<P> + +<CODE>(require 'hash)</CODE> +<A NAME="IDX1347"></A> +</P> +<P> + +These hashing functions are for use in quickly classifying objects. +Hash tables use these functions. +</P> +<P> + +<A NAME="IDX1348"></A> +</P> +<DL> +<DT><U>Function:</U> <B>hashq</B> <I>obj k</I> +<DD><A NAME="IDX1349"></A> +<DT><U>Function:</U> <B>hashv</B> <I>obj k</I> +<DD><A NAME="IDX1350"></A> +<DT><U>Function:</U> <B>hash</B> <I>obj k</I> +<DD>Returns an exact non-negative integer less than <VAR>k</VAR>. For each +non-negative integer less than <VAR>k</VAR> there are arguments <VAR>obj</VAR> for +which the hashing functions applied to <VAR>obj</VAR> and <VAR>k</VAR> returns +that integer. +<P> + +For <CODE>hashq</CODE>, <CODE>(eq? obj1 obj2)</CODE> implies <CODE>(= (hashq obj1 k) +(hashq obj2))</CODE>. +</P> +<P> + +For <CODE>hashv</CODE>, <CODE>(eqv? obj1 obj2)</CODE> implies <CODE>(= (hashv obj1 k) +(hashv obj2))</CODE>. +</P> +<P> + +For <CODE>hash</CODE>, <CODE>(equal? obj1 obj2)</CODE> implies <CODE>(= (hash obj1 k) +(hash obj2))</CODE>. +</P> +<P> + +<CODE>hash</CODE>, <CODE>hashv</CODE>, and <CODE>hashq</CODE> return in time bounded by a +constant. Notice that items having the same <CODE>hash</CODE> implies the +items have the same <CODE>hashv</CODE> implies the items have the same +<CODE>hashq</CODE>. +</P> +</DL> +<P> + +<A NAME="Space-Filling Curves"></A> +<HR SIZE="6"> +<A NAME="SEC219"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC218"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC220"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.7 Space-Filling Curves </H3> +<!--docid::SEC219::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC221">7.2.7.2 Sierpinski Curve</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Peano-Hilbert Space-Filling Curve"></A> +<HR SIZE="6"> +<A NAME="SEC220"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC219"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC221"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC219"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.2.7.1 Peano-Hilbert Space-Filling Curve </H4> +<!--docid::SEC220::--> +<P> + +<CODE>(require 'hilbert-fill)</CODE> +<A NAME="IDX1351"></A> +</P> +<P> + +<A NAME="IDX1352"></A> +<A NAME="IDX1353"></A> +<A NAME="IDX1354"></A> +The <EM>Peano-Hilbert Space-Filling Curve</EM> is a one-to-one mapping +<A NAME="IDX1355"></A> +between a unit line segment and an <VAR>n</VAR>-dimensional unit cube. +</P> +<P> + +The integer procedures map the non-negative integers to an +arbitrarily large <VAR>n</VAR>-dimensional cube with its corner at the +origin and all coordinates are non-negative. +</P> +<P> + +For any exact nonnegative integers <VAR>scalar</VAR> and <VAR>rank</VAR>, +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(= <VAR>scalar</VAR> (hilbert-coordinates->integer + (integer->hilbert-coordinates <VAR>scalar</VAR> <VAR>rank</VAR>))) + => #t +</pre></td></tr></table><P> + +<A NAME="IDX1356"></A> +</P> +<DL> +<DT><U>Function:</U> <B>integer->hilbert-coordinates</B> <I>scalar rank</I> +<DD><P> + +Returns a list of <VAR>rank</VAR> integer coordinates corresponding to exact +non-negative integer <VAR>scalar</VAR>. The lists returned by <CODE>integer->hilbert-coordinates</CODE> for <VAR>scalar</VAR> arguments +0 and 1 will differ in the first element. +</P> +</DL> +<P> + +<A NAME="IDX1357"></A> +</P> +<DL> +<DT><U>Function:</U> <B>hilbert-coordinates->integer</B> <I>coords</I> +<DD><P> + +Returns an exact non-negative integer corresponding to <VAR>coords</VAR>, a list +of non-negative integer coordinates. +</P> +</DL> +<P> + +<A NAME="Sierpinski Curve"></A> +<HR SIZE="6"> +<A NAME="SEC221"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC220"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC222"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC219"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.2.7.2 Sierpinski Curve </H4> +<!--docid::SEC221::--> +<P> + +<CODE>(require 'sierpinski)</CODE> +<A NAME="IDX1358"></A> +</P> +<P> + +<A NAME="IDX1359"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-sierpinski-indexer</B> <I>max-coordinate</I> +<DD>Returns a procedure (eg hash-function) of 2 numeric arguments which +preserves <EM>nearness</EM> in its mapping from NxN to N. +<P> + +<VAR>max-coordinate</VAR> is the maximum coordinate (a positive integer) of a +population of points. The returned procedures is a function that takes +the x and y coordinates of a point, (non-negative integers) and returns +an integer corresponding to the relative position of that point along a +Sierpinski curve. (You can think of this as computing a (pseudo-) +inverse of the Sierpinski spacefilling curve.) +</P> +<P> + +Example use: Make an indexer (hash-function) for integer points lying in +square of integer grid points [0,99]x[0,99]: +<TABLE><tr><td> </td><td class=example><pre>(define space-key (make-sierpinski-indexer 100)) +</pre></td></tr></table>Now let's compute the index of some points: +<TABLE><tr><td> </td><td class=example><pre>(space-key 24 78) => 9206 +(space-key 23 80) => 9172 +</pre></td></tr></table><P> + +Note that locations (24, 78) and (23, 80) are near in index and +therefore, because the Sierpinski spacefilling curve is continuous, we +know they must also be near in the plane. Nearness in the plane does +not, however, necessarily correspond to nearness in index, although it +<EM>tends</EM> to be so. +</P> +<P> + +Example applications: +<UL> + +<LI> +Sort points by Sierpinski index to get heuristic solution to +<EM>travelling salesman problem</EM>. For details of performance, +see L. Platzman and J. Bartholdi, "Spacefilling curves and the +Euclidean travelling salesman problem", JACM 36(4):719--737 +(October 1989) and references therein. +<P> + +</P> +<LI> +Use Sierpinski index as key by which to store 2-dimensional data +in a 1-dimensional data structure (such as a table). Then +locations that are near each other in 2-d space will tend to +be near each other in 1-d data structure; and locations that +are near in 1-d data structure will be near in 2-d space. This +can significantly speed retrieval from secondary storage because +contiguous regions in the plane will tend to correspond to +contiguous regions in secondary storage. (This is a standard +technique for managing CAD/CAM or geographic data.) +<P> + +</UL> +</DL> +<P> + +<A NAME="Soundex"></A> +<HR SIZE="6"> +<A NAME="SEC222"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC221"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC223"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.8 Soundex </H3> +<!--docid::SEC222::--> +<P> + +<CODE>(require 'soundex)</CODE> +<A NAME="IDX1360"></A> +</P> +<P> + +<A NAME="IDX1361"></A> +</P> +<DL> +<DT><U>Function:</U> <B>soundex</B> <I>name</I> +<DD>Computes the <EM>soundex</EM> hash of <VAR>name</VAR>. Returns a string of an +initial letter and up to three digits between 0 and 6. Soundex +supposedly has the property that names that sound similar in normal +English pronunciation tend to map to the same key. +<P> + +Soundex was a classic algorithm used for manual filing of personal +records before the advent of computers. It performs adequately for +English names but has trouble with other languages. +</P> +<P> + +See Knuth, Vol. 3 <CITE>Sorting and searching</CITE>, pp 391--2 +</P> +<P> + +To manage unusual inputs, <CODE>soundex</CODE> omits all non-alphabetic +characters. Consequently, in this implementation: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(soundex <string of blanks>) => "" +(soundex "") => "" +</pre></td></tr></table><P> + +Examples from Knuth: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(map soundex '("Euler" "Gauss" "Hilbert" "Knuth" + "Lloyd" "Lukasiewicz")) + => ("E460" "G200" "H416" "K530" "L300" "L222") + +(map soundex '("Ellery" "Ghosh" "Heilbronn" "Kant" + "Ladd" "Lissajous")) + => ("E460" "G200" "H416" "K530" "L300" "L222") +</pre></td></tr></table><P> + +Some cases in which the algorithm fails (Knuth): +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(map soundex '("Rogers" "Rodgers")) => ("R262" "R326") + +(map soundex '("Sinclair" "St. Clair")) => ("S524" "S324") + +(map soundex '("Tchebysheff" "Chebyshev")) => ("T212" "C121") +</pre></td></tr></table></DL> +<P> + +<A NAME="String Search"></A> +<HR SIZE="6"> +<A NAME="SEC223"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC222"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC224"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.9 String Search </H3> +<!--docid::SEC223::--> +<P> + +<CODE>(require 'string-search)</CODE> +<A NAME="IDX1362"></A> +</P> +<P> + +<A NAME="IDX1363"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>string-index</B> <I>string char</I> +<DD><A NAME="IDX1364"></A> +<DT><U>Procedure:</U> <B>string-index-ci</B> <I>string char</I> +<DD>Returns the index of the first occurence of <VAR>char</VAR> within +<VAR>string</VAR>, or <CODE>#f</CODE> if the <VAR>string</VAR> does not contain a +character <VAR>char</VAR>. +</DL> +<P> + +<A NAME="IDX1365"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>string-reverse-index</B> <I>string char</I> +<DD><A NAME="IDX1366"></A> +<DT><U>Procedure:</U> <B>string-reverse-index-ci</B> <I>string char</I> +<DD>Returns the index of the last occurence of <VAR>char</VAR> within +<VAR>string</VAR>, or <CODE>#f</CODE> if the <VAR>string</VAR> does not contain a +character <VAR>char</VAR>. +</DL> +<P> + +<A NAME="IDX1367"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>substring?</B> <I>pattern string</I> +<DD><A NAME="IDX1368"></A> +<DT><U>Procedure:</U> <B>substring-ci?</B> <I>pattern string</I> +<DD>Searches <VAR>string</VAR> to see if some substring of <VAR>string</VAR> is equal +to <VAR>pattern</VAR>. <CODE>substring?</CODE> returns the index of the first +character of the first substring of <VAR>string</VAR> that is equal to +<VAR>pattern</VAR>; or <CODE>#f</CODE> if <VAR>string</VAR> does not contain +<VAR>pattern</VAR>. +<P> + +<TABLE><tr><td> </td><td class=example><pre>(substring? "rat" "pirate") => 2 +(substring? "rat" "outrage") => #f +(substring? "" any-string) => 0 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1369"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>find-string-from-port?</B> <I>str in-port max-no-chars</I> +<DD>Looks for a string <VAR>str</VAR> within the first <VAR>max-no-chars</VAR> chars +of the input port <VAR>in-port</VAR>. +<P> + +<A NAME="IDX1370"></A> +<DT><U>Procedure:</U> <B>find-string-from-port?</B> <I>str in-port</I> +<DD>When called with two arguments, the search span is limited by the end of +the input stream. +</P> +<P> + +<A NAME="IDX1371"></A> +<DT><U>Procedure:</U> <B>find-string-from-port?</B> <I>str in-port char</I> +<DD>Searches up to the first occurrence of character <VAR>char</VAR> in +<VAR>str</VAR>. +</P> +<P> + +<A NAME="IDX1372"></A> +<DT><U>Procedure:</U> <B>find-string-from-port?</B> <I>str in-port proc</I> +<DD>Searches up to the first occurrence of the procedure <VAR>proc</VAR> +returning non-false when called with a character (from <VAR>in-port</VAR>) +argument. +</P> +<P> + +When the <VAR>str</VAR> is found, <CODE>find-string-from-port?</CODE> returns the +number of characters it has read from the port, and the port is set to +read the first char after that (that is, after the <VAR>str</VAR>) The +function returns <CODE>#f</CODE> when the <VAR>str</VAR> isn't found. +</P> +<P> + +<CODE>find-string-from-port?</CODE> reads the port <EM>strictly</EM> +sequentially, and does not perform any buffering. So +<CODE>find-string-from-port?</CODE> can be used even if the <VAR>in-port</VAR> is +open to a pipe or other communication channel. +</P> +</DL> +<P> + +<A NAME="IDX1373"></A> +</P> +<DL> +<DT><U>Function:</U> <B>string-subst</B> <I>txt old1 new1 <small>...</small></I> +<DD>Returns a copy of string <VAR>txt</VAR> with all occurrences of string +<VAR>old1</VAR> in <VAR>txt</VAR> replaced with <VAR>new1</VAR>; then <VAR>old2</VAR> +replaced with <VAR>new2</VAR> <small>...</small>. Matches are found from the left. +Matches do not overlap. +</DL> +<P> + +<A NAME="IDX1374"></A> +</P> +<DL> +<DT><U>Function:</U> <B>count-newlines</B> <I>str</I> +<DD>Returns the number of `<SAMP>#\newline</SAMP>' characters in string <VAR>str</VAR>. +</DL> +<P> + +<A NAME="Sequence Comparison"></A> +<HR SIZE="6"> +<A NAME="SEC224"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC223"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC207"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.2.10 Sequence Comparison </H3> +<!--docid::SEC224::--> +<P> + +<CODE>(require 'diff)</CODE> +<A NAME="IDX1375"></A> +<A NAME="IDX1376"></A> +</P> +<P> + +<CODE>diff:edit-length</CODE> implements the algorithm: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>S. Wu, E. Myers, U. Manber, and W. Miller, + "An O(NP) Sequence Comparison Algorithm," + Information Processing Letters 35, 6 (1990), 317-323. + <A HREF="http://www.cs.arizona.edu/people/gene/vita.html">http://www.cs.arizona.edu/people/gene/vita.html</A> +</pre></td></tr></table>S. Wu, <A HREF="http://www.cs.arizona.edu/people/gene/vita.html"> +E. Myers,</A> U. Manber, and W. Miller, +<A HREF="http://www.cs.arizona.edu/people/gene/PAPERS/np_diff.ps"> +"An O(NP) Sequence Comparison Algorithm,"</A> +Information Processing Letters 35, 6 (1990), 317-323. +<P> + +The values returned by <CODE>diff:edit-length</CODE> can be used to gauge +the degree of match between two sequences. +</P> +<P> + +Surprisingly, "An O(NP) Sequence Comparison Algorithm" does not +derive the edit sequence; only the sequence length. Developing this +linear-space sub-quadratic-time algorithm for computing the edit +sequence required hundreds of hours of work. I have submitted a +paper describing the algorithm to the Journal of Computational +Biology. +</P> +<P> + +If the items being sequenced are text lines, then the computed +edit-list is equivalent to the output of the <EM>diff</EM> utility +<A NAME="IDX1377"></A> +program. If the items being sequenced are words, then it is like the +lesser known <EM>spiff</EM> program. +<A NAME="IDX1378"></A> +</P> +<P> + +<A NAME="IDX1379"></A> +</P> +<DL> +<DT><U>Function:</U> <B>diff:longest-common-subsequence</B> <I>array1 array2 =? p-lim</I> +<DD><P> + +<A NAME="IDX1380"></A> +<DT><U>Function:</U> <B>diff:longest-common-subsequence</B> <I>array1 array2 =?</I> +<DD><VAR>array1</VAR> and <VAR>array2</VAR> are one-dimensional arrays. The procedure <VAR>=?</VAR> is used +to compare sequence tokens for equality. +</P> +<P> + +The non-negative integer <VAR>p-lim</VAR>, if provided, is maximum number of +deletions of the shorter sequence to allow. <CODE>diff:longest-common-subsequence</CODE> will return <CODE>#f</CODE> +if more deletions would be necessary. +</P> +<P> + +<CODE>diff:longest-common-subsequence</CODE> returns a one-dimensional array of length <CODE>(quotient (- (+ +len1 len2) (diff:edit-length <VAR>array1</VAR> <VAR>array2</VAR>)) 2)</CODE> holding the longest sequence +common to both <VAR>array</VAR>s. +</P> +</DL> +<P> + +<A NAME="IDX1381"></A> +</P> +<DL> +<DT><U>Function:</U> <B>diff:edits</B> <I>array1 array2 =? p-lim</I> +<DD><P> + +<A NAME="IDX1382"></A> +<DT><U>Function:</U> <B>diff:edits</B> <I>array1 array2 =?</I> +<DD><VAR>array1</VAR> and <VAR>array2</VAR> are one-dimensional arrays. The procedure <VAR>=?</VAR> is used +to compare sequence tokens for equality. +</P> +<P> + +The non-negative integer <VAR>p-lim</VAR>, if provided, is maximum number of +deletions of the shorter sequence to allow. <CODE>diff:edits</CODE> will return <CODE>#f</CODE> +if more deletions would be necessary. +</P> +<P> + +<CODE>diff:edits</CODE> returns a vector of length <CODE>(diff:edit-length <VAR>array1</VAR> <VAR>array2</VAR>)</CODE> composed +of a shortest sequence of edits transformaing <VAR>array1</VAR> to <VAR>array2</VAR>. +</P> +<P> + +Each edit is an integer: +</P> +<DL COMPACT> +<DT><VAR>k</VAR> > 0 +<DD>Inserts <CODE>(array-ref <VAR>array1</VAR> (+ -1 <VAR>j</VAR>))</CODE> into the sequence. +<DT><VAR>k</VAR> < 0 +<DD>Deletes <CODE>(array-ref <VAR>array2</VAR> (- -1 <VAR>k</VAR>))</CODE> from the sequence. +</DL> +</DL> +<P> + +<A NAME="IDX1383"></A> +</P> +<DL> +<DT><U>Function:</U> <B>diff:edit-length</B> <I>array1 array2 =? p-lim</I> +<DD><P> + +<A NAME="IDX1384"></A> +<DT><U>Function:</U> <B>diff:edit-length</B> <I>array1 array2 =?</I> +<DD><VAR>array1</VAR> and <VAR>array2</VAR> are one-dimensional arrays. The procedure <VAR>=?</VAR> is used +to compare sequence tokens for equality. +</P> +<P> + +The non-negative integer <VAR>p-lim</VAR>, if provided, is maximum number of +deletions of the shorter sequence to allow. <CODE>diff:edit-length</CODE> will return <CODE>#f</CODE> +if more deletions would be necessary. +</P> +<P> + +<CODE>diff:edit-length</CODE> returns the length of the shortest sequence of edits transformaing +<VAR>array1</VAR> to <VAR>array2</VAR>. +</P> +</DL> +<TABLE><tr><td> </td><td class=example><pre>(diff:longest-common-subsequence "fghiejcklm" "fgehijkpqrlm" eqv?) +=> "fghijklm" + +(diff:edit-length "fghiejcklm" "fgehijkpqrlm" eqv?) +=> 6 + +(diff:edits "fghiejcklm" "fgehijkpqrlm" eqv?) +=> #As32(3 -5 -7 8 9 10) + ; e c h p q r +</pre></td></tr></table><P> + +<A NAME="Procedures"></A> +<HR SIZE="6"> +<A NAME="SEC225"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC224"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC226"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 7.3 Procedures </H2> +<!--docid::SEC225::--> +<P> + +Anything that doesn't fall neatly into any of the other categories winds +up here. +</P> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'coerce</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC227">7.3.2 String-Case</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'string-case</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC228">7.3.3 String Ports</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'string-port</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC229">7.3.4 Line I/O</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'line-i/o</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'process</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC231">7.3.6 Metric Units</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Portable manifest types for numeric values.</TD></TR> +</TABLE> +<P> + +<A NAME="Type Coercion"></A> +<HR SIZE="6"> +<A NAME="SEC226"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC227"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.3.1 Type Coercion </H3> +<!--docid::SEC226::--> +<CODE>(require 'coerce)</CODE> +<A NAME="IDX1385"></A> +<P> + +<A NAME="IDX1386"></A> +</P> +<DL> +<DT><U>Function:</U> <B>type-of</B> <I>obj</I> +<DD><P> + +Returns a symbol name for the type of <VAR>obj</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1387"></A> +</P> +<DL> +<DT><U>Function:</U> <B>coerce</B> <I>obj result-type</I> +<DD><P> + +Converts and returns <VAR>obj</VAR> of type <CODE>char</CODE>, <CODE>number</CODE>, +<CODE>string</CODE>, <CODE>symbol</CODE>, <CODE>list</CODE>, or <CODE>vector</CODE> to +<VAR>result-type</VAR> (which must be one of these symbols). +</P> +</DL> +<P> + +<A NAME="String-Case"></A> +<HR SIZE="6"> +<A NAME="SEC227"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC226"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC228"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.3.2 String-Case </H3> +<!--docid::SEC227::--> +<P> + +<CODE>(require 'string-case)</CODE> +<A NAME="IDX1388"></A> +</P> +<P> + +<A NAME="IDX1389"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>string-upcase</B> <I>str</I> +<DD><A NAME="IDX1390"></A> +<DT><U>Procedure:</U> <B>string-downcase</B> <I>str</I> +<DD><A NAME="IDX1391"></A> +<DT><U>Procedure:</U> <B>string-capitalize</B> <I>str</I> +<DD>The obvious string conversion routines. These are non-destructive. +</DL> +<P> + +<A NAME="IDX1392"></A> +</P> +<DL> +<DT><U>Function:</U> <B>string-upcase!</B> <I>str</I> +<DD><A NAME="IDX1393"></A> +<DT><U>Function:</U> <B>string-downcase!</B> <I>str</I> +<DD><A NAME="IDX1394"></A> +<DT><U>Function:</U> <B>string-capitalize!</B> <I>str</I> +<DD>The destructive versions of the functions above. +</DL> +<P> + +<A NAME="IDX1395"></A> +</P> +<DL> +<DT><U>Function:</U> <B>string-ci->symbol</B> <I>str</I> +<DD>Converts string <VAR>str</VAR> to a symbol having the same case as if the +symbol had been <CODE>read</CODE>. +</DL> +<P> + +<A NAME="IDX1396"></A> +</P> +<DL> +<DT><U>Function:</U> <B>symbol-append</B> <I>obj1 <small>...</small></I> +<DD>Converts <VAR>obj1</VAR> <small>...</small> to strings, appends them, and converts to a +symbol which is returned. Strings and numbers are converted to read's +symbol case; the case of symbol characters is not changed. #f is +converted to the empty string (symbol). +</DL> +<P> + +<A NAME="IDX1397"></A> +</P> +<DL> +<DT><U>Function:</U> <B>StudlyCapsExpand</B> <I>str delimiter</I> +<DD><A NAME="IDX1398"></A> +<DT><U>Function:</U> <B>StudlyCapsExpand</B> <I>str</I> +<DD><VAR>delimiter</VAR> must be a string or character. If absent, +<VAR>delimiter</VAR> defaults to `<SAMP>-</SAMP>'. <CODE>StudlyCapsExpand</CODE> returns a +copy of <VAR>str</VAR> where <VAR>delimiter</VAR> is inserted between each +lower-case character immediately followed by an upper-case character; +and between two upper-case characters immediately followed by a +lower-case character. +<P> + +<TABLE><tr><td> </td><td class=example><pre>(StudlyCapsExpand "aX" " ") => "a X" +(StudlyCapsExpand "aX" "..") => "a..X" +(StudlyCapsExpand "AX") => "AX" +(StudlyCapsExpand "Ax") => "Ax" +(StudlyCapsExpand "AXLE") => "AXLE" +(StudlyCapsExpand "aAXACz") => "a-AXA-Cz" +(StudlyCapsExpand "AaXACz") => "Aa-XA-Cz" +(StudlyCapsExpand "AAaXACz") => "A-Aa-XA-Cz" +(StudlyCapsExpand "AAaXAC") => "A-Aa-XAC" +</pre></td></tr></table><P> + +</P> +</DL> +<P> + +<A NAME="String Ports"></A> +<HR SIZE="6"> +<A NAME="SEC228"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC227"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC229"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.3.3 String Ports </H3> +<!--docid::SEC228::--> +<P> + +<CODE>(require 'string-port)</CODE> +<A NAME="IDX1399"></A> +</P> +<P> + +<A NAME="IDX1400"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>call-with-output-string</B> <I>proc</I> +<DD><VAR>proc</VAR> must be a procedure of one argument. This procedure calls +<VAR>proc</VAR> with one argument: a (newly created) output port. When the +function returns, the string composed of the characters written into the +port is returned. +</DL> +<P> + +<A NAME="IDX1401"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>call-with-input-string</B> <I>string proc</I> +<DD><VAR>proc</VAR> must be a procedure of one argument. This procedure calls +<VAR>proc</VAR> with one argument: an (newly created) input port from which +<VAR>string</VAR>'s contents may be read. When <VAR>proc</VAR> returns, the port +is closed and the value yielded by the procedure <VAR>proc</VAR> is +returned. +</DL> +<P> + +<A NAME="Line I/O"></A> +<HR SIZE="6"> +<A NAME="SEC229"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC228"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC230"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.3.4 Line I/O </H3> +<!--docid::SEC229::--> +<P> + +<CODE>(require 'line-i/o)</CODE> +<A NAME="IDX1402"></A> +</P> +<P> + +<A NAME="IDX1403"></A> +</P> +<DL> +<DT><U>Function:</U> <B>read-line</B> +<DD><P> + +<A NAME="IDX1404"></A> +<DT><U>Function:</U> <B>read-line</B> <I>port</I> +<DD>Returns a string of the characters up to, but not including a +newline or end of file, updating <VAR>port</VAR> to point to the +character following the newline. If no characters are available, an +end of file object is returned. The <VAR>port</VAR> argument may be +omitted, in which case it defaults to the value returned by +<CODE>current-input-port</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1405"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>read-line!</B> <I>string</I> +<DD><P> + +<A NAME="IDX1406"></A> +<DT><U>Procedure:</U> <B>read-line!</B> <I>string port</I> +<DD>Fills <VAR>string</VAR> with characters up to, but not including a newline or end +of file, updating the <VAR>port</VAR> to point to the last character read +or following the newline if it was read. If no characters are +available, an end of file object is returned. If a newline or end +of file was found, the number of characters read is returned. +Otherwise, <CODE>#f</CODE> is returned. The <VAR>port</VAR> argument may be +omitted, in which case it defaults to the value returned by +<CODE>current-input-port</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1407"></A> +</P> +<DL> +<DT><U>Function:</U> <B>write-line</B> <I>string</I> +<DD><P> + +<A NAME="IDX1408"></A> +<DT><U>Function:</U> <B>write-line</B> <I>string port</I> +<DD>Writes <VAR>string</VAR> followed by a newline to the given <VAR>port</VAR> and returns +an unspecified value. The <VAR>Port</VAR> argument may be omitted, in +which case it defaults to the value returned by +<CODE>current-input-port</CODE>. +</P> +</DL> +<P> + +<A NAME="IDX1409"></A> +</P> +<DL> +<DT><U>Function:</U> <B>system->line</B> <I>command tmp</I> +<DD><P> + +<A NAME="IDX1410"></A> +<DT><U>Function:</U> <B>system->line</B> <I>command</I> +<DD><VAR>command</VAR> must be a string. The string <VAR>tmp</VAR>, if supplied, is a path to use as +a temporary file. <CODE>system->line</CODE> calls <CODE>system</CODE> with <VAR>command</VAR> as argument, +redirecting stdout to file <VAR>tmp</VAR>. <CODE>system->line</CODE> returns a string containing the +first line of output from <VAR>tmp</VAR>. +</P> +</DL> +<P> + +<A NAME="Multi-Processing"></A> +<HR SIZE="6"> +<A NAME="SEC230"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC229"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC231"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.3.5 Multi-Processing </H3> +<!--docid::SEC230::--> +<P> + +<CODE>(require 'process)</CODE> +<A NAME="IDX1411"></A> +</P> +<P> + +This module implements asynchronous (non-polled) time-sliced +multi-processing in the SCM Scheme implementation using procedures +<CODE>alarm</CODE> and <CODE>alarm-interrupt</CODE>. +<A NAME="IDX1412"></A> +<A NAME="IDX1413"></A> +Until this is ported to another implementation, consider it an example +of writing schedulers in Scheme. +</P> +<P> + +<A NAME="IDX1414"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>add-process!</B> <I>proc</I> +<DD>Adds proc, which must be a procedure (or continuation) capable of +accepting accepting one argument, to the <CODE>process:queue</CODE>. The +value returned is unspecified. The argument to <VAR>proc</VAR> should be +ignored. If <VAR>proc</VAR> returns, the process is killed. +</DL> +<P> + +<A NAME="IDX1415"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>process:schedule!</B> +<DD>Saves the current process on <CODE>process:queue</CODE> and runs the next +process from <CODE>process:queue</CODE>. The value returned is +unspecified. +</DL> +<P> + +<A NAME="IDX1416"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>kill-process!</B> +<DD>Kills the current process and runs the next process from +<CODE>process:queue</CODE>. If there are no more processes on +<CODE>process:queue</CODE>, <CODE>(slib:exit)</CODE> is called (see section <A HREF="slib_2.html#SEC17">2.4 System</A>). +</DL> +<P> + +<A NAME="Metric Units"></A> +<HR SIZE="6"> +<A NAME="SEC231"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC230"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC232"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.3.6 Metric Units </H3> +<!--docid::SEC231::--> +<P> + +<CODE>(require 'metric-units)</CODE> +<A NAME="IDX1417"></A> +</P> +<P> + +<A HREF="http://swissnet.ai.mit.edu/~jaffer/MIXF.html">http://swissnet.ai.mit.edu/~jaffer/MIXF.html</A> +</P> +<P> + +<EM>Metric Interchange Format</EM> is a character string encoding for +numerical values and units which: +</P> +<P> + +<UL> +<LI> +is unambiguous in all locales; +<P> + +</P> +<LI> +uses only [TOG] "Portable Character Set" characters matching "Basic +Latin" characters in Plane 0 of the Universal Character Set [UCS]; +<P> + +</P> +<LI> +is transparent to [UTF-7] and [UTF-8] UCS transformation formats; +<P> + +</P> +<LI> +is human readable and writable; +<P> + +</P> +<LI> +is machine readable and writable; +<P> + +</P> +<LI> +incorporates SI prefixes and units; +<P> + +</P> +<LI> +incorporates [ISO 6093] numbers; and +<P> + +</P> +<LI> +incorporates [IEC 60027-2] binary prefixes. +</UL> +<P> + +In the expression for the value of a quantity, the unit symbol is placed +after the numerical value. A dot (PERIOD, `<SAMP>.</SAMP>') is placed between +the numerical value and the unit symbol. +</P> +<P> + +Within a compound unit, each of the base and derived symbols can +optionally have an attached SI prefix. +</P> +<P> + +Unit symbols formed from other unit symbols by multiplication are +indicated by means of a dot (PERIOD, `<SAMP>.</SAMP>') placed between them. +</P> +<P> + +Unit symbols formed from other unit symbols by division are indicated by +means of a SOLIDUS (`<SAMP>/</SAMP>') or negative exponents. The SOLIDUS must +not be repeated in the same compound unit unless contained within a +parenthesized subexpression. +</P> +<P> + +The grouping formed by a prefix symbol attached to a unit symbol +constitutes a new inseparable symbol (forming a multiple or submultiple +of the unit concerned) which can be raised to a positive or negative +power and which can be combined with other unit symbols to form compound +unit symbols. +</P> +<P> + +The grouping formed by surrounding compound unit symbols with +parentheses (`<SAMP>(</SAMP>' and `<SAMP>)</SAMP>') constitutes a new inseparable symbol +which can be raised to a positive or negative power and which can be +combined with other unit symbols to form compound unit symbols. +</P> +<P> + +Compound prefix symbols, that is, prefix symbols formed by the +juxtaposition of two or more prefix symbols, are not permitted. +</P> +<P> + +Prefix symbols are not used with the time-related unit symbols min +(minute), h (hour), d (day). No prefix symbol may be used with dB +(decibel). Only submultiple prefix symbols may be used with the unit +symbols L (liter), Np (neper), o (degree), oC (degree Celsius), rad +(radian), and sr (steradian). Submultiple prefix symbols may not be +used with the unit symbols t (metric ton), r (revolution), or Bd (baud). +</P> +<P> + +A unit exponent follows the unit, separated by a CIRCUMFLEX (`<SAMP>^</SAMP>'). +Exponents may be positive or negative. Fractional exponents must be +parenthesized. +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC232"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC231"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC233"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.3.6.1 SI Prefixes </H4> +<!--docid::SEC232::--> +<TABLE><tr><td> </td><td class=example><pre> Factor Name Symbol | Factor Name Symbol + ====== ==== ====== | ====== ==== ====== + 1e24 yotta Y | 1e-1 deci d + 1e21 zetta Z | 1e-2 centi c + 1e18 exa E | 1e-3 milli m + 1e15 peta P | 1e-6 micro u + 1e12 tera T | 1e-9 nano n + 1e9 giga G | 1e-12 pico p + 1e6 mega M | 1e-15 femto f + 1e3 kilo k | 1e-18 atto a + 1e2 hecto h | 1e-21 zepto z + 1e1 deka da | 1e-24 yocto y +</pre></td></tr></table><P> + +<HR SIZE="6"> +<A NAME="SEC233"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC232"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC234"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.3.6.2 Binary Prefixes </H4> +<!--docid::SEC233::--> +<P> + +These binary prefixes are valid only with the units B (byte) and bit. +However, decimal prefixes can also be used with bit; and decimal +multiple (not submultiple) prefixes can also be used with B (byte). +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre> Factor (power-of-2) Name Symbol + ====== ============ ==== ====== + 1.152921504606846976e18 (2^60) exbi Ei + 1.125899906842624e15 (2^50) pebi Pi + 1.099511627776e12 (2^40) tebi Ti + 1.073741824e9 (2^30) gibi Gi + 1.048576e6 (2^20) mebi Mi + 1.024e3 (2^10) kibi Ki +</pre></td></tr></table><P> + +<HR SIZE="6"> +<A NAME="SEC234"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC233"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC225"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.3.6.3 Unit Symbols </H4> +<!--docid::SEC234::--> +<P> + +<TABLE><tr><td> </td><td class=example><pre> Type of Quantity Name Symbol Equivalent + ================ ==== ====== ========== +time second s +time minute min = 60.s +time hour h = 60.min +time day d = 24.h +frequency hertz Hz s^-1 +signaling rate baud Bd s^-1 +length meter m +volume liter L dm^3 +plane angle radian rad +solid angle steradian sr rad^2 +plane angle revolution * r = 6.283185307179586.rad +plane angle degree * o = 2.777777777777778e-3.r +information capacity bit bit +information capacity byte, octet B = 8.bit +mass gram g +mass ton t Mg +mass unified atomic mass unit u = 1.66053873e-27.kg +amount of substance mole mol +catalytic activity katal kat mol/s +thermodynamic temperature kelvin K +centigrade temperature degree Celsius oC +luminous intensity candela cd +luminous flux lumen lm cd.sr +illuminance lux lx lm/m^2 +force newton N m.kg.s^-2 +pressure, stress pascal Pa N/m^2 +energy, work, heat joule J N.m +energy electronvolt eV = 1.602176462e-19.J +power, radiant flux watt W J/s +logarithm of power ratio neper Np +logarithm of power ratio decibel * dB = 0.1151293.Np +electric current ampere A +electric charge coulomb C s.A +electric potential, EMF volt V W/A +capacitance farad F C/V +electric resistance ohm Ohm V/A +electric conductance siemens S A/V +magnetic flux weber Wb V.s +magnetic flux density tesla T Wb/m^2 +inductance henry H Wb/A +radionuclide activity becquerel Bq s^-1 +absorbed dose energy gray Gy m^2.s^-2 +dose equivalent sievert Sv m^2.s^-2 +</pre></td></tr></table><P> + +* The formulas are: +</P> +<P> + +<UL> +<LI> +r/rad = 8 * atan(1) +<LI> +o/r = 1 / 360 +<LI> +db/Np = ln(10) / 20 +</UL> +<P> + +<A NAME="IDX1418"></A> +</P> +<DL> +<DT><U>Function:</U> <B>si:conversion-factor</B> <I>to-unit from-unit</I> +<DD>If the strings <VAR>from-unit</VAR> and <VAR>to-unit</VAR> express valid unit +expressions for quantities of the same unit-dimensions, then the value +returned by <CODE>si:conversion-factor</CODE> will be such that multiplying a +numerical value expressed in <VAR>from-unit</VAR>s by the returned conversion +factor yields the numerical value expressed in <VAR>to-unit</VAR>s. +<P> + +Otherwise, <CODE>si:conversion-factor</CODE> returns: +</P> +<P> + +</P> +<DL COMPACT> +<DT>-3 +<DD>if neither <VAR>from-unit</VAR> nor <VAR>to-unit</VAR> is a syntactically valid +unit. +<DT>-2 +<DD>if <VAR>from-unit</VAR> is not a syntactically valid unit. +<DT>-1 +<DD>if <VAR>to-unit</VAR> is not a syntactically valid unit. +<DT>0 +<DD>if linear conversion (by a factor) is not possible. +</DL> +<P> + +</P> +</DL> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(si:conversion-factor "km/s" "m/s" ) => 0.001 +(si:conversion-factor "N" "m/s" ) => 0 +(si:conversion-factor "moC" "oC" ) => 1000 +(si:conversion-factor "mK" "oC" ) => 0 +(si:conversion-factor "rad" "o" ) => 0.0174533 +(si:conversion-factor "K" "o" ) => 0 +(si:conversion-factor "K" "K" ) => 1 +(si:conversion-factor "oK" "oK" ) => -3 +(si:conversion-factor "" "s/s" ) => 1 +(si:conversion-factor "km/h" "mph" ) => -2 +</pre></td></tr></table><P> + +<A NAME="Standards Support"></A> +<HR SIZE="6"> +<A NAME="SEC235"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC234"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC236"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 7.4 Standards Support </H2> +<!--docid::SEC235::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC236">7.4.1 RnRS</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Revised Reports on Scheme</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC237">7.4.2 With-File</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'with-file</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC238">7.4.3 Transcripts</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'transcript</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'rev2-procedures</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'rev4-optional-procedures</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'multiarg/and-</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC242">7.4.7 Multi-argument Apply</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'multiarg-apply</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC243">7.4.8 Rationalize</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'rationalize</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC244">7.4.9 Promises</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'delay</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC245">7.4.10 Dynamic-Wind</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'dynamic-wind</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC246">7.4.11 Eval</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'eval</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC247">7.4.12 Values</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'values</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC248">7.4.13 SRFI</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'http://srfi.schemers.org/srfi-0/srfi-0.html</TD></TR> +</TABLE> +<P> + +<A NAME="RnRS"></A> +<HR SIZE="6"> +<A NAME="SEC236"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC237"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.1 RnRS </H3> +<!--docid::SEC236::--> +<P> + +The <CODE>r2rs</CODE>, <CODE>r3rs</CODE>, <CODE>r4rs</CODE>, and <CODE>r5rs</CODE> features +attempt to provide procedures and macros to bring a Scheme +implementation to the desired version of Scheme. +</P> +<P> + +<A NAME="IDX1419"></A> +</P> +<DL> +<DT><U>Feature:</U> <B>r2rs</B> +<DD><A NAME="IDX1420"></A> +Requires features implementing procedures and optional procedures +specified by <CITE>Revised^2 Report on the Algorithmic Language Scheme</CITE>; +namely <CODE>rev3-procedures</CODE> and <CODE>rev2-procedures</CODE>. +</DL> +<P> + +<A NAME="IDX1421"></A> +</P> +<DL> +<DT><U>Feature:</U> <B>r3rs</B> +<DD><A NAME="IDX1422"></A> +Requires features implementing procedures and optional procedures +specified by <CITE>Revised^3 Report on the Algorithmic Language Scheme</CITE>; +namely <CODE>rev3-procedures</CODE>. +<P> + +<EM>Note:</EM> SLIB already mandates the <CODE>r3rs</CODE> procedures which can +be portably implemented in <CODE>r4rs</CODE> implementations. +</P> +</DL> +<P> + +<A NAME="IDX1423"></A> +</P> +<DL> +<DT><U>Feature:</U> <B>r4rs</B> +<DD><A NAME="IDX1424"></A> +Requires features implementing procedures and optional procedures +specified by <CITE>Revised^4 Report on the Algorithmic Language Scheme</CITE>; +namely <CODE>rev4-optional-procedures</CODE>. +</DL> +<P> + +<A NAME="IDX1425"></A> +</P> +<DL> +<DT><U>Feature:</U> <B>r5rs</B> +<DD><A NAME="IDX1426"></A> +Requires features implementing procedures and optional procedures +specified by <CITE>Revised^5 Report on the Algorithmic Language Scheme</CITE>; +namely <CODE>values</CODE>, <CODE>macro</CODE>, and <CODE>eval</CODE>. +</DL> +<P> + +<A NAME="With-File"></A> +<HR SIZE="6"> +<A NAME="SEC237"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC236"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC238"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.2 With-File </H3> +<!--docid::SEC237::--> +<P> + +<CODE>(require 'with-file)</CODE> +<A NAME="IDX1427"></A> +</P> +<P> + +<A NAME="IDX1428"></A> +</P> +<DL> +<DT><U>Function:</U> <B>with-input-from-file</B> <I>file thunk</I> +<DD><A NAME="IDX1429"></A> +<DT><U>Function:</U> <B>with-output-to-file</B> <I>file thunk</I> +<DD>Description found in R4RS. +</DL> +<P> + +<A NAME="Transcripts"></A> +<HR SIZE="6"> +<A NAME="SEC238"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC237"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC239"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.3 Transcripts </H3> +<!--docid::SEC238::--> +<P> + +<CODE>(require 'transcript)</CODE> +<A NAME="IDX1430"></A> +</P> +<P> + +<A NAME="IDX1431"></A> +</P> +<DL> +<DT><U>Function:</U> <B>transcript-on</B> <I>filename</I> +<DD><A NAME="IDX1432"></A> +<DT><U>Function:</U> <B>transcript-off</B> <I>filename</I> +<DD>Redefines <CODE>read-char</CODE>, <CODE>read</CODE>, <CODE>write-char</CODE>, +<CODE>write</CODE>, <CODE>display</CODE>, and <CODE>newline</CODE>. +</DL> +<P> + +<A NAME="Rev2 Procedures"></A> +<HR SIZE="6"> +<A NAME="SEC239"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC238"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC240"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.4 Rev2 Procedures </H3> +<!--docid::SEC239::--> +<P> + +<CODE>(require 'rev2-procedures)</CODE> +<A NAME="IDX1433"></A> +</P> +<P> + +The procedures below were specified in the <CITE>Revised^2 Report on +Scheme</CITE>. <STRONG>N.B.</STRONG>: The symbols <CODE>1+</CODE> and <CODE>-1+</CODE> are not +<CITE>R4RS</CITE> syntax. Scheme->C, for instance, chokes on this +module. +</P> +<P> + +<A NAME="IDX1434"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>substring-move-left!</B> <I>string1 start1 end1 string2 start2</I> +<DD><A NAME="IDX1435"></A> +<DT><U>Procedure:</U> <B>substring-move-right!</B> <I>string1 start1 end1 string2 start2</I> +<DD><VAR>string1</VAR> and <VAR>string2</VAR> must be a strings, and <VAR>start1</VAR>, +<VAR>start2</VAR> and <VAR>end1</VAR> must be exact integers satisfying +<P> + +<TABLE><tr><td> </td><td class=display><pre style="font-family: serif">0 <= <VAR>start1</VAR> <= <VAR>end1</VAR> <= (string-length <VAR>string1</VAR>) +0 <= <VAR>start2</VAR> <= <VAR>end1</VAR> - <VAR>start1</VAR> + <VAR>start2</VAR> <= (string-length <VAR>string2</VAR>) +</pre></td></tr></table><P> + +<CODE>substring-move-left!</CODE> and <CODE>substring-move-right!</CODE> store +characters of <VAR>string1</VAR> beginning with index <VAR>start1</VAR> +(inclusive) and ending with index <VAR>end1</VAR> (exclusive) into +<VAR>string2</VAR> beginning with index <VAR>start2</VAR> (inclusive). +</P> +<P> + +<CODE>substring-move-left!</CODE> stores characters in time order of +increasing indices. <CODE>substring-move-right!</CODE> stores characters in +time order of increasing indeces. +</P> +</DL> +<P> + +<A NAME="IDX1436"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>substring-fill!</B> <I>string start end char</I> +<DD>Fills the elements <VAR>start</VAR>--<VAR>end</VAR> of <VAR>string</VAR> with the +character <VAR>char</VAR>. +</DL> +<P> + +<A NAME="IDX1437"></A> +</P> +<DL> +<DT><U>Function:</U> <B>string-null?</B> <I>str</I> +<DD>== <CODE>(= 0 (string-length <VAR>str</VAR>))</CODE> +</DL> +<P> + +<A NAME="IDX1438"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>append!</B> <I>pair1 <small>...</small></I> +<DD>Destructively appends its arguments. Equivalent to <CODE>nconc</CODE>. +</DL> +<P> + +<A NAME="IDX1439"></A> +</P> +<DL> +<DT><U>Function:</U> <B>1+</B> <I>n</I> +<DD>Adds 1 to <VAR>n</VAR>. +</DL> +<P> + +<A NAME="IDX1440"></A> +</P> +<DL> +<DT><U>Function:</U> <B>-1+</B> <I>n</I> +<DD>Subtracts 1 from <VAR>n</VAR>. +</DL> +<P> + +<A NAME="IDX1441"></A> +</P> +<DL> +<DT><U>Function:</U> <B><?</B> +<DD><A NAME="IDX1442"></A> +<DT><U>Function:</U> <B><=?</B> +<DD><A NAME="IDX1443"></A> +<DT><U>Function:</U> <B>=?</B> +<DD><A NAME="IDX1444"></A> +<DT><U>Function:</U> <B>>?</B> +<DD><A NAME="IDX1445"></A> +<DT><U>Function:</U> <B>>=?</B> +<DD>These are equivalent to the procedures of the same name but without the +trailing `<SAMP>?</SAMP>'. +</DL> +<P> + +<A NAME="Rev4 Optional Procedures"></A> +<HR SIZE="6"> +<A NAME="SEC240"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC239"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC241"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.5 Rev4 Optional Procedures </H3> +<!--docid::SEC240::--> +<P> + +<CODE>(require 'rev4-optional-procedures)</CODE> +<A NAME="IDX1446"></A> +</P> +<P> + +For the specification of these optional procedures, +See section `Standard procedures' in <CITE>Revised(4) Scheme</CITE>. +</P> +<P> + +<A NAME="IDX1447"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list-tail</B> <I>l p</I> +<DD></DL> +<P> + +<A NAME="IDX1448"></A> +</P> +<DL> +<DT><U>Function:</U> <B>string->list</B> <I>s</I> +<DD></DL> +<P> + +<A NAME="IDX1449"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list->string</B> <I>l</I> +<DD></DL> +<P> + +<A NAME="IDX1450"></A> +</P> +<DL> +<DT><U>Function:</U> <B>string-copy</B> +<DD></DL> +<P> + +<A NAME="IDX1451"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>string-fill!</B> <I>s obj</I> +<DD></DL> +<P> + +<A NAME="IDX1452"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list->vector</B> <I>l</I> +<DD></DL> +<P> + +<A NAME="IDX1453"></A> +</P> +<DL> +<DT><U>Function:</U> <B>vector->list</B> <I>s</I> +<DD></DL> +<P> + +<A NAME="IDX1454"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>vector-fill!</B> <I>s obj</I> +<DD></DL> +<P> + +<A NAME="Multi-argument / and -"></A> +<HR SIZE="6"> +<A NAME="SEC241"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC240"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC242"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.6 Multi-argument / and - </H3> +<!--docid::SEC241::--> +<P> + +<CODE>(require 'multiarg/and-)</CODE> +<A NAME="IDX1455"></A> +</P> +<P> + +For the specification of these optional forms, See section `Numerical operations' in <CITE>Revised(4) Scheme</CITE>. +</P> +<P> + +<A NAME="IDX1456"></A> +</P> +<DL> +<DT><U>Function:</U> <B>/</B> <I>dividend divisor1 <small>...</small></I> +<DD></DL> +<P> + +<A NAME="IDX1457"></A> +</P> +<DL> +<DT><U>Function:</U> <B>-</B> <I>minuend subtrahend1 <small>...</small></I> +<DD></DL> +<P> + +<A NAME="Multi-argument Apply"></A> +<HR SIZE="6"> +<A NAME="SEC242"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC241"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC243"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.7 Multi-argument Apply </H3> +<!--docid::SEC242::--> +<P> + +<CODE>(require 'multiarg-apply)</CODE> +<A NAME="IDX1458"></A> +</P> +<P> + +For the specification of this optional form, +See section `Control features' in <CITE>Revised(4) Scheme</CITE>. +</P> +<P> + +<A NAME="IDX1459"></A> +</P> +<DL> +<DT><U>Function:</U> <B>apply</B> <I>proc arg1 <small>...</small></I> +<DD></DL> +<P> + +<A NAME="Rationalize"></A> +<HR SIZE="6"> +<A NAME="SEC243"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC242"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC244"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.8 Rationalize </H3> +<!--docid::SEC243::--> +<P> + +<CODE>(require 'rationalize)</CODE> +<A NAME="IDX1460"></A> +</P> +<P> + +<A NAME="IDX1461"></A> +</P> +<DL> +<DT><U>Function:</U> <B>rationalize</B> <I>x e</I> +<DD><P> + +Computes the correct result for exact arguments (provided the +implementation supports exact rational numbers of unlimited precision); +and produces a reasonable answer for inexact arguments when inexact +arithmetic is implemented using floating-point. +</P> +<P> + +</P> +</DL> +<CODE>Rationalize</CODE> has limited use in implementations lacking exact +(non-integer) rational numbers. The following procedures return a list +of the numerator and denominator. +<P> + +<A NAME="IDX1462"></A> +</P> +<DL> +<DT><U>Function:</U> <B>find-ratio</B> <I>x e</I> +<DD><P> + +<CODE>find-ratio</CODE> returns the list of the <EM>simplest</EM> +numerator and denominator whose quotient differs from <VAR>x</VAR> by no more +than <VAR>e</VAR>. +</P> +<P> + +<TABLE><tr><td> </td><td class=display><pre style="font-family: serif"><TT>(find-ratio 3/97 .0001) => (3 97) +(find-ratio 3/97 .001) => (1 32) +</TT> +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1463"></A> +</P> +<DL> +<DT><U>Function:</U> <B>find-ratio-between</B> <I>x y</I> +<DD><P> + +<CODE>find-ratio-between</CODE> returns the list of the <EM>simplest</EM> +numerator and denominator between <VAR>x</VAR> and <VAR>y</VAR>. +</P> +<P> + +<TABLE><tr><td> </td><td class=display><pre style="font-family: serif"><TT>(find-ratio-between 2/7 3/5) => (1 2) +(find-ratio-between -3/5 -2/7) => (-1 2) +</TT> +</pre></td></tr></table></DL> +<P> + +<A NAME="Promises"></A> +<HR SIZE="6"> +<A NAME="SEC244"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC243"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC245"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.9 Promises </H3> +<!--docid::SEC244::--> +<P> + +<CODE>(require 'promise)</CODE> +<A NAME="IDX1464"></A> +</P> +<P> + +<A NAME="IDX1465"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-promise</B> <I>proc</I> +<DD></DL> +<P> + +<A NAME="IDX1466"></A> +</P> +<DL> +<DT><U>Function:</U> <B>force</B> <I>promise</I> +<DD></DL> +<P> + +<CODE>(require 'delay)</CODE> provides <CODE>force</CODE> and <CODE>delay</CODE>: +</P> +<P> + +<A NAME="IDX1467"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>delay</B> <I>obj</I> +<DD>Change occurrences of <CODE>(delay <VAR>expression</VAR>)</CODE> to +<P> + +<TABLE><tr><td> </td><td class=example><pre>(make-promise (lambda () <VAR>expression</VAR>)) +</pre></td></tr></table><P> + +</P> +</DL> +<P> + +(see section `Control features' in <CITE>Revised(4) Scheme</CITE>). +</P> +<P> + +<A NAME="Dynamic-Wind"></A> +<HR SIZE="6"> +<A NAME="SEC245"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC244"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC246"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.10 Dynamic-Wind </H3> +<!--docid::SEC245::--> +<P> + +<CODE>(require 'dynamic-wind)</CODE> +<A NAME="IDX1468"></A> +</P> +<P> + +This facility is a generalization of Common LISP <CODE>unwind-protect</CODE>, +designed to take into account the fact that continuations produced by +<CODE>call-with-current-continuation</CODE> may be reentered. +</P> +<P> + +<A NAME="IDX1469"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>dynamic-wind</B> <I>thunk1 thunk2 thunk3</I> +<DD>The arguments <VAR>thunk1</VAR>, <VAR>thunk2</VAR>, and <VAR>thunk3</VAR> must all be +procedures of no arguments (thunks). +<P> + +<CODE>dynamic-wind</CODE> calls <VAR>thunk1</VAR>, <VAR>thunk2</VAR>, and then +<VAR>thunk3</VAR>. The value returned by <VAR>thunk2</VAR> is returned as the +result of <CODE>dynamic-wind</CODE>. <VAR>thunk3</VAR> is also called just before +control leaves the dynamic context of <VAR>thunk2</VAR> by calling a +continuation created outside that context. Furthermore, <VAR>thunk1</VAR> is +called before reentering the dynamic context of <VAR>thunk2</VAR> by calling +a continuation created inside that context. (Control is inside the +context of <VAR>thunk2</VAR> if <VAR>thunk2</VAR> is on the current return stack). +</P> +<P> + +<STRONG>Warning:</STRONG> There is no provision for dealing with errors or +interrupts. If an error or interrupt occurs while using +<CODE>dynamic-wind</CODE>, the dynamic environment will be that in effect at +the time of the error or interrupt. +</P> +</DL> +<P> + +<A NAME="Eval"></A> +<HR SIZE="6"> +<A NAME="SEC246"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC245"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC247"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.11 Eval </H3> +<!--docid::SEC246::--> +<P> + +<CODE>(require 'eval)</CODE> +<A NAME="IDX1470"></A> +</P> +<P> + +<A NAME="IDX1471"></A> +</P> +<DL> +<DT><U>Function:</U> <B>eval</B> <I>expression environment-specifier</I> +<DD><P> + +Evaluates <VAR>expression</VAR> in the specified environment and returns its +value. <VAR>Expression</VAR> must be a valid Scheme expression represented +as data, and <VAR>environment-specifier</VAR> must be a value returned by one +of the three procedures described below. Implementations may extend +<CODE>eval</CODE> to allow non-expression programs (definitions) as the first +argument and to allow other values as environments, with the restriction +that <CODE>eval</CODE> is not allowed to create new bindings in the +environments associated with <CODE>null-environment</CODE> or +<CODE>scheme-report-environment</CODE>. +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(eval '(* 7 3) (scheme-report-environment 5)) + => 21 + +(let ((f (eval '(lambda (f x) (f x x)) + (null-environment)))) + (f + 10)) + => 20 +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1472"></A> +</P> +<DL> +<DT><U>Function:</U> <B>scheme-report-environment</B> <I>version</I> +<DD><A NAME="IDX1473"></A> +<DT><U>Function:</U> <B>null-environment</B> <I>version</I> +<DD><A NAME="IDX1474"></A> +<DT><U>Function:</U> <B>null-environment</B> +<DD><P> + +<VAR>Version</VAR> must be an exact non-negative integer <VAR>n</VAR> +corresponding to a version of one of the Revised^<VAR>n</VAR> Reports on +Scheme. <CODE>Scheme-report-environment</CODE> returns a specifier for an +environment that contains the set of bindings specified in the +corresponding report that the implementation supports. +<CODE>Null-environment</CODE> returns a specifier for an environment that +contains only the (syntactic) bindings for all the syntactic keywords +defined in the given version of the report. +</P> +<P> + +Not all versions may be available in all implementations at all times. +However, an implementation that conforms to version <VAR>n</VAR> of the +Revised^<VAR>n</VAR> Reports on Scheme must accept version <VAR>n</VAR>. An error +is signalled if the specified version is not available. +</P> +<P> + +The effect of assigning (through the use of <CODE>eval</CODE>) a variable +bound in a <CODE>scheme-report-environment</CODE> (for example <CODE>car</CODE>) is +unspecified. Thus the environments specified by +<CODE>scheme-report-environment</CODE> may be immutable. +</P> +<P> + +</P> +</DL> +<P> + +<A NAME="IDX1475"></A> +</P> +<DL> +<DT><U>Function:</U> <B>interaction-environment</B> +<DD><P> + +This optional procedure returns a specifier for the environment that +contains implementation-defined bindings, typically a superset of those +listed in the report. The intent is that this procedure will return the +environment in which the implementation would evaluate expressions +dynamically typed by the user. +</P> +</DL> +<P> + +Here are some more <CODE>eval</CODE> examples: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'eval) +=> #<unspecified> +(define car 'volvo) +=> #<unspecified> +car +=> volvo +(eval 'car (interaction-environment)) +=> volvo +(eval 'car (scheme-report-environment 5)) +=> #<primitive-procedure car> +(eval '(eval 'car (interaction-environment)) + (scheme-report-environment 5)) +=> volvo +(eval '(eval '(set! car 'buick) (interaction-environment)) + (scheme-report-environment 5)) +=> #<unspecified> +car +=> buick +(eval 'car (scheme-report-environment 5)) +=> #<primitive-procedure car> +(eval '(eval 'car (interaction-environment)) + (scheme-report-environment 5)) +=> buick +</pre></td></tr></table><P> + +<A NAME="Values"></A> +<HR SIZE="6"> +<A NAME="SEC247"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC246"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.12 Values </H3> +<!--docid::SEC247::--> +<P> + +<CODE>(require 'values)</CODE> +<A NAME="IDX1476"></A> +</P> +<P> + +<A NAME="IDX1477"></A> +</P> +<DL> +<DT><U>Function:</U> <B>values</B> <I>obj <small>...</small></I> +<DD><CODE>values</CODE> takes any number of arguments, and passes (returns) them +to its continuation. +</DL> +<P> + +<A NAME="IDX1478"></A> +</P> +<DL> +<DT><U>Function:</U> <B>call-with-values</B> <I>thunk proc</I> +<DD><VAR>thunk</VAR> must be a procedure of no arguments, and <VAR>proc</VAR> must be +a procedure. <CODE>call-with-values</CODE> calls <VAR>thunk</VAR> with a +continuation that, when passed some values, calls <VAR>proc</VAR> with those +values as arguments. +<P> + +Except for continuations created by the <CODE>call-with-values</CODE> +procedure, all continuations take exactly one value, as now; the effect +of passing no value or more than one value to continuations that were +not created by the <CODE>call-with-values</CODE> procedure is +unspecified. +</P> +</DL> +<P> + +<A NAME="SRFI"></A> +<HR SIZE="6"> +<A NAME="SEC248"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC247"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC249"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC235"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.4.13 SRFI </H3> +<!--docid::SEC248::--> +<P> + +<CODE>(require 'srfi)</CODE> +<A NAME="IDX1479"></A> +</P> +<P> + +Implements <EM>Scheme Request For Implementation</EM> (SRFI) as +<A NAME="IDX1480"></A> +described at <A HREF="http://srfi.schemers.org/">http://srfi.schemers.org/</A> +</P> +<P> + +The Copyright terms of each SRFI states: +<BLOCKQUOTE> +"However, this document itself may not be modified in any way, ..." +</BLOCKQUOTE> +<P> + +Therefore, the specification of SRFI constructs must not be +quoted without including the complete SRFI document containing +discussion and a sample implementation program. +</P> +<P> + +<A NAME="IDX1481"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>cond-expand</B> <I><clause1> <clause2> <small>...</small></I> +<DD><P> + +<EM>Syntax:</EM> +Each <clause> should be of the form +</P> +<P> + +<TABLE><tr><td> </td><td class=display><pre style="font-family: serif"><TT>(<feature> <expression1> <small>...</small>)</TT> +</pre></td></tr></table><P> + +where <feature> is a boolean expression composed of symbols and +`and', `or', and `not' of boolean expressions. The last <clause> +may be an "else clause," which has the form +</P> +<P> + +<TABLE><tr><td> </td><td class=display><pre style="font-family: serif"><TT>(else <expression1> <expression2> <small>...</small>).</TT> +</pre></td></tr></table><P> + +The first clause whose feature expression is satisfied is expanded. +If no feature expression is satisfied and there is no else clause, an +error is signaled. +</P> +<P> + +SLIB <CODE>cond-expand</CODE> is an extension of SRFI-0, +<A HREF="http://srfi.schemers.org/srfi-0/srfi-0.html">http://srfi.schemers.org/srfi-0/srfi-0.html</A>. +</P> +</DL> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">list-processing</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC260">7.4.13.2 SRFI-2</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">guarded LET* special form</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC261">7.4.13.3 SRFI-8</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Binding to multiple values</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC262">7.4.13.4 SRFI-9</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Defining Record Types</TD></TR> +</TABLE> +<P> + +<A NAME="SRFI-1"></A> +<HR SIZE="6"> +<A NAME="SEC249"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC260"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.4.13.1 SRFI-1 </H4> +<!--docid::SEC249::--> +<P> + +<CODE>(require 'srfi-1)</CODE> +<A NAME="IDX1482"></A> +</P> +<P> + +Implements the <EM>SRFI-1</EM> <EM>list-processing library</EM> as described +<A NAME="IDX1483"></A> +<A NAME="IDX1484"></A> +at <A HREF="http://srfi.schemers.org/srfi-1/srfi-1.html">http://srfi.schemers.org/srfi-1/srfi-1.html</A> +</P> +<P> + +<A NAME="SEC250"></A> +<H3> Constructors </H3> +<!--docid::SEC250::--> +<P> + +<A NAME="IDX1485"></A> +</P> +<DL> +<DT><U>Function:</U> <B>xcons</B> <I>d a</I> +<DD><CODE>(define (xcons d a) (cons a d))</CODE>. +</DL> +<P> + +<A NAME="IDX1486"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list-tabulate</B> <I>len proc</I> +<DD>Returns a list of length <VAR>len</VAR>. Element <VAR>i</VAR> is <CODE>(<VAR>proc</VAR> +<VAR>i</VAR>)</CODE> for 0 <= <VAR>i</VAR> < <VAR>len</VAR>. +</DL> +<P> + +<A NAME="IDX1487"></A> +</P> +<DL> +<DT><U>Function:</U> <B>cons*</B> <I>obj1 obj2</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1488"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list-copy</B> <I>flist</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1489"></A> +</P> +<DL> +<DT><U>Function:</U> <B>iota</B> <I>count start step</I> +<DD><P> + +<A NAME="IDX1490"></A> +<DT><U>Function:</U> <B>iota</B> <I>count start</I> +<DD></P> +<P> + +<A NAME="IDX1491"></A> +<DT><U>Function:</U> <B>iota</B> <I>count</I> +<DD>Returns a list of <VAR>count</VAR> numbers: (<VAR>start</VAR>, <VAR>start</VAR>+<VAR>step</VAR>, <small>...</small>, <VAR>start</VAR>+(<VAR>count</VAR>-1)*<VAR>step</VAR>). +</P> +</DL> +<P> + +<A NAME="IDX1492"></A> +</P> +<DL> +<DT><U>Function:</U> <B>circular-list</B> <I>obj1 obj2 <small>...</small></I> +<DD><P> + +Returns a circular list of <VAR>obj1</VAR>, <VAR>obj2</VAR>, <small>...</small>. +</P> +</DL> +<A NAME="SEC251"></A> +<H3> Predicates </H3> +<!--docid::SEC251::--> +<P> + +<A NAME="IDX1493"></A> +</P> +<DL> +<DT><U>Function:</U> <B>proper-list?</B> <I>obj</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1494"></A> +</P> +<DL> +<DT><U>Function:</U> <B>circular-list?</B> <I>x</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1495"></A> +</P> +<DL> +<DT><U>Function:</U> <B>dotted-list?</B> <I>obj</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1496"></A> +</P> +<DL> +<DT><U>Function:</U> <B>null-list?</B> <I>obj</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1497"></A> +</P> +<DL> +<DT><U>Function:</U> <B>not-pair?</B> <I>obj</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1498"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list=</B> <I>=pred list <small>...</small></I> +<DD><P> + +</P> +</DL> +<A NAME="SEC252"></A> +<H3> Selectors </H3> +<!--docid::SEC252::--> +<P> + +<A NAME="IDX1499"></A> +</P> +<DL> +<DT><U>Function:</U> <B>first</B> <I>pair</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1500"></A> +</P> +<DL> +<DT><U>Function:</U> <B>second</B> <I>pair</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1501"></A> +</P> +<DL> +<DT><U>Function:</U> <B>third</B> <I>pair</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1502"></A> +</P> +<DL> +<DT><U>Function:</U> <B>fourth</B> <I>pair</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1503"></A> +</P> +<DL> +<DT><U>Function:</U> <B>fifth</B> <I>pair</I> +<DD><A NAME="IDX1504"></A> +<DT><U>Function:</U> <B>sixth</B> <I>obj</I> +<DD><A NAME="IDX1505"></A> +<DT><U>Function:</U> <B>seventh</B> <I>obj</I> +<DD><A NAME="IDX1506"></A> +<DT><U>Function:</U> <B>eighth</B> <I>obj</I> +<DD><A NAME="IDX1507"></A> +<DT><U>Function:</U> <B>ninth</B> <I>obj</I> +<DD><A NAME="IDX1508"></A> +<DT><U>Function:</U> <B>tenth</B> <I>obj</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1509"></A> +</P> +<DL> +<DT><U>Function:</U> <B>car+cdr</B> <I>pair</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1510"></A> +</P> +<DL> +<DT><U>Function:</U> <B>drop</B> <I>lst k</I> +<DD><A NAME="IDX1511"></A> +<DT><U>Function:</U> <B>take</B> <I>lst k</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1512"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>take!</B> <I>lst k</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1513"></A> +</P> +<DL> +<DT><U>Function:</U> <B>take-right</B> <I>lst k</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1514"></A> +</P> +<DL> +<DT><U>Function:</U> <B>drop-right</B> <I>lst k</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1515"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>drop-right!</B> <I>lst k</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1516"></A> +</P> +<DL> +<DT><U>Function:</U> <B>split-at</B> <I>lst k</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1517"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>split-at!</B> <I>lst k</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1518"></A> +</P> +<DL> +<DT><U>Function:</U> <B>last</B> <I>lst</I> +<DD><P> + +(car (last-pair lst)) +</P> +</DL> +<A NAME="SEC253"></A> +<H3> Miscellaneous </H3> +<!--docid::SEC253::--> +<P> + +<A NAME="IDX1519"></A> +</P> +<DL> +<DT><U>Function:</U> <B>length+</B> <I>obj</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1520"></A> +</P> +<DL> +<DT><U>Function:</U> <B>concatenate</B> <I>lists</I> +<DD><A NAME="IDX1521"></A> +<DT><U>Function:</U> <B>concatenate!</B> <I>lists</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1522"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>reverse!</B> <I>lst</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1523"></A> +</P> +<DL> +<DT><U>Function:</U> <B>append-reverse</B> <I>rev-head tail</I> +<DD><A NAME="IDX1524"></A> +<DT><U>Function:</U> <B>append-reverse!</B> <I>rev-head tail</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1525"></A> +</P> +<DL> +<DT><U>Function:</U> <B>zip</B> <I>list1 list2 <small>...</small></I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1526"></A> +</P> +<DL> +<DT><U>Function:</U> <B>unzip1</B> <I>lst</I> +<DD><A NAME="IDX1527"></A> +<DT><U>Function:</U> <B>unzip2</B> <I>lst</I> +<DD><A NAME="IDX1528"></A> +<DT><U>Function:</U> <B>unzip3</B> <I>lst</I> +<DD><A NAME="IDX1529"></A> +<DT><U>Function:</U> <B>unzip4</B> <I>lst</I> +<DD><A NAME="IDX1530"></A> +<DT><U>Function:</U> <B>unzip5</B> <I>lst</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1531"></A> +</P> +<DL> +<DT><U>Function:</U> <B>count</B> <I>pred list1 list2 <small>...</small></I> +<DD><P> + +</P> +</DL> +<A NAME="SEC254"></A> +<H3> Fold and Unfold </H3> +<!--docid::SEC254::--> +<P> + +<A NAME="IDX1532"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>map!</B> <I>f list1 clist2 <small>...</small></I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1533"></A> +</P> +<DL> +<DT><U>Function:</U> <B>pair-for-each</B> <I>f clist1 clist2 <small>...</small></I> +<DD><P> + +</P> +</DL> +<A NAME="SEC255"></A> +<H3> Filtering and Partitioning </H3> +<!--docid::SEC255::--> +<P> + +<A NAME="IDX1534"></A> +</P> +<DL> +<DT><U>Function:</U> <B>filter</B> <I>pred lis</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1535"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>filter!</B> <I>pred l</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1536"></A> +</P> +<DL> +<DT><U>Function:</U> <B>partition</B> <I>pred list</I> +<DD><P> + +</P> +</DL> +<A NAME="SEC256"></A> +<H3> Searching </H3> +<!--docid::SEC256::--> +<P> + +<A NAME="IDX1537"></A> +</P> +<DL> +<DT><U>Function:</U> <B>find</B> <I>pred list</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1538"></A> +</P> +<DL> +<DT><U>Function:</U> <B>find-tail</B> <I>pred list</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1539"></A> +</P> +<DL> +<DT><U>Function:</U> <B>remove</B> <I>pred l</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1540"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>remove!</B> <I>pred l</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1541"></A> +</P> +<DL> +<DT><U>Function:</U> <B>any</B> <I>pred clist1 clist2 <small>...</small></I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1542"></A> +</P> +<DL> +<DT><U>Function:</U> <B>list-index</B> <I>pred clist1 clist2 <small>...</small></I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1543"></A> +</P> +<DL> +<DT><U>Function:</U> <B>span</B> <I>pred list</I> +<DD><P> + +</P> +</DL> +<P> + +<A NAME="IDX1544"></A> +</P> +<DL> +<DT><U>Function:</U> <B>member</B> <I>obj list pred</I> +<DD><P> + +<A NAME="IDX1545"></A> +<DT><U>Function:</U> <B>member</B> <I>obj list</I> +<DD></P> +<P> + +<CODE>member</CODE> returns the first sublist of <VAR>list</VAR> whose car is <VAR>obj</VAR>, where the sublists +of <VAR>list</VAR> are the non-empty lists returned by <TT>(list-tail <VAR>list</VAR> <VAR>k</VAR>)</TT> +for <VAR>k</VAR> less than the length of <VAR>list</VAR>. If <VAR>obj</VAR> does not occur in <VAR>list</VAR>, +then <TT>#f</TT> (not the empty list) is returned. The procedure <VAR>pred</VAR> is +used for testing equality. If <VAR>pred</VAR> is not provided, `<SAMP>equal?</SAMP>' is +used. +</P> +</DL> +<A NAME="SEC257"></A> +<H3> Deleting </H3> +<!--docid::SEC257::--> +<P> + +<A NAME="SEC258"></A> +<H3> Association lists </H3> +<!--docid::SEC258::--> +<P> + +<A NAME="IDX1546"></A> +</P> +<DL> +<DT><U>Function:</U> <B>assoc</B> <I>obj alist pred</I> +<DD><P> + +<A NAME="IDX1547"></A> +<DT><U>Function:</U> <B>assoc</B> <I>obj alist</I> +<DD></P> +<P> + +<VAR>alist</VAR> (for "association list") must be a list of pairs. These +procedures find the first pair in <VAR>alist</VAR> whose car field is <VAR>obj</VAR>, and +returns that pair. If no pair in <VAR>alist</VAR> has <VAR>obj</VAR> as its car, then <TT>#f</TT> +(not the empty list) is returned. The procedure <VAR>pred</VAR> is used for +testing equality. If <VAR>pred</VAR> is not provided, `<SAMP>equal?</SAMP>' is used. +</P> +</DL> +<A NAME="SEC259"></A> +<H3> Set operations </H3> +<!--docid::SEC259::--> +<P> + +<A NAME="SRFI-2"></A> +<HR SIZE="6"> +<A NAME="SEC260"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC249"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC261"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.4.13.2 SRFI-2 </H4> +<!--docid::SEC260::--> +<P> + +<CODE>(require 'srfi-2)</CODE> +<A NAME="IDX1548"></A> +</P> +<P> + +<A NAME="IDX1549"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>and-let*</B> <I>claws body <small>...</small></I> +<DD><P> + +<A HREF="http://srfi.schemers.org/srfi-2/srfi-2.html">http://srfi.schemers.org/srfi-2/srfi-2.html</A> +</P> +</DL> +<P> + +<A NAME="SRFI-8"></A> +<HR SIZE="6"> +<A NAME="SEC261"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC260"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC262"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.4.13.3 SRFI-8 </H4> +<!--docid::SEC261::--> +<P> + +<CODE>(require 'srfi-8)</CODE> +<A NAME="IDX1550"></A> +</P> +<P> + +<A NAME="IDX1551"></A> +</P> +<DL> +<DT><U>Special Form:</U> <B>receive</B> <I>formals expression body <small>...</small></I> +<DD><P> + +<A HREF="http://srfi.schemers.org/srfi-8/srfi-8.html">http://srfi.schemers.org/srfi-8/srfi-8.html</A> +</P> +</DL> +<P> + +<A NAME="SRFI-9"></A> +<HR SIZE="6"> +<A NAME="SEC262"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC261"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC248"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H4> 7.4.13.4 SRFI-9 </H4> +<!--docid::SEC262::--> +<P> + +<CODE>(require 'srfi-9)</CODE> +<A NAME="IDX1552"></A> +</P> +<P> + +<A HREF="http://srfi.schemers.org/srfi-9/srfi-9.html">http://srfi.schemers.org/srfi-9/srfi-9.html</A> +</P> +<P> + +<A NAME="IDX1553"></A> +</P> +<DL> +<DT><U>Special Form:</U> <B>define-record-type</B> <I><type-name> (<constructor-name> <field-tag> ...) <predicate-name> <field spec> ...</I> +<DD><P> + +Where +<TABLE><tr><td> </td><td class=example><pre><field-spec> == (<field-tag> <accessor-name>) + == (<field-tag> <accessor-name> <modifier-name>) + +</pre></td></tr></table><P> + +<CODE>define-record-type</CODE> is a syntax wrapper for the SLIB +<CODE>record</CODE> module. +</P> +</DL> +<P> + +<A NAME="Session Support"></A> +<HR SIZE="6"> +<A NAME="SEC263"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC262"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC264"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 7.5 Session Support </H2> +<!--docid::SEC263::--> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC264">7.5.1 Repl</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Macros at top-level</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC265">7.5.2 Quick Print</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Loop-safe Output</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">To err is human ...</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Pause execution</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC268">7.5.5 Tracing</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">'trace</TD></TR> +</TABLE> +<P> + +<A NAME="Repl"></A> +<HR SIZE="6"> +<A NAME="SEC264"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC265"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.5.1 Repl </H3> +<!--docid::SEC264::--> +<P> + +<CODE>(require 'repl)</CODE> +<A NAME="IDX1554"></A> +</P> +<P> + +Here is a read-eval-print-loop which, given an eval, evaluates forms. +</P> +<P> + +<A NAME="IDX1555"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>repl:top-level</B> <I>repl:eval</I> +<DD><CODE>read</CODE>s, <CODE>repl:eval</CODE>s and <CODE>write</CODE>s expressions from +<CODE>(current-input-port)</CODE> to <CODE>(current-output-port)</CODE> until an +end-of-file is encountered. <CODE>load</CODE>, <CODE>slib:eval</CODE>, +<CODE>slib:error</CODE>, and <CODE>repl:quit</CODE> dynamically bound during +<CODE>repl:top-level</CODE>. +</DL> +<P> + +<A NAME="IDX1556"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>repl:quit</B> +<DD>Exits from the invocation of <CODE>repl:top-level</CODE>. +</DL> +<P> + +The <CODE>repl:</CODE> procedures establish, as much as is possible to do +portably, a top level environment supporting macros. +<CODE>repl:top-level</CODE> uses <CODE>dynamic-wind</CODE> to catch error conditions +and interrupts. If your implementation supports this you are all set. +</P> +<P> + +Otherwise, if there is some way your implementation can catch error +conditions and interrupts, then have them call <CODE>slib:error</CODE>. It +will display its arguments and reenter <CODE>repl:top-level</CODE>. +<CODE>slib:error</CODE> dynamically bound by <CODE>repl:top-level</CODE>. +</P> +<P> + +To have your top level loop always use macros, add any interrupt +catching lines and the following lines to your Scheme init file: +<TABLE><tr><td> </td><td class=example><pre>(require 'macro) +<A NAME="IDX1557"></A>(require 'repl) +<A NAME="IDX1558"></A>(repl:top-level macro:eval) +</pre></td></tr></table><P> + +<A NAME="Quick Print"></A> +<HR SIZE="6"> +<A NAME="SEC265"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC264"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC266"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.5.2 Quick Print </H3> +<!--docid::SEC265::--> +<P> + +<CODE>(require 'qp)</CODE> +<A NAME="IDX1559"></A> +</P> +<P> + +When displaying error messages and warnings, it is paramount that the +output generated for circular lists and large data structures be +limited. This section supplies a procedure to do this. It could be +much improved. +</P> +<P> + +<BLOCKQUOTE> +Notice that the neccessity for truncating output eliminates +Common-Lisp's <A HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A> from consideration; even when variables +<CODE>*print-level*</CODE> and <CODE>*print-level*</CODE> are set, huge strings and +bit-vectors are <EM>not</EM> limited. +</BLOCKQUOTE> +<P> + +<A NAME="IDX1560"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>qp</B> <I>arg1 <small>...</small></I> +<DD><A NAME="IDX1561"></A> +<DT><U>Procedure:</U> <B>qpn</B> <I>arg1 <small>...</small></I> +<DD><A NAME="IDX1562"></A> +<DT><U>Procedure:</U> <B>qpr</B> <I>arg1 <small>...</small></I> +<DD><CODE>qp</CODE> writes its arguments, separated by spaces, to +<CODE>(current-output-port)</CODE>. <CODE>qp</CODE> compresses printing by +substituting `<SAMP>...</SAMP>' for substructure it does not have sufficient +room to print. <CODE>qpn</CODE> is like <CODE>qp</CODE> but outputs a newline +before returning. <CODE>qpr</CODE> is like <CODE>qpn</CODE> except that it returns +its last argument. +</DL> +<P> + +<A NAME="IDX1563"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>*qp-width*</B> +<DD><VAR>*qp-width*</VAR> is the largest number of characters that <CODE>qp</CODE> +should use. If <VAR>*qp-width*</VAR> is #f, then all items will be +<CODE>write</CODE>n. If <VAR>*qp-width*</VAR> is 0, then all items except +procedures will be <CODE>write</CODE>n; procedures will be indicated by +`<SAMP>#[proc]</SAMP>'. +</DL> +<P> + +<A NAME="Debug"></A> +<HR SIZE="6"> +<A NAME="SEC266"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC265"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC267"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.5.3 Debug </H3> +<!--docid::SEC266::--> +<P> + +<CODE>(require 'debug)</CODE> +<A NAME="IDX1564"></A> +</P> +<P> + +Requiring <CODE>debug</CODE> automatically requires <CODE>trace</CODE> and +<CODE>break</CODE>. +</P> +<P> + +An application with its own datatypes may want to substitute its own +printer for <CODE>qp</CODE>. This example shows how to do this: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define qpn (lambda args) <small>...</small>) +(provide 'qp) +(require 'debug) +<A NAME="IDX1565"></A></pre></td></tr></table><P> + +<A NAME="IDX1566"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>trace-all</B> <I>file <small>...</small></I> +<DD>Traces (see section <A HREF="slib_7.html#SEC268">7.5.5 Tracing</A>) all procedures <CODE>define</CODE>d at top-level in +`<TT>file</TT>' <small>...</small>. +<P> + +<A NAME="IDX1567"></A> +<DT><U>Procedure:</U> <B>track-all</B> <I>file <small>...</small></I> +<DD>Tracks (see section <A HREF="slib_7.html#SEC268">7.5.5 Tracing</A>) all procedures <CODE>define</CODE>d at top-level in +`<TT>file</TT>' <small>...</small>. +</P> +<P> + +<A NAME="IDX1568"></A> +<DT><U>Procedure:</U> <B>stack-all</B> <I>file <small>...</small></I> +<DD>Stacks (see section <A HREF="slib_7.html#SEC268">7.5.5 Tracing</A>) all procedures <CODE>define</CODE>d at top-level in +`<TT>file</TT>' <small>...</small>. +</P> +</DL> +<P> + +<A NAME="IDX1569"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>break-all</B> <I>file <small>...</small></I> +<DD>Breakpoints (see section <A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A>) all procedures <CODE>define</CODE>d at +top-level in `<TT>file</TT>' <small>...</small>. +</DL> +<P> + +<A NAME="Breakpoints"></A> +<HR SIZE="6"> +<A NAME="SEC267"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC266"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC268"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.5.4 Breakpoints </H3> +<!--docid::SEC267::--> +<P> + +<CODE>(require 'break)</CODE> +<A NAME="IDX1570"></A> +</P> +<P> + +<A NAME="IDX1571"></A> +</P> +<DL> +<DT><U>Function:</U> <B>init-debug</B> +<DD>If your Scheme implementation does not support <CODE>break</CODE> or +<CODE>abort</CODE>, a message will appear when you <CODE>(require 'break)</CODE> or +<A NAME="IDX1572"></A> +<CODE>(require 'debug)</CODE> telling you to type <CODE>(init-debug)</CODE>. This +<A NAME="IDX1573"></A> +is in order to establish a top-level continuation. Typing +<CODE>(init-debug)</CODE> at top level sets up a continuation for +<CODE>break</CODE>. +</DL> +<P> + +<A NAME="IDX1574"></A> +</P> +<DL> +<DT><U>Function:</U> <B>breakpoint</B> <I>arg1 <small>...</small></I> +<DD>Returns from the top level continuation and pushes the continuation from +which it was called on a continuation stack. +</DL> +<P> + +<A NAME="IDX1575"></A> +</P> +<DL> +<DT><U>Function:</U> <B>continue</B> +<DD>Pops the topmost continuation off of the continuation stack and returns +an unspecified value to it. +<P> + +<A NAME="IDX1576"></A> +<DT><U>Function:</U> <B>continue</B> <I>arg1 <small>...</small></I> +<DD>Pops the topmost continuation off of the continuation stack and returns +<VAR>arg1</VAR> <small>...</small> to it. +</P> +</DL> +<P> + +<A NAME="IDX1577"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>break</B> <I>proc1 <small>...</small></I> +<DD>Redefines the top-level named procedures given as arguments so that +<CODE>breakpoint</CODE> is called before calling <VAR>proc1</VAR> <small>...</small>. +<A NAME="IDX1578"></A> +<DT><U>Macro:</U> <B>break</B> +<DD>With no arguments, makes sure that all the currently broken identifiers +are broken (even if those identifiers have been redefined) and returns a +list of the broken identifiers. +</DL> +<P> + +<A NAME="IDX1579"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>unbreak</B> <I>proc1 <small>...</small></I> +<DD>Turns breakpoints off for its arguments. +<A NAME="IDX1580"></A> +<DT><U>Macro:</U> <B>unbreak</B> +<DD>With no arguments, unbreaks all currently broken identifiers and returns +a list of these formerly broken identifiers. +</DL> +<P> + +These are <EM>procedures</EM> for breaking. If defmacros are not natively +supported by your implementation, these might be more convenient to use. +</P> +<P> + +<A NAME="IDX1581"></A> +</P> +<DL> +<DT><U>Function:</U> <B>breakf</B> <I>proc</I> +<DD><A NAME="IDX1582"></A> +<DT><U>Function:</U> <B>breakf</B> <I>proc name</I> +<DD>To break, type +<TABLE><tr><td> </td><td class=example><pre>(set! <VAR>symbol</VAR> (breakf <VAR>symbol</VAR>)) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>(set! <VAR>symbol</VAR> (breakf <VAR>symbol</VAR> '<VAR>symbol</VAR>)) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>(define <VAR>symbol</VAR> (breakf <VAR>function</VAR>)) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>(define <VAR>symbol</VAR> (breakf <VAR>function</VAR> '<VAR>symbol</VAR>)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1583"></A> +</P> +<DL> +<DT><U>Function:</U> <B>unbreakf</B> <I>proc</I> +<DD>To unbreak, type +<TABLE><tr><td> </td><td class=example><pre>(set! <VAR>symbol</VAR> (unbreakf <VAR>symbol</VAR>)) +</pre></td></tr></table></DL> +<P> + +<A NAME="Trace"></A> +<HR SIZE="6"> +<A NAME="SEC268"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC267"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC263"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.5.5 Tracing </H3> +<!--docid::SEC268::--> +<P> + +<CODE>(require 'trace)</CODE> +<A NAME="IDX1584"></A> +</P> +<P> + +This feature provides three ways to monitor procedure invocations: +</P> +<P> + +</P> +<DL COMPACT> +<DT>stack +<DD>Pushes the procedure-name when the procedure is called; pops when it +returns. +<DT>track +<DD>Pushes the procedure-name and arguments when the procedure is called; +pops when it returns. +<DT>trace +<DD>Pushes the procedure-name and prints `<SAMP>CALL <VAR>procedure-name</VAR> +<VAR>arg1</VAR> <small>...</small></SAMP>' when the procdure is called; pops and prints +`<SAMP>RETN <VAR>procedure-name</VAR> <VAR>value</VAR></SAMP>' when the procedure returns. +</DL> +<P> + +<A NAME="IDX1585"></A> +</P> +<DL> +<DT><U>Variable:</U> <B>debug:max-count</B> +<DD>If a traced procedure calls itself or untraced procedures which call it, +stack, track, and trace will limit the number of stack pushes to +<VAR>debug:max-count</VAR>. +</DL> +<P> + +<A NAME="IDX1586"></A> +</P> +<DL> +<DT><U>Function:</U> <B>print-call-stack</B> +<DD><A NAME="IDX1587"></A> +<DT><U>Function:</U> <B>print-call-stack</B> <I>port</I> +<DD>Prints the call-stack to <VAR>port</VAR> or the current-error-port. +</DL> +<P> + +<A NAME="IDX1588"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>trace</B> <I>proc1 <small>...</small></I> +<DD>Traces the top-level named procedures given as arguments. +<A NAME="IDX1589"></A> +<DT><U>Macro:</U> <B>trace</B> +<DD>With no arguments, makes sure that all the currently traced identifiers +are traced (even if those identifiers have been redefined) and returns a +list of the traced identifiers. +</DL> +<P> + +<A NAME="IDX1590"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>track</B> <I>proc1 <small>...</small></I> +<DD>Traces the top-level named procedures given as arguments. +<A NAME="IDX1591"></A> +<DT><U>Macro:</U> <B>track</B> +<DD>With no arguments, makes sure that all the currently tracked identifiers +are tracked (even if those identifiers have been redefined) and returns +a list of the tracked identifiers. +</DL> +<P> + +<A NAME="IDX1592"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>stack</B> <I>proc1 <small>...</small></I> +<DD>Traces the top-level named procedures given as arguments. +<A NAME="IDX1593"></A> +<DT><U>Macro:</U> <B>stack</B> +<DD>With no arguments, makes sure that all the currently stacked identifiers +are stacked (even if those identifiers have been redefined) and returns +a list of the stacked identifiers. +</DL> +<P> + +<A NAME="IDX1594"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>untrace</B> <I>proc1 <small>...</small></I> +<DD>Turns tracing, tracking, and off for its arguments. +<A NAME="IDX1595"></A> +<DT><U>Macro:</U> <B>untrace</B> +<DD>With no arguments, untraces all currently traced identifiers and returns +a list of these formerly traced identifiers. +</DL> +<P> + +<A NAME="IDX1596"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>untrack</B> <I>proc1 <small>...</small></I> +<DD>Turns tracing, tracking, and off for its arguments. +<A NAME="IDX1597"></A> +<DT><U>Macro:</U> <B>untrack</B> +<DD>With no arguments, untracks all currently tracked identifiers and returns +a list of these formerly tracked identifiers. +</DL> +<P> + +<A NAME="IDX1598"></A> +</P> +<DL> +<DT><U>Macro:</U> <B>unstack</B> <I>proc1 <small>...</small></I> +<DD>Turns tracing, stacking, and off for its arguments. +<A NAME="IDX1599"></A> +<DT><U>Macro:</U> <B>unstack</B> +<DD>With no arguments, unstacks all currently stacked identifiers and returns +a list of these formerly stacked identifiers. +</DL> +<P> + +These are <EM>procedures</EM> for tracing. If defmacros are not natively +supported by your implementation, these might be more convenient to use. +</P> +<P> + +<A NAME="IDX1600"></A> +</P> +<DL> +<DT><U>Function:</U> <B>tracef</B> <I>proc</I> +<DD><A NAME="IDX1601"></A> +<DT><U>Function:</U> <B>tracef</B> <I>proc name</I> +<DD><A NAME="IDX1602"></A> +<DT><U>Function:</U> <B>trackf</B> <I>proc</I> +<DD><A NAME="IDX1603"></A> +<DT><U>Function:</U> <B>trackf</B> <I>proc name</I> +<DD><A NAME="IDX1604"></A> +<DT><U>Function:</U> <B>stackf</B> <I>proc</I> +<DD><A NAME="IDX1605"></A> +<DT><U>Function:</U> <B>stackf</B> <I>proc name</I> +<DD>To trace, type +<TABLE><tr><td> </td><td class=example><pre>(set! <VAR>symbol</VAR> (tracef <VAR>symbol</VAR>)) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>(set! <VAR>symbol</VAR> (tracef <VAR>symbol</VAR> '<VAR>symbol</VAR>)) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>(define <VAR>symbol</VAR> (tracef <VAR>function</VAR>)) +</pre></td></tr></table>or +<TABLE><tr><td> </td><td class=example><pre>(define <VAR>symbol</VAR> (tracef <VAR>function</VAR> '<VAR>symbol</VAR>)) +</pre></td></tr></table></DL> +<P> + +<A NAME="IDX1606"></A> +</P> +<DL> +<DT><U>Function:</U> <B>untracef</B> <I>proc</I> +<DD>Removes tracing, tracking, or stacking for <VAR>proc</VAR>. +To untrace, type +<TABLE><tr><td> </td><td class=example><pre>(set! <VAR>symbol</VAR> (untracef <VAR>symbol</VAR>)) +</pre></td></tr></table></DL> +<P> + +<A NAME="System Interface"></A> +<HR SIZE="6"> +<A NAME="SEC269"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC268"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC270"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 7.6 System Interface </H2> +<!--docid::SEC269::--> +<P> + +If <CODE>(provided? 'getenv)</CODE>: +</P> +<P> + +<A NAME="IDX1607"></A> +</P> +<DL> +<DT><U>Function:</U> <B>getenv</B> <I>name</I> +<DD>Looks up <VAR>name</VAR>, a string, in the program environment. If <VAR>name</VAR> is +found a string of its value is returned. Otherwise, <CODE>#f</CODE> is returned. +</DL> +<P> + +If <CODE>(provided? 'system)</CODE>: +</P> +<P> + +<A NAME="IDX1608"></A> +</P> +<DL> +<DT><U>Function:</U> <B>system</B> <I>command-string</I> +<DD>Executes the <VAR>command-string</VAR> on the computer and returns the +integer status code. +</DL> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC270">7.6.1 Directories</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC271">7.6.2 Transactions</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_7.html#SEC275">7.6.3 CVS</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Directories"></A> +<HR SIZE="6"> +<A NAME="SEC270"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC271"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.6.1 Directories </H3> +<!--docid::SEC270::--> +<P> + +<CODE>(require 'directory)</CODE> +<A NAME="IDX1609"></A> +</P> +<P> + +<A NAME="IDX1610"></A> +</P> +<DL> +<DT><U>Function:</U> <B>current-directory</B> +<DD><P> + +<CODE>current-directory</CODE> returns a string containing the absolute file +name representing the current working directory. If this string +cannot be obtained, #f is returned. +</P> +<P> + +If <CODE>current-directory</CODE> cannot be supported by the platform, then #f is returned. +</P> +</DL> +<P> + +<A NAME="IDX1611"></A> +</P> +<DL> +<DT><U>Function:</U> <B>make-directory</B> <I>name</I> +<DD><P> + +Creates a sub-directory <VAR>name</VAR> of the current-directory. If +successful, <CODE>make-directory</CODE> returns #t; otherwise #f. +</P> +</DL> +<P> + +<A NAME="IDX1612"></A> +</P> +<DL> +<DT><U>Function:</U> <B>directory-for-each</B> <I>proc directory</I> +<DD><P> + +<VAR>proc</VAR> must be a procedure taking one argument. +`<SAMP>Directory-For-Each</SAMP>' applies <VAR>proc</VAR> to the (string) name of +each file in <VAR>directory</VAR>. The dynamic order in which <VAR>proc</VAR> is +applied to the filenames is unspecified. The value returned by +`<SAMP>directory-for-each</SAMP>' is unspecified. +</P> +<P> + +<A NAME="IDX1613"></A> +<DT><U>Function:</U> <B>directory-for-each</B> <I>proc directory pred</I> +<DD>Applies <VAR>proc</VAR> only to those filenames for which the procedure +<VAR>pred</VAR> returns a non-false value. +</P> +<P> + +<A NAME="IDX1614"></A> +<DT><U>Function:</U> <B>directory-for-each</B> <I>proc directory match</I> +<DD>Applies <VAR>proc</VAR> only to those filenames for which +<CODE>(filename:match?? <VAR>match</VAR>)</CODE> would return a non-false value +(see section `Filenames' in <CITE>SLIB</CITE>). +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'directory) +(directory-for-each print "." "[A-Z]*.scm") +-| +"Bev2slib.scm" +"Template.scm" +</pre></td></tr></table></DL> +<P> + +<A NAME="Transactions"></A> +<HR SIZE="6"> +<A NAME="SEC271"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC270"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC275"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.6.2 Transactions </H3> +<!--docid::SEC271::--> +<P> + +If <CODE>system</CODE> is provided by the Scheme implementation, the +<EM>transact</EM> package provides functions for file-locking and +file-replacement transactions. +</P> +<P> + +<CODE>(require 'transact)</CODE> +<A NAME="IDX1615"></A> +</P> +<P> + +<A NAME="SEC272"></A> +<H4> File Locking </H4> +<!--docid::SEC272::--> +<P> + +Unix file-locking is focussed on write permissions for segments of a +existing file. While this might be employed for (binary) database +access, it is not used for everyday contention (between users) for +text files. +</P> +<P> + +Microsoft has several file-locking protocols. Their model denies +write access to a file if any reader has it open. This is too +restrictive. Write access is denied even when the reader has +reached end-of-file. And tracking read access (which is much more +common than write access) causes havoc when remote hosts crash or +disconnect. +</P> +<P> + +It is bizarre that the concept of multi-user contention for +modifying files has not been adequately addressed by either of the +large operating system development efforts. There is further irony +that both camps support contention detection and resolution only +through weak conventions of some their document editing programs. +</P> +<P> + +<A NAME="IDX1616"></A> +The <EM>file-lock</EM> procedures implement a transaction method for file +<A NAME="IDX1617"></A> +replacement compatible with the methods used by the GNU <EM>emacs</EM> +<A NAME="IDX1618"></A> +text editor on Unix systems and the Microsoft <EM>Word</EM> editor. +<A NAME="IDX1619"></A> +<A NAME="IDX1620"></A> +</P> +<P> + +<A NAME="IDX1621"></A> +Both protocols employ what I term a <EM>certificate</EM> containing the +<A NAME="IDX1622"></A> +user, hostname, time, and (on Unix) process-id. +Intent to replace <VAR>file</VAR> is indicated by adding to <VAR>file</VAR>'s +directory a certificate object whose name is derived from +<VAR>file</VAR>. +</P> +<P> + +The Microsoft Word certificate is contained in a 162 byte file named +for the visited <VAR>file</VAR> with a `<SAMP>~$</SAMP>' prefix. +Emacs/Unix creates a symbolic link to a certificate named for the +visited <VAR>file</VAR> prefixed with `<SAMP>.#</SAMP>'. +Because Unix systems can import Microsoft file systems, these +routines maintain and check both Emacs and Word certificates. +</P> +<P> + +<A NAME="IDX1623"></A> +</P> +<DL> +<DT><U>Function:</U> <B>file-lock-owner</B> <I>path</I> +<DD><P> + +Returns the string `<SAMP><VAR>user</VAR>@<VAR>hostname</VAR></SAMP>' associated with +the lock owner of file <VAR>path</VAR> if locked; and #f otherwise. +</P> +</DL> +<P> + +<A NAME="IDX1624"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>file-lock!</B> <I>path email</I> +<DD><P> + +<A NAME="IDX1625"></A> +<DT><U>Procedure:</U> <B>file-lock!</B> <I>path</I> +<DD></P> +<P> + +<VAR>path</VAR> must be a string naming the file to be locked. If supplied, <VAR>email</VAR> +must be a string formatted as `<SAMP><VAR>user</VAR>@<VAR>hostname</VAR></SAMP>'. If +absent, <VAR>email</VAR> defaults to the value returned by <CODE>user-email-address</CODE>. +</P> +<P> + +If <VAR>path</VAR> is already locked, then <CODE>file-lock!</CODE> returns `<SAMP>#f</SAMP>'. If <VAR>path</VAR> is +unlocked, then <CODE>file-lock!</CODE> returns the certificate string associated with the +new lock for file <VAR>path</VAR>. +</P> +</DL> +<P> + +<A NAME="IDX1626"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>file-unlock!</B> <I>path certificate</I> +<DD><P> + +<VAR>path</VAR> must be a string naming the file to be unlocked. <VAR>certificate</VAR> must be the +string returned by <CODE>file-lock!</CODE> for <VAR>path</VAR>. +</P> +<P> + +If <VAR>path</VAR> is locked with <VAR>certificate</VAR>, then <CODE>file-unlock!</CODE> removes the locks and returns +`<SAMP>#t</SAMP>'. Otherwise, <CODE>file-unlock!</CODE> leaves the file system unaltered and returns +`<SAMP>#f</SAMP>'. +</P> +</DL> +<A NAME="SEC273"></A> +<H4> File Transactions </H4> +<!--docid::SEC273::--> +<P> + +<A NAME="IDX1627"></A> +</P> +<DL> +<DT><U>Function:</U> <B>emacs:backup-name</B> <I>path backup-style</I> +<DD><P> + +<VAR>path</VAR> must be a string. <VAR>backup-style</VAR> must be a symbol. Depending on <VAR>backup-style</VAR>, <CODE>emacs:backup-name</CODE> +returns: +</P> +<DL COMPACT> +<DT>none +<DD>#f +<DT>simple +<DD>the string "<VAR>path</VAR>~" +<DT>numbered +<DD>the string "<VAR>path</VAR>.~<VAR>n</VAR>~", where <VAR>n</VAR> is one greater than the +highest number appearing in a filename matching "<VAR>path</VAR>.~*~". <VAR>n</VAR> +defauls to 1 when no filename matches. +<DT>existing +<DD>the string "<VAR>path</VAR>.~<VAR>n</VAR>~" if a numbered backup already exists in +this directory; otherwise. "<VAR>path</VAR>~" +<DT>orig +<DD>the string "<VAR>path</VAR>.orig" +<DT>bak +<DD>the string "<VAR>path</VAR>.bak" +</DL> +</DL> +<P> + +<A NAME="IDX1628"></A> +</P> +<DL> +<DT><U>Function:</U> <B>transact-file-replacement</B> <I>proc path backup-style certificate</I> +<DD><P> + +<A NAME="IDX1629"></A> +<DT><U>Function:</U> <B>transact-file-replacement</B> <I>proc path backup-style</I> +<DD></P> +<P> + +<A NAME="IDX1630"></A> +<DT><U>Function:</U> <B>transact-file-replacement</B> <I>proc path</I> +<DD></P> +<P> + +<VAR>path</VAR> must be a string naming an existing file. <VAR>backup-style</VAR> is one of the +symbols none, simple, numbered, existing, orig, +bak or #f; with meanings described above; or a string naming +the location of a backup file. <VAR>backup-style</VAR> defaults to #f. If supplied, +<VAR>certificate</VAR> is the certificate with which <VAR>path</VAR> is locked. +</P> +<P> + +<VAR>proc</VAR> must be a procedure taking two string arguments: +<UL> +<LI> +<VAR>path</VAR>, the original filename (to be read); and +<LI> +a temporary file-name. +</UL> +<P> + +If <VAR>path</VAR> is locked by other than <VAR>certificate</VAR>, or if <VAR>certificate</VAR> is supplied and <VAR>path</VAR> is not +locked, then <CODE>transact-file-replacement</CODE> returns #f. If <VAR>certificate</VAR> is not supplied, then, <CODE>transact-file-replacement</CODE> creates +temporary (Emacs and Word) locks for <VAR>path</VAR> during the transaction. The +lock status of <VAR>path</VAR> will be restored before <CODE>transact-file-replacement</CODE> returns. +</P> +<P> + +<CODE>transact-file-replacement</CODE> calls <VAR>proc</VAR> with <VAR>path</VAR> (which should not be modified) and a temporary +file path to be written. +If <VAR>proc</VAR> returns any value other than #t, then the file named by <VAR>path</VAR> +is not altered and <CODE>transact-file-replacement</CODE> returns #f. +Otherwise, <CODE>emacs:backup-name</CODE> is called with <VAR>path</VAR> and <VAR>backup-style</VAR>. If it +returns a string, then <VAR>path</VAR> is renamed to it. +</P> +<P> + +Finally, the temporary file is renamed <VAR>path</VAR>. +<CODE>transact-file-replacement</CODE> returns #t if <VAR>path</VAR> was successfully replaced; and #f otherwise. +</P> +</DL> +<A NAME="SEC274"></A> +<H4> Identification </H4> +<!--docid::SEC274::--> +<P> + +<A NAME="IDX1631"></A> +</P> +<DL> +<DT><U>Function:</U> <B>user-email-address</B> +<DD><P> + +<CODE>user-email-address</CODE> returns a string of the form `<SAMP>username@hostname</SAMP>'. If +this e-mail address cannot be obtained, #f is returned. +</P> +</DL> +<P> + +<A NAME="CVS"></A> +<HR SIZE="6"> +<A NAME="SEC275"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC271"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC276"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC269"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 7.6.3 CVS </H3> +<!--docid::SEC275::--> +<P> + +<CODE>(require 'cvs)</CODE> +<A NAME="IDX1632"></A> +</P> +<P> + +<A NAME="IDX1633"></A> +</P> +<DL> +<DT><U>Function:</U> <B>cvs-files</B> <I>directory/</I> +<DD>Returns a list of the local pathnames (with prefix <VAR>directory/</VAR>) of all +CVS controlled files in <VAR>directory/</VAR> and in <VAR>directory/</VAR>'s subdirectories. +</DL> +<P> + +<A NAME="IDX1634"></A> +</P> +<DL> +<DT><U>Function:</U> <B>cvs-directories</B> <I>directory/</I> +<DD>Returns a list of all of <VAR>directory/</VAR> and all <VAR>directory/</VAR>'s CVS controlled +subdirectories. +</DL> +<P> + +<A NAME="IDX1635"></A> +</P> +<DL> +<DT><U>Function:</U> <B>cvs-root</B> <I>path/</I> +<DD>Returns the (string) contents of <VAR>path/</VAR>CVS/Root; +or <CODE>(getenv "CVSROOT")</CODE> if Root doesn't exist. +</DL> +<P> + +<A NAME="IDX1636"></A> +</P> +<DL> +<DT><U>Function:</U> <B>cvs-repository</B> <I>directory/</I> +<DD>Returns the (string) contents of <VAR>directory/</VAR>CVS/Root appended +with <VAR>directory/</VAR>CVS/Repository; or #f if <VAR>directory/</VAR>CVS/Repository +doesn't exist. +</DL> +<P> + +<A NAME="IDX1637"></A> +</P> +<DL> +<DT><U>Procedure:</U> <B>cvs-set-root!</B> <I>new-root directory/</I> +<DD><P> + +Writes <VAR>new-root</VAR> to file CVS/Root of <VAR>directory/</VAR> and all its subdirectories. +</P> +</DL> +<P> + +<A NAME="IDX1638"></A> +</P> +<DL> +<DT><U>Function:</U> <B>cvs-vet</B> <I>directory/</I> +<DD><P> + +Signals an error if CVS/Repository or CVS/Root files in <VAR>directory/</VAR> or any +subdirectory do not match. +</P> +</DL> +<P> + +<A NAME="Extra-SLIB Packages"></A> +<HR SIZE="6"> +<A NAME="SEC276"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC275"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 7.7 Extra-SLIB Packages </H2> +<!--docid::SEC276::--> +<P> + +Several Scheme packages have been written using SLIB. There are several +reasons why a package might not be included in the SLIB distribution: +<UL> +<LI> +Because it requires special hardware or software which is not universal. +<LI> +Because it is large and of limited interest to most Scheme users. +<LI> +Because it has copying terms different enough from the other SLIB +packages that its inclusion would cause confusion. +<LI> +Because it is an application program, rather than a library module. +<LI> +Because I have been too busy to integrate it. +</UL> +<P> + +Once an optional package is installed (and an entry added to +<CODE>*catalog*</CODE>, the <CODE>require</CODE> mechanism allows it to be called up +and used as easily as any other SLIB package. Some optional packages +(for which <CODE>*catalog*</CODE> already has entries) available from SLIB +sites are: +</P> +<P> + +</P> +<DL COMPACT> +<DT>SLIB-PSD +<DD>is a portable debugger for Scheme (requires emacs editor). +<P> + +<A HREF="http://swissnet.ai.mit.edu/ftpdir/scm/slib-psd1-3.tar.gz"> +http://swissnet.ai.mit.edu/ftpdir/scm/slib-psd1-3.tar.gz +</A> +</P> +<P> + +swissnet.ai.mit.edu:/pub/scm/slib-psd1-3.tar.gz +</P> +<P> + +ftp.maths.tcd.ie:pub/bosullvn/jacal/slib-psd1-3.tar.gz +</P> +<P> + +ftp.cs.indiana.edu:/pub/scheme-repository/utl/slib-psd1-3.tar.gz +</P> +<P> + +With PSD, you can run a Scheme program in an Emacs buffer, set +breakpoints, single step evaluation and access and modify the program's +variables. It works by instrumenting the original source code, so it +should run with any R4RS compliant Scheme. It has been tested with SCM, +Elk 1.5, and the sci interpreter in the Scheme->C system, but should +work with other Schemes with a minimal amount of porting, if at +all. Includes documentation and user's manual. Written by Pertti +Kellom\"aki, pk @ cs.tut.fi. The Lisp Pointers article describing PSD +(Lisp Pointers VI(1):15-23, January-March 1993) is available as +<A HREF="http://www.cs.tut.fi/staff/pk/scheme/psd/article/article.html"> +http://www.cs.tut.fi/staff/pk/scheme/psd/article/article.html +</A> +</P> +<P> + +</P> +<DT>SCHELOG +<DD>is an embedding of Prolog in Scheme.<BR> +<A HREF="http://www.ccs.neu.edu/~dorai/schelog/schelog.html"> +http://www.ccs.neu.edu/~dorai/schelog/schelog.html +</A> +<P> + +</P> +<DT>JFILTER +<DD>is a Scheme program which converts text among the JIS, EUC, and +Shift-JIS Japanese character sets.<BR> +<A HREF="http://www.sci.toyama-u.ac.jp/~iwao/Scheme/Jfilter/index.html"> +http://www.sci.toyama-u.ac.jp/~iwao/Scheme/Jfilter/index.html +</A> +</DL> +<P> + +<A NAME="About SLIB"></A> +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_8.html b/slib_8.html new file mode 100644 index 0000000..cddb1d5 --- /dev/null +++ b/slib_8.html @@ -0,0 +1,767 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: About SLIB</TITLE> + +<META NAME="description" CONTENT="SLIB: About SLIB"> +<META NAME="keywords" CONTENT="SLIB: About SLIB"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC277"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC276"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC278"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_7.html#SEC183"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1> 8. About SLIB </H1> +<!--docid::SEC277::--> +<P> + +More people than I can name have contributed to SLIB. Thanks to all of +you! +</P> +<P> + +<BLOCKQUOTE> +SLIB 3a1, released January 2005.<BR> +Aubrey Jaffer <agj @ alum.mit.edu><BR> +<I>Hyperactive Software</I> -- The Maniac Inside!<BR> +<A HREF="http://swissnet.ai.mit.edu/~jaffer/SLIB.html">http://swissnet.ai.mit.edu/~jaffer/SLIB.html</A> +</BLOCKQUOTE> +<P> + +<TABLE BORDER="0" CELLSPACING="0"> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC278">8.1 Installation</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">How to install SLIB on your system.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC284">8.2 Porting</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">SLIB to new platforms.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC285">8.3 Coding Guidelines</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">How to write modules for SLIB.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC287">8.4 Copyrights</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP">Intellectual propery issues.</TD></TR> +<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="slib_8.html#SEC291">8.5 About this manual</A></TD><TD> </TD><TD ALIGN="left" VALIGN="TOP"></TD></TR> +</TABLE> +<P> + +<A NAME="Installation"></A> +<HR SIZE="6"> +<A NAME="SEC278"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC279"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC284"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 8.1 Installation </H2> +<!--docid::SEC278::--> +<P> + +<A NAME="Installation"> +</A> +</P> +<P> + +<A NAME="IDX1639"></A> +<A NAME="IDX1640"></A> +There are four parts to installation: +</P> +<P> + +<UL> +<LI> +Unpack the SLIB distribution. +<LI> +Configure the Scheme implementation(s) to locate the SLIB directory. +<LI> +Arrange for Scheme implementation to load its SLIB initialization file. +<LI> +Build the SLIB catalog for the Scheme implementation. +</UL> +<P> + +<HR SIZE="6"> +<A NAME="SEC279"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC278"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC280"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 8.1.1 Unpacking the SLIB Distribution </H3> +<!--docid::SEC279::--> +<P> + +If the SLIB distribution is a Linux RPM, it will create the SLIB +directory `<TT>/usr/share/slib</TT>'. +</P> +<P> + +If the SLIB distribution is a ZIP file, unzip the distribution to create +the SLIB directory. Locate this `<TT>slib</TT>' directory either in your +home directory (if only you will use this SLIB installation); or put it +in a location where libraries reside on your system. On unix systems +this might be `<TT>/usr/share/slib</TT>', `<TT>/usr/local/lib/slib</TT>', or +`<TT>/usr/lib/slib</TT>'. If you know where SLIB should go on other +platforms, please inform agj @ alum.mit.edu. +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC280"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC279"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC281"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 8.1.2 Configure Scheme Implementation to Locate SLIB </H3> +<!--docid::SEC280::--> +<P> + +If the Scheme implementation supports <CODE>getenv</CODE>, then the value of +the shell environment variable <VAR>SCHEME_LIBRARY_PATH</VAR> will be used +for <CODE>(library-vicinity)</CODE> if it is defined. Currently, Chez, Elk, +MITScheme, scheme->c, VSCM, and SCM support <CODE>getenv</CODE>. Scheme48 +supports <CODE>getenv</CODE> but does not use it for determining +<CODE>library-vicinity</CODE>. (That is done from the Makefile.) +</P> +<P> + +The <CODE>(library-vicinity)</CODE> can also be specified from the SLIB +initialization file or by implementation-specific means. +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC281"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC280"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC282"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 8.1.3 Loading SLIB Initialization File </H3> +<!--docid::SEC281::--> +<P> + +Check the manifest in `<TT>README</TT>' to find a configuration file for +your Scheme implementation. Initialization files for most IEEE P1178 +compliant Scheme Implementations are included with this distribution. +</P> +<P> + +You should check the definitions of <CODE>software-type</CODE>, +<CODE>scheme-implementation-version</CODE>, +<CODE>implementation-vicinity</CODE>, +and <CODE>library-vicinity</CODE> in the initialization file. There are +comments in the file for how to configure it. +</P> +<P> + +Once this is done, modify the startup file for your Scheme +implementation to <CODE>load</CODE> this initialization file. +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC282"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC281"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC283"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 8.1.4 Build New SLIB Catalog for Implementation </H3> +<!--docid::SEC282::--> +<P> + +When SLIB is first used from an implementation, a file named +`<TT>slibcat</TT>' is written to the <CODE>implementation-vicinity</CODE> for that +implementation. Because users may lack permission to write in +<CODE>implementation-vicinity</CODE>, it is good practice to build the new +catalog when installing SLIB. +</P> +<P> + +To build (or rebuild) the catalog, start the Scheme implementation (with +SLIB), then: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(require 'new-catalog) +</pre></td></tr></table><P> + +The catalog also supports color-name dictionaries. With an +SLIB-installed scheme implementation, type: +<TABLE><tr><td> </td><td class=example><pre>(require 'color-names) +(make-slib-color-name-db) +(require 'new-catalog) +(slib:exit) +</pre></td></tr></table><P> + +<HR SIZE="6"> +<A NAME="SEC283"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC282"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC284"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 8.1.5 Implementation-specific Instructions </H3> +<!--docid::SEC283::--> +<P> + +Multiple implementations of Scheme can all use the same SLIB directory. +Simply configure each implementation's initialization file as outlined +above. +</P> +<P> + +<A NAME="IDX1641"></A> +</P> +<DL> +<DT><U>Implementation:</U> <B>SCM</B> +<DD>The SCM implementation does not require any initialization file as SLIB +support is already built into SCM. See the documentation with SCM for +installation instructions. +</DL> +<P> + +<A NAME="IDX1642"></A> +</P> +<DL> +<DT><U>Implementation:</U> <B>VSCM</B> +<DD><TABLE><tr><td> </td><td class=display><pre style="font-family: serif">From: Matthias Blume <blume @ cs.Princeton.EDU> +Date: Tue, 1 Mar 1994 11:42:31 -0500 +</pre></td></tr></table><P> + +Disclaimer: The code below is only a quick hack. If I find some time to +spare I might get around to make some more things work. +</P> +<P> + +You have to provide `<TT>vscm.init</TT>' as an explicit command line +argument. Since this is not very nice I would recommend the following +installation procedure: +</P> +<P> + +<OL> +<LI> +run scheme +<LI> +<CODE>(load "vscm.init")</CODE> +<LI> +<CODE>(slib:dump "dumpfile")</CODE> +<LI> +mv dumpfile place-where-vscm-standard-bootfile-resides +e.g. mv dumpfile /usr/local/vscm/lib/scheme-boot +(In this case vscm should have been compiled with flag +-DDEFAULT_BOOTFILE='"/usr/local/vscm/lib/scheme-boot"'. See Makefile +(definition of DDP) for details.) +</OL> +<P> + +</P> +</DL> +<P> + +<A NAME="IDX1643"></A> +</P> +<DL> +<DT><U>Implementation:</U> <B>Scheme48</B> +<DD>To make a Scheme48 image for an installation under <CODE><prefix></CODE>, +<P> + +<OL> +<LI> +<CODE>cd</CODE> to the SLIB directory +<LI> +type <CODE>make prefix=<prefix> slib48</CODE>. +<LI> +To install the image, type <CODE>make prefix=<prefix> install48</CODE>. This +will also create a shell script with the name <CODE>slib48</CODE> which will +invoke the saved image. +</OL> +</DL> +<P> + +<A NAME="IDX1644"></A> +</P> +<DL> +<DT><U>Implementation:</U> <B>PLT Scheme</B> +<DD><A NAME="IDX1645"></A> +<DT><U>Implementation:</U> <B>DrScheme</B> +<DD><A NAME="IDX1646"></A> +<DT><U>Implementation:</U> <B>MzScheme</B> +<DD><P> + +The `<TT>init.ss</TT>' file in the _slibinit_ collection is an SLIB +initialization file. +</P> +<P> + +To use SLIB in MzScheme, set the <VAR>SCHEME_LIBRARY_PATH</VAR> environment +variable to the installed SLIB location; then invoke MzScheme thus: +</P> +<P> + +<CODE>mzscheme -f ${SCHEME_LIBRARY_PATH}DrScheme.init</CODE> +</P> +</DL> +<P> + +<A NAME="IDX1647"></A> +</P> +<DL> +<DT><U>Implementation:</U> <B>MIT Scheme</B> +<DD><CODE>scheme -load ${SCHEME_LIBRARY_PATH}mitscheme.init</CODE> +</DL> +<P> + +<A NAME="IDX1648"></A> +</P> +<DL> +<DT><U>Implementation:</U> <B>Guile</B> +<DD><CODE>guile -l ${SCHEME_LIBRARY_PATH}guile.init</CODE> +</DL> +<P> + +<A NAME="Porting"></A> +<HR SIZE="6"> +<A NAME="SEC284"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC283"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC285"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC285"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 8.2 Porting </H2> +<!--docid::SEC284::--> +<P> + +If there is no initialization file for your Scheme implementation, you +will have to create one. Your Scheme implementation must be largely +compliant with +<TABLE><tr><td> </td><td class=example><pre><CITE>IEEE Std 1178-1990</CITE>, +<CITE>Revised^4 Report on the Algorithmic Language Scheme</CITE>, or +<CITE>Revised^5 Report on the Algorithmic Language Scheme</CITE> +</pre></td></tr></table>in order to support SLIB. <A NAME="DOCF7" HREF="slib_fot.html#FOOT7">(7)</A> +<P> + +`<TT>Template.scm</TT>' is an example configuration file. The comments +inside will direct you on how to customize it to reflect your system. +Give your new initialization file the implementation's name with +`<TT>.init</TT>' appended. For instance, if you were porting +<CODE>foo-scheme</CODE> then the initialization file might be called +`<TT>foo.init</TT>'. +</P> +<P> + +Your customized version should then be loaded as part of your scheme +implementation's initialization. It will load `<TT>require.scm</TT>' from +the library; this will allow the use of <CODE>provide</CODE>, +<CODE>provided?</CODE>, and <CODE>require</CODE> along with the <EM>vicinity</EM> +functions (these functions are documented in the sections +<A HREF="slib_1.html#SEC2">1.1 Feature</A> and <A HREF="slib_1.html#SEC3">1.2 Require</A>). The rest of the library will then +be accessible in a system independent fashion. +</P> +<P> + +Please mail new working configuration files to <CODE>agj @ alum.mit.edu</CODE> +so that they can be included in the SLIB distribution. +</P> +<P> + +<A NAME="Coding Guidelines"></A> +<HR SIZE="6"> +<A NAME="SEC285"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC284"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC286"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC287"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 8.3 Coding Guidelines </H2> +<!--docid::SEC285::--> +<P> + +All library packages are written in IEEE P1178 Scheme and assume that a +configuration file and `<TT>require.scm</TT>' package have already been +loaded. Other versions of Scheme can be supported in library packages +as well by using, for example, <CODE>(provided? 'r3rs)</CODE> or +<CODE>(require 'r3rs)</CODE> (see section <A HREF="slib_1.html#SEC3">1.2 Require</A>). +<A NAME="IDX1649"></A> +</P> +<P> + +If a procedure defined in a module is called by other procedures in +that module, then those procedures should instead call an alias +defined in that module: +</P> +<P> + +<TABLE><tr><td> </td><td class=example><pre>(define module-name:foo foo) +</pre></td></tr></table><P> + +The module name and `<SAMP>:</SAMP>' should prefix that symbol for the +internal name. Do not export internal aliases. +</P> +<P> + +A procedure is exported from a module by putting Schmooz-style +comments (see section <A HREF="slib_4.html#SEC87">4.14 Schmooz</A>) or `<SAMP>;@</SAMP>' at the beginning of the line +immediately preceding the definition (<CODE>define</CODE>, +<CODE>define-syntax</CODE>, or <CODE>defmacro</CODE>). Modules, exports and other +relevant issues are discussed in <A HREF="slib_1.html#SEC7">1.6 Compiling Scheme</A>. +</P> +<P> + +Code submitted for inclusion in SLIB should not duplicate (more than +one) routines already in SLIB files. Use <CODE>require</CODE> to force +those library routines to be used by your package. +</P> +<P> + +Documentation should be provided in Emacs Texinfo format if possible, +but documentation must be provided. +</P> +<P> + +Your package will be released sooner with SLIB if you send me a file +which tests your code. Please run this test <EM>before</EM> you send me +the code! +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC286"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC285"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC287"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 8.3.1 Modifications </H3> +<!--docid::SEC286::--> +<P> + +Please document your changes. A line or two for `<TT>ChangeLog</TT>' is +sufficient for simple fixes or extensions. Look at the format of +`<TT>ChangeLog</TT>' to see what information is desired. Please send me +<CODE>diff</CODE> files from the latest SLIB distribution (remember to send +<CODE>diff</CODE>s of `<TT>slib.texi</TT>' and `<TT>ChangeLog</TT>'). This makes for +less email traffic and makes it easier for me to integrate when more +than one person is changing a file (this happens a lot with +`<TT>slib.texi</TT>' and `<SAMP>*.init</SAMP>' files). +</P> +<P> + +If someone else wrote a package you want to significantly modify, please +try to contact the author, who may be working on a new version. This +will insure against wasting effort on obsolete versions. +</P> +<P> + +Please <EM>do not</EM> reformat the source code with your favorite +beautifier, make 10 fixes, and send me the resulting source code. I do +not have the time to fish through 10000 diffs to find your 10 real fixes. +</P> +<P> + +<A NAME="Copyrights"></A> +<HR SIZE="6"> +<A NAME="SEC287"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC286"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC288"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC291"> >> </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 8.4 Copyrights </H2> +<!--docid::SEC287::--> +<P> + +<A NAME="Copyrights"> +</A> +</P> +<P> + +This section has instructions for SLIB authors regarding copyrights. +<A NAME="IDX1650"></A> +</P> +<P> + +Each package in SLIB must either be in the public domain, or come with a +statement of terms permitting users to copy, redistribute and modify it. +The comments at the beginning of `<TT>require.scm</TT>' and +`<TT>macwork.scm</TT>' illustrate copyright and appropriate terms. +</P> +<P> + +If your code or changes amount to less than about 10 lines, you do not +need to add your copyright or send a disclaimer. +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC288"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC287"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC289"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 8.4.1 Putting code into the Public Domain </H3> +<!--docid::SEC288::--> +<P> + +In order to put code in the public domain you should sign a copyright +disclaimer and send it to the SLIB maintainer. Contact +agj @ alum.mit.edu for the address to mail the disclaimer to. +</P> +<P> + +<BLOCKQUOTE> +I, <VAR><my-name></VAR>, hereby affirm that I have placed the software +package <VAR><name></VAR> in the public domain. +<P> + +I affirm that I am the sole author and sole copyright holder for the +software package, that I have the right to place this software package +in the public domain, and that I will do nothing to undermine this +status in the future. +<PRE> <VAR>signature and date</VAR> +</PRE> +</BLOCKQUOTE> +<P> + +This wording assumes that you are the sole author. If you are not the +sole author, the wording needs to be different. If you don't want to +be bothered with sending a letter every time you release or modify a +module, make your letter say that it also applies to your future +revisions of that module. +</P> +<P> + +Make sure no employer has any claim to the copyright on the work you +are submitting. If there is any doubt, create a copyright disclaimer +and have your employer sign it. Mail the signed disclaimer to the +SLIB maintainer. Contact agj @ alum.mit.edu for the address to mail +the disclaimer to. An example disclaimer follows. +</P> +<P> + +<HR SIZE="6"> +<A NAME="SEC289"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC288"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC290"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 8.4.2 Explicit copying terms </H3> +<!--docid::SEC289::--> +<P> + +If you submit more than about 10 lines of code which you are not +placing into the Public Domain (by sending me a disclaimer) you need +to: +</P> +<P> + +<UL> +<LI> +Arrange that your name appears in a copyright line for the appropriate +year. Multiple copyright lines are acceptable. +<LI> +With your copyright line, specify any terms you require to be +different from those already in the file. +<LI> +Make sure no employer has any claim to the copyright on the work you +are submitting. If there is any doubt, create a copyright disclaimer +and have your employer sign it. Mail the signed disclaim to the SLIB +maintainer. Contact agj @ alum.mit.edu for the address to mail the +disclaimer to. +</UL> +<P> + +<HR SIZE="6"> +<A NAME="SEC290"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC289"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC291"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H3> 8.4.3 Example: Company Copyright Disclaimer </H3> +<!--docid::SEC290::--> +<P> + +This disclaimer should be signed by a vice president or general +manager of the company. If you can't get at them, anyone else +authorized to license out software produced there will do. Here is a +sample wording: +</P> +<P> + +<BLOCKQUOTE> +<VAR><employer></VAR> Corporation hereby disclaims all copyright +interest in the program <VAR><program></VAR> written by <VAR><name></VAR>. +<P> + +<VAR><employer></VAR> Corporation affirms that it has no other intellectual +property interest that would undermine this release, and will do +nothing to undermine it in the future. +</P> +<P> + +<PRE><VAR><signature and date></VAR>, +<VAR><name></VAR>, <VAR><title></VAR>, <VAR><employer></VAR> Corporation +</PRE> +</BLOCKQUOTE> +<P> + +<A NAME="About this manual"></A> +<HR SIZE="6"> +<A NAME="SEC291"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC290"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_9.html#SEC292"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H2> 8.5 About this manual </H2> +<!--docid::SEC291::--> +<P> + +<UL> +<LI> +Entries that are labeled as Functions are called for their return +values. Entries that are labeled as Procedures are called primarily for +their side effects. +<P> + +</P> +<LI> +Examples in this text were produced using the <CODE>scm</CODE> Scheme +implementation. +<P> + +</P> +<LI> +At the beginning of each section, there is a line that looks like +<A NAME="IDX1651"></A> +<CODE>(require 'feature)</CODE>. Include this line in your code prior to +using the package. +</UL> +<P> + +<A NAME="Index"></A> +<HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_9.html b/slib_9.html new file mode 100644 index 0000000..6744430 --- /dev/null +++ b/slib_9.html @@ -0,0 +1,340 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Index</TITLE> + +<META NAME="description" CONTENT="SLIB: Index"> +<META NAME="keywords" CONTENT="SLIB: Index"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC292"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC291"> < </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_12.html"> > </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top"> Up </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1> Procedure and Macro Index </H1> +<!--docid::SEC292::--> +<P> + +This is an alphabetical list of all the procedures and macros in SLIB. +</P> +<P> + +</P> +<table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><P></P> +<TABLE border=0> +<TR><TD></TD><TH ALIGN=LEFT>Index Entry</TH><TH ALIGN=LEFT> Section</TH></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_-"></A>-</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1457"><CODE>-</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1440"><CODE>-1+</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_/"></A>/</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1456"><CODE>/</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_1"></A>1</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1439"><CODE>1+</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_<"></A><</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1442"><CODE><=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1441"><CODE><?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_="></A>=</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX504"><CODE>=</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC94">5.1.5 Gray code</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1443"><CODE>=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_>"></A>></TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1445"><CODE>>=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1444"><CODE>>?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_A"></A>A</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX399"><CODE>absolute-path?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX397"><CODE>absolute-uri?</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC77">File-system Locators and Predicates</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1100"><CODE>ac32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1101"><CODE>ac32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1098"><CODE>ac64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1099"><CODE>ac64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX964"><CODE>add-command-tables</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX933"><CODE>add-domain</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC145">Defining Tables</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX972"><CODE>add-domain on relational-database</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1414"><CODE>add-process!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_3.html#IDX167"><CODE>add-setter</CODE></A></TD><TD valign=top><A HREF="slib_3.html#SEC43">3.8.3 Setters</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1290"><CODE>adjoin</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX251"><CODE>adjoin-parameters!</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1067"><CODE>alist->wt-tree</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1147"><CODE>alist-associator</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1150"><CODE>alist-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1146"><CODE>alist-inquirer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1149"><CODE>alist-map</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1148"><CODE>alist-remover</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC188">7.1.4 Association Lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX1003"><CODE>alist-table</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC167">6.2.1.1 The Base</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1549"><CODE>and-let*</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC260">7.4.13.2 SRFI-2</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1321"><CODE>and?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1541"><CODE>any</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC256">Searching</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1229"><CODE>any?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC194">7.1.9 Collections</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1438"><CODE>append!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1523"><CODE>append-reverse</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1524"><CODE>append-reverse!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC253">Miscellaneous</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1459"><CODE>apply</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC242">7.4.7 Multi-argument Apply</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1104"><CODE>ar32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1105"><CODE>ar32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1102"><CODE>ar64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1103"><CODE>ar64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1134"><CODE>array-align</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1142"><CODE>array-copy!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1127"><CODE>array-dimensions</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1139"><CODE>array-for-each</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1128"><CODE>array-in-bounds?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1141"><CODE>array-index-map!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1140"><CODE>array-indexes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1138"><CODE>array-map</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1137"><CODE>array-map!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1125"><CODE>array-rank</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1129"><CODE>array-ref</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1130"><CODE>array-set!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1126"><CODE>array-shape</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1135"><CODE>array-trim</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC186">7.1.2 Subarrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1096"><CODE>array=?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1095"><CODE>array?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1110"><CODE>as16</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1111"><CODE>as16</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1108"><CODE>as32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1109"><CODE>as32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1106"><CODE>as64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1107"><CODE>as64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1112"><CODE>as8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1113"><CODE>as8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX453"><CODE>asctime</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC84">4.12.2 Posix Time</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX490"><CODE>ash</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1546"><CODE>assoc</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC258">Association lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1547"><CODE>assoc</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC258">Association lists</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1122"><CODE>at1</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1123"><CODE>at1</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1323"><CODE>atom?</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1118"><CODE>au16</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1119"><CODE>au16</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1116"><CODE>au32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1117"><CODE>au32</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1114"><CODE>au64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1115"><CODE>au64</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1120"><CODE>au8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1121"><CODE>au8</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC185">7.1.1 Arrays</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +<TR><TH><A NAME="fn_B"></A>B</TH><TD></TD><TD></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX274"><CODE>batch:call-with-output-script</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX275"><CODE>batch:command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX279"><CODE>batch:comment</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX281"><CODE>batch:delete-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX272"><CODE>batch:initialize!</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX280"><CODE>batch:lines->file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX282"><CODE>batch:rename-file</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX278"><CODE>batch:run-script</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX277"><CODE>batch:try-chopped-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_4.html#IDX276"><CODE>batch:try-command</CODE></A></TD><TD valign=top><A HREF="slib_4.html#SEC68">4.4.7 Batch</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX488"><CODE>bit-field</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX494"><CODE>bit-reverse</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX482"><CODE>bitwise-if</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX500"><CODE>bitwise:delaminate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX499"><CODE>bitwise:laminate</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX787"><CODE>blackbody-spectrum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX788"><CODE>blackbody-spectrum</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC127">5.9.3 Spectra</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_5.html#IDX498"><CODE>booleans->integer</CODE></A></TD><TD valign=top><A HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1577"><CODE>break</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1578"><CODE>break</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1569"><CODE>break-all</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC266">7.5.3 Debug</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1581"><CODE>breakf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1582"><CODE>breakf</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1574"><CODE>breakpoint</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX987"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX988"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX989"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX990"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX991"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_6.html#IDX992"><CODE>browse</CODE></A></TD><TD valign=top><A HREF="slib_6.html#SEC164">6.1.6 Database Browser</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_2.html#IDX100"><CODE>browse-url</CODE></A></TD><TD valign=top><A HREF="slib_2.html#SEC17">2.4 System</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1313"><CODE>butlast</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1315"><CODE>butnthcdr</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1154"><CODE>byte-ref</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1155"><CODE>byte-set!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1159"><CODE>bytes</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1187"><CODE>bytes->ieee-double</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1186"><CODE>bytes->ieee-float</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1184"><CODE>bytes->integer</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1160"><CODE>bytes->list</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1163"><CODE>bytes-copy</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1158"><CODE>bytes-length</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1165"><CODE>bytes-reverse</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD></TD><TD valign=top><A HREF="slib_7.html#IDX1164"><CODE>bytes-reverse!</CODE></A></TD><TD valign=top><A HREF="slib_7.html#SEC189">7.1.5 Byte</A></TD></TR> +<TR><TD COLSPAN=3> <HR></TD></TR> +</TABLE><P></P><table><tr><th valign=top>Jump to: </th><td><A HREF="slib_9.html#fn_-" style="text-decoration:none"><b>-</b></A> + +<A HREF="slib_9.html#fn_/" style="text-decoration:none"><b>/</b></A> + +<A HREF="slib_9.html#fn_1" style="text-decoration:none"><b>1</b></A> + +<A HREF="slib_9.html#fn_<" style="text-decoration:none"><b><</b></A> + +<A HREF="slib_9.html#fn_=" style="text-decoration:none"><b>=</b></A> + +<A HREF="slib_9.html#fn_>" style="text-decoration:none"><b>></b></A> + +<BR> +<A HREF="slib_9.html#fn_A" style="text-decoration:none"><b>A</b></A> + +<A HREF="slib_9.html#fn_B" style="text-decoration:none"><b>B</b></A> + +<A HREF="slib_12.html#fn_C" style="text-decoration:none"><b>C</b></A> + +<A HREF="slib_13.html#fn_D" style="text-decoration:none"><b>D</b></A> + +<A HREF="slib_13.html#fn_E" style="text-decoration:none"><b>E</b></A> + +<A HREF="slib_13.html#fn_F" style="text-decoration:none"><b>F</b></A> + +<A HREF="slib_14.html#fn_G" style="text-decoration:none"><b>G</b></A> + +<A HREF="slib_14.html#fn_H" style="text-decoration:none"><b>H</b></A> + +<A HREF="slib_14.html#fn_I" style="text-decoration:none"><b>I</b></A> + +<A HREF="slib_15.html#fn_J" style="text-decoration:none"><b>J</b></A> + +<A HREF="slib_15.html#fn_K" style="text-decoration:none"><b>K</b></A> + +<A HREF="slib_15.html#fn_L" style="text-decoration:none"><b>L</b></A> + +<A HREF="slib_15.html#fn_M" style="text-decoration:none"><b>M</b></A> + +<A HREF="slib_16.html#fn_N" style="text-decoration:none"><b>N</b></A> + +<A HREF="slib_16.html#fn_O" style="text-decoration:none"><b>O</b></A> + +<A HREF="slib_16.html#fn_P" style="text-decoration:none"><b>P</b></A> + +<A HREF="slib_17.html#fn_Q" style="text-decoration:none"><b>Q</b></A> + +<A HREF="slib_17.html#fn_R" style="text-decoration:none"><b>R</b></A> + +<A HREF="slib_17.html#fn_S" style="text-decoration:none"><b>S</b></A> + +<A HREF="slib_18.html#fn_T" style="text-decoration:none"><b>T</b></A> + +<A HREF="slib_18.html#fn_U" style="text-decoration:none"><b>U</b></A> + +<A HREF="slib_18.html#fn_V" style="text-decoration:none"><b>V</b></A> + +<A HREF="slib_18.html#fn_W" style="text-decoration:none"><b>W</b></A> + +<A HREF="slib_19.html#fn_X" style="text-decoration:none"><b>X</b></A> + +<A HREF="slib_19.html#fn_Y" style="text-decoration:none"><b>Y</b></A> + +<A HREF="slib_19.html#fn_Z" style="text-decoration:none"><b>Z</b></A> + +</td></tr></table><HR SIZE="6"> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_8.html#SEC277"> << </A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[ >> ]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT"> <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_abt.html b/slib_abt.html new file mode 100644 index 0000000..3e4da88 --- /dev/null +++ b/slib_abt.html @@ -0,0 +1,205 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: About this document</TITLE> + +<META NAME="description" CONTENT="SLIB: About this document"> +<META NAME="keywords" CONTENT="SLIB: About this document"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC_About"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1>About this document</H1> +This document was generated +by +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +<P></P> +The buttons in the navigation panels have the following meaning: +<P></P> +<table border = "1"> +<TR> +<TH> Button </TH> +<TH> Name </TH> +<TH> Go to </TH> +<TH> From 1.2.3 go to</TH> +</TR> +<TR> +<TD ALIGN="CENTER"> + [ < ] </TD> +<TD ALIGN="CENTER"> +Back +</TD> +<TD> +previous section in reading order +</TD> +<TD> +1.2.2 +</TD> +</TR> +<TR> +<TD ALIGN="CENTER"> + [ > ] </TD> +<TD ALIGN="CENTER"> +Forward +</TD> +<TD> +next section in reading order +</TD> +<TD> +1.2.4 +</TD> +</TR> +<TR> +<TD ALIGN="CENTER"> + [ << ] </TD> +<TD ALIGN="CENTER"> +FastBack +</TD> +<TD> +beginning of this chapter or previous chapter +</TD> +<TD> +1 +</TD> +</TR> +<TR> +<TD ALIGN="CENTER"> + [ Up ] </TD> +<TD ALIGN="CENTER"> +Up +</TD> +<TD> +up section +</TD> +<TD> +1.2 +</TD> +</TR> +<TR> +<TD ALIGN="CENTER"> + [ >> ] </TD> +<TD ALIGN="CENTER"> +FastForward +</TD> +<TD> +next chapter +</TD> +<TD> +2 +</TD> +</TR> +<TR> +<TD ALIGN="CENTER"> + [Top] </TD> +<TD ALIGN="CENTER"> +Top +</TD> +<TD> +cover (top) of document +</TD> +<TD> + +</TD> +</TR> +<TR> +<TD ALIGN="CENTER"> + [Contents] </TD> +<TD ALIGN="CENTER"> +Contents +</TD> +<TD> +table of contents +</TD> +<TD> + +</TD> +</TR> +<TR> +<TD ALIGN="CENTER"> + [Index] </TD> +<TD ALIGN="CENTER"> +Index +</TD> +<TD> +concept index +</TD> +<TD> + +</TD> +</TR> +<TR> +<TD ALIGN="CENTER"> + [ ? ] </TD> +<TD ALIGN="CENTER"> +About +</TD> +<TD> +this page +</TD> +<TD> + +</TD> +</TR> +</TABLE> + <P> + where the <STRONG> Example </STRONG> assumes that the current position + is at <STRONG> Subsubsection One-Two-Three </STRONG> of a document of + the following structure:</P> + <UL> + <LI> 1. Section One + <UL> + <LI>1.1 Subsection One-One + <UL> + <LI>...</LI> + </UL> + <LI>1.2 Subsection One-Two + <UL> + <LI>1.2.1 Subsubsection One-Two-One</LI> + <LI>1.2.2 Subsubsection One-Two-Two</LI> + <LI>1.2.3 Subsubsection One-Two-Three + <STRONG><== Current Position </STRONG></LI> + <LI>1.2.4 Subsubsection One-Two-Four</LI> + </UL> + </LI> + <LI>1.3 Subsection One-Three + <UL> + <LI>...</LI> + </UL> + </LI> + <LI>1.4 Subsection One-Four</LI> + </UL> + </LI> + </UL> + +<HR SIZE=1> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_fot.html b/slib_fot.html new file mode 100644 index 0000000..9d20d03 --- /dev/null +++ b/slib_fot.html @@ -0,0 +1,92 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Footnotes</TITLE> + +<META NAME="description" CONTENT="SLIB: Footnotes"> +<META NAME="keywords" CONTENT="SLIB: Footnotes"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="slib_fot.html"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1>Footnotes</H1> +<H3><A NAME="FOOT1" HREF="slib_1.html#DOCF1">(1)</A></H3> +<P>There are some functions with internal <CODE>require</CODE> calls +to delay loading modules until they are needed. While this reduces +startup latency for interpreters, it can produce headaches for +compilers. +<H3><A NAME="FOOT2" HREF="slib_1.html#DOCF2">(2)</A></H3> +<P>Although it will +work on large info files, feeding it an excerpt is much faster; and +has less chance of being confused by unusual text in the info file. +This command excerpts the SLIB index into `<TT>slib-index.info</TT>': +<P> + +<TABLE><tr><td> </td><td class=example><pre>info -f slib2d6.info -n "Index" -o slib-index.info +</pre></td></tr></table> +<H3><A NAME="FOOT3" HREF="slib_4.html#DOCF3">(3)</A></H3> +<P>How do I know this? +I parsed 250kbyte of random input (an e-mail file) with a non-trivial +grammar utilizing all constructs. +<H3><A NAME="FOOT4" HREF="slib_5.html#DOCF4">(4)</A></H3> +<P>Readers may recognize these color string formats from Xlib. +X11's color management system was doomed by its fiction that CRT +monitors' (and X11 default) color-spaces were linear RGBi. Unable to +shed this legacy, the only practical way to view pictures on X is to +ignore its color management system and use an sRGB monitor. In this +implementation the device-independent RGB709 and sRGB spaces replace the +device-dependent RGBi and RGB spaces of Xlib. +<H3><A NAME="FOOT5" HREF="slib_5.html#DOCF5">(5)</A></H3> +<P> +A comprehensive encoding of transforms between CIEXYZ and device color +spaces is the International Color Consortium profile format, +ICC.1:1998-09: +<P> + +<BLOCKQUOTE> +The intent of this format is to provide a cross-platform device profile +format. Such device profiles can be used to translate color data +created on one device into another device's native color space. +</BLOCKQUOTE> + +<H3><A NAME="FOOT6" HREF="slib_5.html#DOCF6">(6)</A></H3> +<P>David Kahaner, Cleve Moler, and Stephen Nash +<CITE>Numerical Methods and Software</CITE> +Prentice-Hall, 1989, ISBN 0-13-627258-4 +<H3><A NAME="FOOT7" HREF="slib_8.html#DOCF7">(7)</A></H3> +<P>If you are porting a +<CITE>Revised^3 Report on the Algorithmic Language Scheme</CITE> +implementation, then you will need to finish writing `<TT>sc4sc3.scm</TT>' +and <CODE>load</CODE> it from your initialization file. +<HR SIZE=1> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_ovr.html b/slib_ovr.html new file mode 100644 index 0000000..0d45685 --- /dev/null +++ b/slib_ovr.html @@ -0,0 +1,69 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Short Table of Contents</TITLE> + +<META NAME="description" CONTENT="SLIB: Short Table of Contents"> +<META NAME="keywords" CONTENT="SLIB: Short Table of Contents"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC_OVERVIEW"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1>Short Table of Contents</H1> +<BLOCKQUOTE> +<A NAME="TOC1" HREF="slib_1.html#SEC1">1. The Library System</A> +<BR> +<A NAME="TOC13" HREF="slib_2.html#SEC13">2. Universal SLIB Procedures</A> +<BR> +<A NAME="TOC21" HREF="slib_3.html#SEC21">3. Scheme Syntax Extension Packages</A> +<BR> +<A NAME="TOC45" HREF="slib_4.html#SEC45">4. Textual Conversion Packages</A> +<BR> +<A NAME="TOC88" HREF="slib_5.html#SEC88">5. Mathematical Packages</A> +<BR> +<A NAME="TOC140" HREF="slib_6.html#SEC140">6. Database Packages</A> +<BR> +<A NAME="TOC183" HREF="slib_7.html#SEC183">7. Other Packages</A> +<BR> +<A NAME="TOC277" HREF="slib_8.html#SEC277">8. About SLIB</A> +<BR> +<A NAME="TOC292" HREF="slib_9.html#SEC292">Procedure and Macro Index</A> +<BR> +<A NAME="TOC293" HREF="slib_10.html#SEC293">Variable Index</A> +<BR> +<A NAME="TOC294" HREF="slib_11.html#SEC294">Concept and Feature Index</A> +<BR> + +</BLOCKQUOTE> +<HR SIZE=1> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/slib_toc.html b/slib_toc.html new file mode 100644 index 0000000..4ad33c7 --- /dev/null +++ b/slib_toc.html @@ -0,0 +1,676 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html40/loose.dtd"> +<HTML> +<!-- Created on January, 10 2005 by texi2html 1.66 --> +<!-- +Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author) + Karl Berry <karl@freefriends.org> + Olaf Bachmann <obachman@mathematik.uni-kl.de> + and many others. +Maintained by: Many creative people <dev@texi2html.cvshome.org> +Send bugs and suggestions to <users@texi2html.cvshome.org> + +--> +<HEAD> +<TITLE>SLIB: Table of Contents</TITLE> + +<META NAME="description" CONTENT="SLIB: Table of Contents"> +<META NAME="keywords" CONTENT="SLIB: Table of Contents"> +<META NAME="resource-type" CONTENT="document"> +<META NAME="distribution" CONTENT="global"> +<META NAME="Generator" CONTENT="texi2html 1.66"> + +</HEAD> + +<BODY LANG="en" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000"> + +<A NAME="SEC_Contents"></A> +<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0> +<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib.html#SEC_Top">Top</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_toc.html#SEC_Contents">Contents</A>]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[Index]</TD> +<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="slib_abt.html#SEC_About"> ? </A>]</TD> +</TR></TABLE> +<H1>Table of Contents</H1> +<BLOCKQUOTE> +<A NAME="TOC1" HREF="slib_1.html#SEC1">1. The Library System</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC2" HREF="slib_1.html#SEC2">1.1 Feature</A> +<BR> +<A NAME="TOC3" HREF="slib_1.html#SEC3">1.2 Require</A> +<BR> +<A NAME="TOC4" HREF="slib_1.html#SEC4">1.3 Library Catalogs</A> +<BR> +<A NAME="TOC5" HREF="slib_1.html#SEC5">1.4 Catalog Creation</A> +<BR> +<A NAME="TOC6" HREF="slib_1.html#SEC6">1.5 Catalog Vicinities</A> +<BR> +<A NAME="TOC7" HREF="slib_1.html#SEC7">1.6 Compiling Scheme</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC8" HREF="slib_1.html#SEC8">1.6.1 Module Conventions</A> +<BR> +<A NAME="TOC9" HREF="slib_1.html#SEC9">1.6.2 Module Manifests</A> +<BR> +<A NAME="TOC10" HREF="slib_1.html#SEC10">1.6.3 Module Semantics</A> +<BR> +<A NAME="TOC11" HREF="slib_1.html#SEC11">1.6.4 Top-level Variable References</A> +<BR> +<A NAME="TOC12" HREF="slib_1.html#SEC12">1.6.5 Module Analysis</A> +<BR> +</BLOCKQUOTE> +</BLOCKQUOTE> +<A NAME="TOC13" HREF="slib_2.html#SEC13">2. Universal SLIB Procedures</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC14" HREF="slib_2.html#SEC14">2.1 Vicinity</A> +<BR> +<A NAME="TOC15" HREF="slib_2.html#SEC15">2.2 Configuration</A> +<BR> +<A NAME="TOC16" HREF="slib_2.html#SEC16">2.3 Input/Output</A> +<BR> +<A NAME="TOC17" HREF="slib_2.html#SEC17">2.4 System</A> +<BR> +<A NAME="TOC18" HREF="slib_2.html#SEC18">2.5 Miscellany</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC19" HREF="slib_2.html#SEC19">2.5.1 Mutual Exclusion</A> +<BR> +<A NAME="TOC20" HREF="slib_2.html#SEC20">2.5.2 Legacy</A> +<BR> +</BLOCKQUOTE> +</BLOCKQUOTE> +<A NAME="TOC21" HREF="slib_3.html#SEC21">3. Scheme Syntax Extension Packages</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC22" HREF="slib_3.html#SEC22">3.1 Defmacro</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC23" HREF="slib_3.html#SEC23">3.1.1 Defmacroexpand</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC24" HREF="slib_3.html#SEC24">3.2 R4RS Macros</A> +<BR> +<A NAME="TOC25" HREF="slib_3.html#SEC25">3.3 Macro by Example</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC26" HREF="slib_3.html#SEC26">3.3.1 Caveat</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC27" HREF="slib_3.html#SEC27">3.4 Macros That Work</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC28" HREF="slib_3.html#SEC28">3.4.1 Definitions</A> +<BR> +<A NAME="TOC29" HREF="slib_3.html#SEC29">3.4.2 Restrictions</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC30" HREF="slib_3.html#SEC30">3.5 Syntactic Closures</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC31" HREF="slib_3.html#SEC31">3.5.1 Syntactic Closure Macro Facility</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC32" HREF="slib_3.html#SEC32">3.5.1.1 Terminology</A> +<BR> +<A NAME="TOC33" HREF="slib_3.html#SEC33">3.5.1.2 Transformer Definition</A> +<BR> +<A NAME="TOC34" HREF="slib_3.html#SEC34">3.5.1.3 Identifiers</A> +<BR> +<A NAME="TOC35" HREF="slib_3.html#SEC35">3.5.1.4 Acknowledgements</A> +<BR> +</BLOCKQUOTE> +</BLOCKQUOTE> +<A NAME="TOC36" HREF="slib_3.html#SEC36">3.6 Syntax-Case Macros</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC37" HREF="slib_3.html#SEC37">3.6.1 Notes</A> +<BR> +<A NAME="TOC38" HREF="slib_3.html#SEC38">3.6.2 Note from SLIB maintainer</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC39" HREF="slib_3.html#SEC39">3.7 Fluid-Let</A> +<BR> +<A NAME="TOC40" HREF="slib_3.html#SEC40">3.8 Yasos</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC41" HREF="slib_3.html#SEC41">3.8.1 Terms</A> +<BR> +<A NAME="TOC42" HREF="slib_3.html#SEC42">3.8.2 Interface</A> +<BR> +<A NAME="TOC43" HREF="slib_3.html#SEC43">3.8.3 Setters</A> +<BR> +<A NAME="TOC44" HREF="slib_3.html#SEC44">3.8.4 Examples</A> +<BR> +</BLOCKQUOTE> +</BLOCKQUOTE> +<A NAME="TOC45" HREF="slib_4.html#SEC45">4. Textual Conversion Packages</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC46" HREF="slib_4.html#SEC46">4.1 Precedence Parsing</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC47" HREF="slib_4.html#SEC47">4.1.1 Precedence Parsing Overview</A> +<BR> +<A NAME="TOC48" HREF="slib_4.html#SEC48">4.1.2 Rule Types</A> +<BR> +<A NAME="TOC49" HREF="slib_4.html#SEC49">4.1.3 Ruleset Definition and Use</A> +<BR> +<A NAME="TOC50" HREF="slib_4.html#SEC50">4.1.4 Token definition</A> +<BR> +<A NAME="TOC51" HREF="slib_4.html#SEC51">4.1.5 Nud and Led Definition</A> +<BR> +<A NAME="TOC52" HREF="slib_4.html#SEC52">4.1.6 Grammar Rule Definition</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC53" HREF="slib_4.html#SEC53">4.2 Format (version 3.0)</A> +<BR> +<A NAME="TOC54" HREF="slib_4.html#SEC54">4.3 Standard Formatted I/O</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC55" HREF="slib_4.html#SEC55">4.3.1 stdio</A> +<BR> +<A NAME="TOC56" HREF="slib_4.html#SEC56">4.3.2 Standard Formatted Output</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC57" HREF="slib_4.html#SEC57">4.3.2.1 Exact Conversions</A> +<BR> +<A NAME="TOC58" HREF="slib_4.html#SEC58">4.3.2.2 Inexact Conversions</A> +<BR> +<A NAME="TOC59" HREF="slib_4.html#SEC59">4.3.2.3 Other Conversions</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC60" HREF="slib_4.html#SEC60">4.3.3 Standard Formatted Input</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC61" HREF="slib_4.html#SEC61">4.4 Program and Arguments</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC62" HREF="slib_4.html#SEC62">4.4.1 Getopt</A> +<BR> +<A NAME="TOC63" HREF="slib_4.html#SEC63">4.4.2 Getopt---</A> +<BR> +<A NAME="TOC64" HREF="slib_4.html#SEC64">4.4.3 Command Line</A> +<BR> +<A NAME="TOC65" HREF="slib_4.html#SEC65">4.4.4 Parameter lists</A> +<BR> +<A NAME="TOC66" HREF="slib_4.html#SEC66">4.4.5 Getopt Parameter lists</A> +<BR> +<A NAME="TOC67" HREF="slib_4.html#SEC67">4.4.6 Filenames</A> +<BR> +<A NAME="TOC68" HREF="slib_4.html#SEC68">4.4.7 Batch</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC69" HREF="slib_4.html#SEC69">4.5 HTML</A> +<BR> +<A NAME="TOC70" HREF="slib_4.html#SEC70">4.6 HTML Forms</A> +<BR> +<A NAME="TOC71" HREF="slib_4.html#SEC71">4.7 HTML Tables</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC72" HREF="slib_4.html#SEC72">4.7.1 HTML editing tables</A> +<BR> +<A NAME="TOC73" HREF="slib_4.html#SEC73">4.7.2 HTML databases</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC74" HREF="slib_4.html#SEC74">4.8 HTTP and CGI</A> +<BR> +<A NAME="TOC75" HREF="slib_4.html#SEC75">4.9 Parsing HTML</A> +<BR> +<A NAME="TOC76" HREF="slib_4.html#SEC76">4.10 URI</A> +<BR> +<A NAME="TOC78" HREF="slib_4.html#SEC78">4.11 Printing Scheme</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC79" HREF="slib_4.html#SEC79">4.11.1 Generic-Write</A> +<BR> +<A NAME="TOC80" HREF="slib_4.html#SEC80">4.11.2 Object-To-String</A> +<BR> +<A NAME="TOC81" HREF="slib_4.html#SEC81">4.11.3 Pretty-Print</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC82" HREF="slib_4.html#SEC82">4.12 Time and Date</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC83" HREF="slib_4.html#SEC83">4.12.1 Time Zone</A> +<BR> +<A NAME="TOC84" HREF="slib_4.html#SEC84">4.12.2 Posix Time</A> +<BR> +<A NAME="TOC85" HREF="slib_4.html#SEC85">4.12.3 Common-Lisp Time</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC86" HREF="slib_4.html#SEC86">4.13 NCBI-DNA</A> +<BR> +<A NAME="TOC87" HREF="slib_4.html#SEC87">4.14 Schmooz</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC88" HREF="slib_5.html#SEC88">5. Mathematical Packages</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC89" HREF="slib_5.html#SEC89">5.1 Bit-Twiddling</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC90" HREF="slib_5.html#SEC90">5.1.1 Bitwise Operations</A> +<BR> +<A NAME="TOC91" HREF="slib_5.html#SEC91">5.1.2 Bit Within Word</A> +<BR> +<A NAME="TOC92" HREF="slib_5.html#SEC92">5.1.3 Fields of Bits</A> +<BR> +<A NAME="TOC93" HREF="slib_5.html#SEC93">5.1.4 Bit order and Lamination</A> +<BR> +<A NAME="TOC94" HREF="slib_5.html#SEC94">5.1.5 Gray code</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC95" HREF="slib_5.html#SEC95">5.2 Modular Arithmetic</A> +<BR> +<A NAME="TOC96" HREF="slib_5.html#SEC96">5.3 Prime Numbers</A> +<BR> +<A NAME="TOC97" HREF="slib_5.html#SEC97">5.4 Random Numbers</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC98" HREF="slib_5.html#SEC98">5.4.1 Exact Random Numbers</A> +<BR> +<A NAME="TOC99" HREF="slib_5.html#SEC99">5.4.2 Inexact Random Numbers</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC100" HREF="slib_5.html#SEC100">5.5 Fast Fourier Transform</A> +<BR> +<A NAME="TOC101" HREF="slib_5.html#SEC101">5.6 Cyclic Checksum</A> +<BR> +<A NAME="TOC102" HREF="slib_5.html#SEC102">5.7 Graphing</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC103" HREF="slib_5.html#SEC103">5.7.1 Character Plotting</A> +<BR> +<A NAME="TOC104" HREF="slib_5.html#SEC104">5.7.2 PostScript Graphing</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC105" HREF="slib_5.html#SEC105">5.7.2.1 Column Ranges</A> +<BR> +<A NAME="TOC106" HREF="slib_5.html#SEC106">5.7.2.2 Drawing the Graph</A> +<BR> +<A NAME="TOC107" HREF="slib_5.html#SEC107">5.7.2.3 Graphics Context</A> +<BR> +<A NAME="TOC108" HREF="slib_5.html#SEC108">5.7.2.4 Rectangles</A> +<BR> +<A NAME="TOC109" HREF="slib_5.html#SEC109">5.7.2.5 Legending</A> +<BR> +<A NAME="TOC110" HREF="slib_5.html#SEC110">5.7.2.6 Legacy Plotting</A> +<BR> +<A NAME="TOC111" HREF="slib_5.html#SEC111">5.7.2.7 Example Graph</A> +<BR> +</BLOCKQUOTE> +</BLOCKQUOTE> +<A NAME="TOC112" HREF="slib_5.html#SEC112">5.8 Solid Modeling</A> +<BR> +<A NAME="TOC118" HREF="slib_5.html#SEC118">5.9 Color</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC119" HREF="slib_5.html#SEC119">5.9.1 Color Data-Type</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC120" HREF="slib_5.html#SEC120">5.9.1.1 External Representation</A> +<BR> +<A NAME="TOC121" HREF="slib_5.html#SEC121">5.9.1.2 White</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC122" HREF="slib_5.html#SEC122">5.9.2 Color Spaces</A> +<BR> +<A NAME="TOC127" HREF="slib_5.html#SEC127">5.9.3 Spectra</A> +<BR> +<A NAME="TOC128" HREF="slib_5.html#SEC128">5.9.4 Color Difference Metrics</A> +<BR> +<A NAME="TOC129" HREF="slib_5.html#SEC129">5.9.5 Color Conversions</A> +<BR> +<A NAME="TOC130" HREF="slib_5.html#SEC130">5.9.6 Color Names</A> +<BR> +<A NAME="TOC133" HREF="slib_5.html#SEC133">5.9.7 Daylight</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC134" HREF="slib_5.html#SEC134">5.10 Root Finding</A> +<BR> +<A NAME="TOC135" HREF="slib_5.html#SEC135">5.11 Minimizing</A> +<BR> +<A NAME="TOC136" HREF="slib_5.html#SEC136">5.12 Commutative Rings</A> +<BR> +<A NAME="TOC137" HREF="slib_5.html#SEC137">5.13 Rules and Rulesets</A> +<BR> +<A NAME="TOC138" HREF="slib_5.html#SEC138">5.14 How to Create a Commutative Ring</A> +<BR> +<A NAME="TOC139" HREF="slib_5.html#SEC139">5.15 Matrix Algebra</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC140" HREF="slib_6.html#SEC140">6. Database Packages</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC141" HREF="slib_6.html#SEC141">6.1 Relational Database</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC142" HREF="slib_6.html#SEC142">6.1.1 Using Databases</A> +<BR> +<A NAME="TOC147" HREF="slib_6.html#SEC147">6.1.2 Table Operations</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC148" HREF="slib_6.html#SEC148">6.1.2.1 Single Row Operations</A> +<BR> +<A NAME="TOC149" HREF="slib_6.html#SEC149">6.1.2.2 Match-Keys</A> +<BR> +<A NAME="TOC150" HREF="slib_6.html#SEC150">6.1.2.3 Multi-Row Operations</A> +<BR> +<A NAME="TOC151" HREF="slib_6.html#SEC151">6.1.2.4 Indexed Sequential Access Methods</A> +<BR> +<A NAME="TOC152" HREF="slib_6.html#SEC152">6.1.2.5 Sequential Index Operations</A> +<BR> +<A NAME="TOC153" HREF="slib_6.html#SEC153">6.1.2.6 Table Administration</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC154" HREF="slib_6.html#SEC154">6.1.3 Database Interpolation</A> +<BR> +<A NAME="TOC155" HREF="slib_6.html#SEC155">6.1.4 Embedded Commands</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC156" HREF="slib_6.html#SEC156">6.1.4.1 Database Extension</A> +<BR> +<A NAME="TOC157" HREF="slib_6.html#SEC157">6.1.4.2 Command Intrinsics</A> +<BR> +<A NAME="TOC158" HREF="slib_6.html#SEC158">6.1.4.3 Define-tables Example</A> +<BR> +<A NAME="TOC159" HREF="slib_6.html#SEC159">6.1.4.4 The *commands* Table</A> +<BR> +<A NAME="TOC160" HREF="slib_6.html#SEC160">6.1.4.5 Command Service</A> +<BR> +<A NAME="TOC161" HREF="slib_6.html#SEC161">6.1.4.6 Command Example</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC162" HREF="slib_6.html#SEC162">6.1.5 Database Macros</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC163" HREF="slib_6.html#SEC163">6.1.5.1 Within-database Example</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC164" HREF="slib_6.html#SEC164">6.1.6 Database Browser</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC165" HREF="slib_6.html#SEC165">6.2 Relational Infrastructure</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC166" HREF="slib_6.html#SEC166">6.2.1 Base Table</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC167" HREF="slib_6.html#SEC167">6.2.1.1 The Base</A> +<BR> +<A NAME="TOC168" HREF="slib_6.html#SEC168">6.2.1.2 Base Tables</A> +<BR> +<A NAME="TOC169" HREF="slib_6.html#SEC169">6.2.1.3 Base Field Types</A> +<BR> +<A NAME="TOC170" HREF="slib_6.html#SEC170">6.2.1.4 Composite Keys</A> +<BR> +<A NAME="TOC171" HREF="slib_6.html#SEC171">6.2.1.5 Base Record Operations</A> +<BR> +<A NAME="TOC172" HREF="slib_6.html#SEC172">6.2.1.6 Match Keys</A> +<BR> +<A NAME="TOC173" HREF="slib_6.html#SEC173">6.2.1.7 Aggregate Base Operations</A> +<BR> +<A NAME="TOC174" HREF="slib_6.html#SEC174">6.2.1.8 Base ISAM Operations</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC175" HREF="slib_6.html#SEC175">6.2.2 Catalog Representation</A> +<BR> +<A NAME="TOC176" HREF="slib_6.html#SEC176">6.2.3 Relational Database Objects</A> +<BR> +<A NAME="TOC177" HREF="slib_6.html#SEC177">6.2.4 Database Operations</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC178" HREF="slib_6.html#SEC178">6.3 Weight-Balanced Trees</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC179" HREF="slib_6.html#SEC179">6.3.1 Construction of Weight-Balanced Trees</A> +<BR> +<A NAME="TOC180" HREF="slib_6.html#SEC180">6.3.2 Basic Operations on Weight-Balanced Trees</A> +<BR> +<A NAME="TOC181" HREF="slib_6.html#SEC181">6.3.3 Advanced Operations on Weight-Balanced Trees</A> +<BR> +<A NAME="TOC182" HREF="slib_6.html#SEC182">6.3.4 Indexing Operations on Weight-Balanced Trees</A> +<BR> +</BLOCKQUOTE> +</BLOCKQUOTE> +<A NAME="TOC183" HREF="slib_7.html#SEC183">7. Other Packages</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC184" HREF="slib_7.html#SEC184">7.1 Data Structures</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC185" HREF="slib_7.html#SEC185">7.1.1 Arrays</A> +<BR> +<A NAME="TOC186" HREF="slib_7.html#SEC186">7.1.2 Subarrays</A> +<BR> +<A NAME="TOC187" HREF="slib_7.html#SEC187">7.1.3 Array Mapping</A> +<BR> +<A NAME="TOC188" HREF="slib_7.html#SEC188">7.1.4 Association Lists</A> +<BR> +<A NAME="TOC189" HREF="slib_7.html#SEC189">7.1.5 Byte</A> +<BR> +<A NAME="TOC190" HREF="slib_7.html#SEC190">7.1.6 Byte/Number Conversions</A> +<BR> +<A NAME="TOC192" HREF="slib_7.html#SEC192">7.1.7 MAT-File Format</A> +<BR> +<A NAME="TOC193" HREF="slib_7.html#SEC193">7.1.8 Portable Image Files</A> +<BR> +<A NAME="TOC194" HREF="slib_7.html#SEC194">7.1.9 Collections</A> +<BR> +<A NAME="TOC195" HREF="slib_7.html#SEC195">7.1.10 Dynamic Data Type</A> +<BR> +<A NAME="TOC196" HREF="slib_7.html#SEC196">7.1.11 Hash Tables</A> +<BR> +<A NAME="TOC197" HREF="slib_7.html#SEC197">7.1.12 Macroless Object System</A> +<BR> +<A NAME="TOC198" HREF="slib_7.html#SEC198">7.1.13 Concepts</A> +<BR> +<A NAME="TOC199" HREF="slib_7.html#SEC199">7.1.14 Procedures</A> +<BR> +<A NAME="TOC200" HREF="slib_7.html#SEC200">7.1.15 Examples</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC201" HREF="slib_7.html#SEC201">7.1.15.1 Inverter Documentation</A> +<BR> +<A NAME="TOC202" HREF="slib_7.html#SEC202">7.1.15.2 Number Documention</A> +<BR> +<A NAME="TOC203" HREF="slib_7.html#SEC203">7.1.15.3 Inverter code</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC204" HREF="slib_7.html#SEC204">7.1.16 Priority Queues</A> +<BR> +<A NAME="TOC205" HREF="slib_7.html#SEC205">7.1.17 Queues</A> +<BR> +<A NAME="TOC206" HREF="slib_7.html#SEC206">7.1.18 Records</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC207" HREF="slib_7.html#SEC207">7.2 Sorting and Searching</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC208" HREF="slib_7.html#SEC208">7.2.1 Common List Functions</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC209" HREF="slib_7.html#SEC209">7.2.1.1 List construction</A> +<BR> +<A NAME="TOC210" HREF="slib_7.html#SEC210">7.2.1.2 Lists as sets</A> +<BR> +<A NAME="TOC211" HREF="slib_7.html#SEC211">7.2.1.3 Lists as sequences</A> +<BR> +<A NAME="TOC212" HREF="slib_7.html#SEC212">7.2.1.4 Destructive list operations</A> +<BR> +<A NAME="TOC213" HREF="slib_7.html#SEC213">7.2.1.5 Non-List functions</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC214" HREF="slib_7.html#SEC214">7.2.2 Tree operations</A> +<BR> +<A NAME="TOC215" HREF="slib_7.html#SEC215">7.2.3 Chapter Ordering</A> +<BR> +<A NAME="TOC216" HREF="slib_7.html#SEC216">7.2.4 Sorting</A> +<BR> +<A NAME="TOC217" HREF="slib_7.html#SEC217">7.2.5 Topological Sort</A> +<BR> +<A NAME="TOC218" HREF="slib_7.html#SEC218">7.2.6 Hashing</A> +<BR> +<A NAME="TOC219" HREF="slib_7.html#SEC219">7.2.7 Space-Filling Curves</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC220" HREF="slib_7.html#SEC220">7.2.7.1 Peano-Hilbert Space-Filling Curve</A> +<BR> +<A NAME="TOC221" HREF="slib_7.html#SEC221">7.2.7.2 Sierpinski Curve</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC222" HREF="slib_7.html#SEC222">7.2.8 Soundex</A> +<BR> +<A NAME="TOC223" HREF="slib_7.html#SEC223">7.2.9 String Search</A> +<BR> +<A NAME="TOC224" HREF="slib_7.html#SEC224">7.2.10 Sequence Comparison</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC225" HREF="slib_7.html#SEC225">7.3 Procedures</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC226" HREF="slib_7.html#SEC226">7.3.1 Type Coercion</A> +<BR> +<A NAME="TOC227" HREF="slib_7.html#SEC227">7.3.2 String-Case</A> +<BR> +<A NAME="TOC228" HREF="slib_7.html#SEC228">7.3.3 String Ports</A> +<BR> +<A NAME="TOC229" HREF="slib_7.html#SEC229">7.3.4 Line I/O</A> +<BR> +<A NAME="TOC230" HREF="slib_7.html#SEC230">7.3.5 Multi-Processing</A> +<BR> +<A NAME="TOC231" HREF="slib_7.html#SEC231">7.3.6 Metric Units</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC232" HREF="slib_7.html#SEC232">7.3.6.1 SI Prefixes</A> +<BR> +<A NAME="TOC233" HREF="slib_7.html#SEC233">7.3.6.2 Binary Prefixes</A> +<BR> +<A NAME="TOC234" HREF="slib_7.html#SEC234">7.3.6.3 Unit Symbols</A> +<BR> +</BLOCKQUOTE> +</BLOCKQUOTE> +<A NAME="TOC235" HREF="slib_7.html#SEC235">7.4 Standards Support</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC236" HREF="slib_7.html#SEC236">7.4.1 RnRS</A> +<BR> +<A NAME="TOC237" HREF="slib_7.html#SEC237">7.4.2 With-File</A> +<BR> +<A NAME="TOC238" HREF="slib_7.html#SEC238">7.4.3 Transcripts</A> +<BR> +<A NAME="TOC239" HREF="slib_7.html#SEC239">7.4.4 Rev2 Procedures</A> +<BR> +<A NAME="TOC240" HREF="slib_7.html#SEC240">7.4.5 Rev4 Optional Procedures</A> +<BR> +<A NAME="TOC241" HREF="slib_7.html#SEC241">7.4.6 Multi-argument / and -</A> +<BR> +<A NAME="TOC242" HREF="slib_7.html#SEC242">7.4.7 Multi-argument Apply</A> +<BR> +<A NAME="TOC243" HREF="slib_7.html#SEC243">7.4.8 Rationalize</A> +<BR> +<A NAME="TOC244" HREF="slib_7.html#SEC244">7.4.9 Promises</A> +<BR> +<A NAME="TOC245" HREF="slib_7.html#SEC245">7.4.10 Dynamic-Wind</A> +<BR> +<A NAME="TOC246" HREF="slib_7.html#SEC246">7.4.11 Eval</A> +<BR> +<A NAME="TOC247" HREF="slib_7.html#SEC247">7.4.12 Values</A> +<BR> +<A NAME="TOC248" HREF="slib_7.html#SEC248">7.4.13 SRFI</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC249" HREF="slib_7.html#SEC249">7.4.13.1 SRFI-1</A> +<BR> +<A NAME="TOC260" HREF="slib_7.html#SEC260">7.4.13.2 SRFI-2</A> +<BR> +<A NAME="TOC261" HREF="slib_7.html#SEC261">7.4.13.3 SRFI-8</A> +<BR> +<A NAME="TOC262" HREF="slib_7.html#SEC262">7.4.13.4 SRFI-9</A> +<BR> +</BLOCKQUOTE> +</BLOCKQUOTE> +<A NAME="TOC263" HREF="slib_7.html#SEC263">7.5 Session Support</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC264" HREF="slib_7.html#SEC264">7.5.1 Repl</A> +<BR> +<A NAME="TOC265" HREF="slib_7.html#SEC265">7.5.2 Quick Print</A> +<BR> +<A NAME="TOC266" HREF="slib_7.html#SEC266">7.5.3 Debug</A> +<BR> +<A NAME="TOC267" HREF="slib_7.html#SEC267">7.5.4 Breakpoints</A> +<BR> +<A NAME="TOC268" HREF="slib_7.html#SEC268">7.5.5 Tracing</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC269" HREF="slib_7.html#SEC269">7.6 System Interface</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC270" HREF="slib_7.html#SEC270">7.6.1 Directories</A> +<BR> +<A NAME="TOC271" HREF="slib_7.html#SEC271">7.6.2 Transactions</A> +<BR> +<A NAME="TOC275" HREF="slib_7.html#SEC275">7.6.3 CVS</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC276" HREF="slib_7.html#SEC276">7.7 Extra-SLIB Packages</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC277" HREF="slib_8.html#SEC277">8. About SLIB</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC278" HREF="slib_8.html#SEC278">8.1 Installation</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC279" HREF="slib_8.html#SEC279">8.1.1 Unpacking the SLIB Distribution</A> +<BR> +<A NAME="TOC280" HREF="slib_8.html#SEC280">8.1.2 Configure Scheme Implementation to Locate SLIB</A> +<BR> +<A NAME="TOC281" HREF="slib_8.html#SEC281">8.1.3 Loading SLIB Initialization File</A> +<BR> +<A NAME="TOC282" HREF="slib_8.html#SEC282">8.1.4 Build New SLIB Catalog for Implementation</A> +<BR> +<A NAME="TOC283" HREF="slib_8.html#SEC283">8.1.5 Implementation-specific Instructions</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC284" HREF="slib_8.html#SEC284">8.2 Porting</A> +<BR> +<A NAME="TOC285" HREF="slib_8.html#SEC285">8.3 Coding Guidelines</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC286" HREF="slib_8.html#SEC286">8.3.1 Modifications</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC287" HREF="slib_8.html#SEC287">8.4 Copyrights</A> +<BR> +<BLOCKQUOTE> +<A NAME="TOC288" HREF="slib_8.html#SEC288">8.4.1 Putting code into the Public Domain</A> +<BR> +<A NAME="TOC289" HREF="slib_8.html#SEC289">8.4.2 Explicit copying terms</A> +<BR> +<A NAME="TOC290" HREF="slib_8.html#SEC290">8.4.3 Example: Company Copyright Disclaimer</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC291" HREF="slib_8.html#SEC291">8.5 About this manual</A> +<BR> +</BLOCKQUOTE> +<A NAME="TOC292" HREF="slib_9.html#SEC292">Procedure and Macro Index</A> +<BR> +<A NAME="TOC293" HREF="slib_10.html#SEC293">Variable Index</A> +<BR> +<A NAME="TOC294" HREF="slib_11.html#SEC294">Concept and Feature Index</A> +<BR> +</BLOCKQUOTE> +<HR SIZE=1> +<BR> +<FONT SIZE="-1"> +This document was generated +by <I>Steve Langasek</I> on <I>January, 10 2005</I> +using <A HREF="http://texi2html.cvshome.org"><I>texi2html</I></A> +</FONT> + +</BODY> +</HTML> diff --git a/srcdir.mk b/srcdir.mk new file mode 100644 index 0000000..befa6a7 --- /dev/null +++ b/srcdir.mk @@ -0,0 +1,2 @@ +srcdir = /home/devel/release/slib-3a1/ + diff --git a/strsrch.scm b/strsrch.scm index 13edb65..7773e51 100644 --- a/strsrch.scm +++ b/strsrch.scm @@ -6,7 +6,7 @@ ; This code is in the public domain. ;;;@ Return the index of the first occurence of chr in str, or #f -(define (string-index str chr) +(define (strsrch:string-index str chr) (define len (string-length str)) (do ((pos 0 (+ 1 pos))) ((or (>= pos len) (char=? chr (string-ref str pos))) @@ -34,7 +34,7 @@ (cond ((zero? patlen) 0) ; trivial match ((>= patlen strlen) (and (= patlen strlen) (string=? pat str) 0)) ;; use faster string-index to match a single-character pattern - ((= 1 patlen) (string-index str (string-ref pat 0))) + ((= 1 patlen) (strsrch:string-index str (string-ref pat 0))) ((or (<= strlen (+ patlen patlen (quotient char-code-limit 2))) (<= patlen 4)) (subloop pat patlen str strlen char=?)) @@ -55,7 +55,7 @@ (define strlen (string-length str)) (cond ((zero? patlen) 0) ; trivial match ((>= patlen strlen) (and (= patlen strlen) (string-ci=? pat str) 0)) - ((= 1 patlen) (string-index-ci str (string-ref pat 0))) + ((= 1 patlen) (strsrch:string-index-ci str (string-ref pat 0))) ((or (<= strlen (+ patlen patlen (quotient char-code-limit 2))) (<= patlen 4)) (subloop pat patlen str strlen char-ci=?)) |