From 5bea21e81ed516440e34e480f2c33ca41aa8c597 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Mon, 20 Feb 2017 00:05:36 -0800 Subject: Import Upstream version 3a4 --- slib.texi | 498 ++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 323 insertions(+), 175 deletions(-) (limited to 'slib.texi') diff --git a/slib.texi b/slib.texi index 0a5b8f3..3a5de3f 100644 --- a/slib.texi +++ b/slib.texi @@ -1,7 +1,7 @@ \input texinfo @c -*-texinfo-*- @c %**start of header @setfilename slib.info -@settitle SLIB +@settitle slib @include version.txi @setchapternewpage on @c Choices for setchapternewpage are {on,off,odd}. @@ -11,6 +11,31 @@ @syncodeindex tp cp @c %**end of header +@copying +@noindent +This manual is for SLIB (version @value{SLIBVERSION}, @value{SLIBDATE}), +the portable Scheme library. + +@noindent +@c Copyright (C) 1993 Todd R. Eigenschink@* +Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no +Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,'' +and with the Back-Cover Texts as in (a) below. A copy of the +license is included in the section entitled ``GNU Free Documentation +License.'' + +(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify +this GNU Manual, like GNU software. Copies published by the Free +Software Foundation raise funds for GNU development.'' +@end quotation +@end copying + @dircategory The Algorithmic Language Scheme @direntry * SLIB: (slib). Scheme Library @@ -23,95 +48,23 @@ @parskip 4pt plus 1pt @end iftex -@ifinfo -This file documents SLIB, the portable Scheme library. - -Copyright (C) 1993 Todd R. Eigenschink@* -Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 Aubrey Jaffer - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the author. -@end ifinfo - -@node Top, The Library System, (dir), (dir) - @titlepage @title SLIB @subtitle The Portable Scheme Library -@subtitle Version @value{SLIBVERSION} -@author by Aubrey Jaffer +@subtitle Version @value{SLIBVERSION}, @value{SLIBDATE} +@author Aubrey Jaffer @page - -@noindent -@dfn{SLIB} is a portable library for the programming language -@dfn{Scheme}. It provides a platform independent framework for using -@dfn{packages} 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. - -@noindent -More people than I can name have contributed to SLIB. Thanks to all of -you! -@sp 1 -@quotation -SLIB @value{SLIBVERSION}, released @value{SLIBDATE}.@* -Aubrey Jaffer @* -@ifset html - -@end ifset -@url{http://swiss.csail.mit.edu/~jaffer/SLIB.html} -@ifset html - -@end ifset -@end quotation - @vskip 0pt plus 1filll -Copyright @copyright{} 1993 Todd R. Eigenschink@* -Copyright @copyright{} 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 Aubrey Jaffer - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the author. +@insertcopying @end titlepage +@contents + @ifnottex -@noindent -@dfn{SLIB} is a portable library for the programming language -@dfn{Scheme}. It provides a platform independent framework for using -@dfn{packages} 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. -@end ifnottex +@node Top, The Library System, (dir), (dir) +@top SLIB + +@insertcopying @menu * The Library System:: How to use and customize. @@ -124,10 +77,19 @@ implementation, user, or directory. * About SLIB:: Install, etc. * Index:: @end menu +@end ifnottex @node The Library System, Universal SLIB Procedures, Top, Top @chapter The Library System +@noindent +@dfn{SLIB} is a portable library for the programming language +@dfn{Scheme}. It provides a platform independent framework for using +@dfn{packages} 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. + @menu * Feature:: SLIB names. * Require:: @@ -152,6 +114,12 @@ are properties of the Scheme implementation being used. The following @dfn{intrinsic feature}s detail what sort of numbers are available from an implementation: +@ftindex inexact +@ftindex rational +@ftindex real +@ftindex complex +@ftindex bignum + @itemize @bullet @item 'inexact @@ -220,14 +188,14 @@ Informs SLIB that @var{feature} is supported in this session. (provided? 'foo) @result{} #t @end example -@c @defvar *features* +@c @defvar slib:features @c Is a list of symbols denoting features present in this implementation. -@c @var{*features*} can grow as modules are @code{require}d. -@c @footnote{The variables @var{*modules*} and @var{*features*} were +@c @var{slib:features} can grow as modules are @code{require}d. +@c @footnote{The variables @var{*modules*} and @var{slib:features} were @c originally modeled on variables of the same names in common-lisp. But @c the distinction between features native to an implementation versus @c those provided by loading files was not useful. The symbols in -@c @var{*features*} now indicate the presence of a capability regardless +@c @var{slib:features} now indicate the presence of a capability regardless @c of how it was provided.} @c @end defvar @@ -865,11 +833,11 @@ slib "@value{SLIBVERSION}" 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* : +loaded slib:features : trace alist qp sort common-list-functions macro values getopt compiled -implementation *features* : +implementation slib:features : bignum complex real rational inexact vicinity ed getenv tmpnam abort transcript with-file @@ -1149,7 +1117,7 @@ The following procedures were present in Scheme until R4RS They are provided by all SLIB implementations. @defvr Constant t -Derfined as @code{#t}. +Defined as @code{#t}. @end defvr @defvr Constant nil @@ -2740,7 +2708,7 @@ call graph of grammar rules effectively instantiate the sytnax tree. @noindent The JACAL symbolic math system -(@url{http://swiss.csail.mit.edu/~jaffer/JACAL.html}) uses +(@url{http://swiss.csail.mit.edu/~jaffer/JACAL}) uses @t{precedence-parse}. Its grammar definitions in the file @file{jacal/English.scm} can serve as examples of use. @@ -2867,10 +2835,10 @@ The @var{ruleset} argument must be a list of rules as constructed by @code{prec:define-grammar} and extracted from @var{*syn-defs*}. The token @var{delim} may be a character, symbol, or string. A -character @var{delim} 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. +character @var{delim} argument will match only a character token; +i.e. a character for which no token-group is assigned. A symbol or +string will match only a token string; i.e. a token resulting from a +token group. @code{prec:parse} reads a @var{ruleset} grammar expression delimited by @var{delim} from the given input @var{port}. @code{prec:parse} @@ -4817,9 +4785,11 @@ match the arguments to @code{encode-universal-time}. @menu * Bit-Twiddling:: 'logical * Modular Arithmetic:: 'modular +* Irrational Integer Functions:: +* Irrational Real Functions:: * Prime Numbers:: 'factor * Random Numbers:: 'random -* Fast Fourier Transform:: 'fft +* Discrete Fourier Transform:: 'dft * Cyclic Checksum:: 'crc * Graphing:: * Solid Modeling:: VRML97 @@ -4835,8 +4805,9 @@ match the arguments to @code{encode-universal-time}. @node Bit-Twiddling, Modular Arithmetic, Mathematical Packages, Mathematical Packages @section Bit-Twiddling -@code{(require 'logical)} +@code{(require 'logical)} or @code{(require 'srfi-60)} @ftindex logical +@ftindex srfi-60 @noindent The bit-twiddling functions are made available through the use of the @@ -5114,13 +5085,168 @@ Returns the integer coded by the @var{bool1} @dots{} arguments. -@node Modular Arithmetic, Prime Numbers, Bit-Twiddling, Mathematical Packages +@node Modular Arithmetic, Irrational Integer Functions, Bit-Twiddling, Mathematical Packages @section Modular Arithmetic @include modular.txi -@node Prime Numbers, Random Numbers, Modular Arithmetic, Mathematical Packages +@node Irrational Integer Functions, Irrational Real Functions, Modular Arithmetic, Mathematical Packages +@section Irrational Integer Functions + +@include math-integer.txi + + +@node Irrational Real Functions, Prime Numbers, Irrational Integer Functions, Mathematical Packages +@section Irrational Real Functions + +@code{(require 'math-real)} +@ftindex math-real + +Although this package defines real and complex functions, it is safe +to load into an integer-only implementation; those functions will be +defined to #f. + +@defun real-exp @var{x} +@defunx real-ln @var{x} +@defunx real-log @var{y} @var{x} +@defunx real-sin @var{x} +@defunx real-cos @var{x} +@defunx real-tan @var{x} +@defunx real-asin @var{x} +@defunx real-acos @var{x} +@defunx real-atan @var{x} +@defunx atan @var{y} @var{x} + +These procedures are part of every implementation that supports +general real numbers; they compute the usual transcendental functions. +@samp{real-ln} computes the natural logarithm of @var{x}; +@samp{real-log} computes the logarithm of @var{x} base @var{y}, which +is @code{(/ (real-ln x) (real-ln y))}. If arguments @var{x} and +@var{y} are not both real; or if the correct result would not be real, +then these procedures signal an error. + +@end defun + + +@defun real-sqrt @var{x} + +For non-negative real @var{x} the result will be its positive square +root; otherwise an error will be signaled. + +@end defun + + +@defun real-expt x1 x2 + +Returns @var{x1} raised to the power @var{x2} if that result is a real +number; otherwise signals an error. + +@code{(real-expt 0.0 @var{x2})} + +@itemize @bullet +@item +returns 1.0 for @var{x2} equal to 0.0; +@item +returns 0.0 for positive real @var{x2}; +@item +signals an error otherwise. +@end itemize + +@end defun + + +@defun quo x1 x2 +@defunx rem x1 x2 +@defunx mod x1 x2 + +@var{x2} should be non-zero. + +@example + (quo @var{x1} @var{x2}) ==> @var{n_q} + (rem @var{x1} @var{x2}) ==> @var{x_r} + (mod @var{x1} @var{x2}) ==> @var{x_m} +@end example + +where @var{n_q} is @var{x1}/@var{x2} rounded towards zero, +0 < |@var{x_r}| < |@var{x2}|, 0 < |@var{x_m}| < |@var{x2}|, @var{x_r} +and @var{x_m} differ from @var{x1} by a multiple of @var{x2}, +@var{x_r} has the same sign as @var{x1}, and @var{x_m} has the same +sign as @var{x2}. + +From this we can conclude that for @var{x2} not equal to 0, + +@example + (= @var{x1} (+ (* @var{x2} (quo @var{x1} @var{x2})) + (rem @var{x1} @var{x2}))) + ==> #t +@end example + +provided all numbers involved in that computation are exact. + +@example + (quo 2/3 1/5) ==> 3 + (mod 2/3 1/5) ==> 1/15 + + (quo .666 1/5) ==> 3.0 + (mod .666 1/5) ==> 65.99999999999995e-3 +@end example +@end defun + + +@defun ln @var{z} + +These procedures are part of every implementation that supports +general real numbers. +@samp{Ln} computes the natural logarithm of @var{z} + +In general, the mathematical function ln is multiply defined. The +value of ln @var{z} is defined to be the one whose imaginary part lies +in the range from -pi (exclusive) to pi (inclusive). + +@end defun + + +@defun abs x + +For real argument @var{x}, @samp{Abs} returns the absolute value of +@var{x}' otherwise it signals an error. + +@format +@t{(abs -7) ==> 7 +} +@end format + +@end defun + +@defun make-rectangular x1 x2 +@defunx make-polar x3 x4 + +These procedures are part of every implementation that supports +general complex numbers. Suppose @var{x1}, @var{x2}, @var{x3}, and +@var{x4} are real numbers and @var{z} is a complex number such that + + +@center @var{z} = @var{x1} + @var{x2}@w{i} = @var{x3} . e^@w{i} @var{x4} + +Then + +@format +@t{(make-rectangular @var{x1} @var{x2}) ==> @var{z} +(make-polar @var{x3} @var{x4}) ==> @var{z} +} +@end format + +where -pi < x_angle <= pi with x_angle = @var{x4} + 2pi n +for some integer n. + +If an argument is not real, then these procedures signal an error. + +@end defun + + + +@node Prime Numbers, Random Numbers, Irrational Real Functions, Mathematical Packages @section Prime Numbers @code{(require 'factor)} @@ -5130,7 +5256,7 @@ Returns the integer coded by the @var{bool1} @dots{} arguments. @include factor.txi -@node Random Numbers, Fast Fourier Transform, Prime Numbers, Mathematical Packages +@node Random Numbers, Discrete Fourier Transform, Prime Numbers, Mathematical Packages @section Random Numbers @cindex RNG @@ -5164,13 +5290,13 @@ tests pass. @include randinex.txi -@node Fast Fourier Transform, Cyclic Checksum, Random Numbers, Mathematical Packages -@section Fast Fourier Transform +@node Discrete Fourier Transform, Cyclic Checksum, Random Numbers, Mathematical Packages +@section Discrete Fourier Transform -@include fft.txi +@include dft.txi -@node Cyclic Checksum, Graphing, Fast Fourier Transform, Mathematical Packages +@node Cyclic Checksum, Graphing, Discrete Fourier Transform, Mathematical Packages @section Cyclic Checksum @code{(require 'crc)} @@ -6852,7 +6978,7 @@ signaled. The value returned is unspecified. (every (lambda (c) (memv c '(#\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 - #\+ #\( #\ #\) #\-))) + #\+ #\( #\space #\) #\-))) (string->list d)))) string)) @end group @@ -10195,6 +10321,8 @@ pair. (Called @code{atom} in Common LISP.) @code{(require 'sort)} @ftindex sort +[by Richard A. O'Keefe, 1991] + Many Scheme systems provide some kind of sorting functions. They do not, however, always provide the @emph{same} sorting functions, and those that I have had the opportunity to test provided inefficient ones @@ -10275,6 +10403,18 @@ 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. +The code of @code{merge} and @code{merge!} 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?} test per +iteration.) + +I gave serious consideration to producing Common-LISP-compatible +functions. However, Common LISP's @code{sort} is our @code{sort!} +(well, in fact Common LISP's @code{stable-sort} is our @code{sort!}; +merge sort is @emph{fast} 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 @emph{order} of the arguments. + Each of the five functions has a required @emph{last} parameter which is a comparison function. A comparison function @code{f} is a function of 2 arguments which acts like @code{<}. For example, @@ -10290,86 +10430,75 @@ The standard functions @code{<}, @code{>}, @code{char?}, comparison functions. Think of @code{(less? x y)} as saying when @code{x} must @emph{not} precede @code{y}. +[Addendum by Aubrey Jaffer, 2006] + +These procedures are stable when called with predicates which return +@code{#f} when applied to identical arguments. These procedures have +asymptotic time and space needs no larger than @i{O(N*log(N))}, where +@i{N} is the sum of the lengths of the sequence arguments. + +All five functions take an optional @var{key} argument corresponding +to a CL-style @samp{&key} argument. A @var{less?} predicate with a +@var{key} argument behaves like: + +@lisp +(lambda (x y) (@var{less?} (@var{key} x) (@var{key} y))) +@end lisp + +@c The @var{key} argument should be called at most one time for each +@c element. + +The @samp{!} variants sort in place; @code{sort!} returns its +@var{sequence} argument. + @defun sorted? sequence less? -Returns @code{#t} when the sequence argument is in non-decreasing order -according to @var{less?} (that is, there is no adjacent pair @code{@dots{} x -y @dots{}} for which @code{(less? y x)}). +@defunx sorted? sequence less? key +Returns @code{#t} when the sequence argument is in non-decreasing +order according to @var{less?} (that is, there is no adjacent pair +@code{@dots{} x y @dots{}} for which @code{(less? y x)}). Returns @code{#f} 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. +pair. It is an error if the sequence is not a list or array +(including vectors and strings). @end defun @defun merge list1 list2 less? -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} is our @code{sort!} (well, -in fact Common LISP's @code{stable-sort} is our @code{sort!}, merge sort -is @emph{fast} 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 -@emph{order} of the arguments. -@end defun - -@deffn {Procedure} merge! list1 list2 less? -Merges two lists, re-using the pairs of @var{list1} and @var{list2} to -build the result. If the code is compiled, and @var{less?} 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} or the first pair of -@var{list2}, but you can't predict which. - -The code of @code{merge} and @code{merge!} 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?} test per -iteration.) - -@end deffn +@defunx merge list1 list2 less? key +Merges two sorted lists, returning a freshly allocated list as its +result. +@end defun -@defun sort sequence less? -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?)}. The original -sequence is not altered in any way. The new sequence shares its -@emph{elements} with the old one; no elements are copied. +@defun merge! list1 list2 less? +@defunx merge! list1 list2 less? key +Merges two sorted lists, re-using the pairs of @var{list1} and +@var{list2} to build the result. If @code{merge!} is compiled, then +no new pairs will be allocated. The first pair of the result will be +either the first pair of @var{list1} or the first pair of @var{list2}. @end defun -@deffn {Procedure} sort! sequence less? -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. +@defun sort sequence less? +@defunx sort sequence less? key +Accepts a list or array (including vectors and strings) for +@var{sequence}; and returns a completely new sequence which is sorted +according to @var{less?}. The returned sequence is the same type as +the argument @var{sequence}. Given valid arguments, it is always the +case that: -Some people have been confused about how to use @code{sort!}, thinking -that it doesn't return a value. It needs to be pointed out that -@lisp -(set! slist (sort! slist <)) -@end lisp -@noindent -is the proper usage, not @lisp -(sort! slist <) +(sorted? (sort @var{sequence} @var{less?}) @var{less?}) @result{} #t @end lisp -@end deffn +@end defun -Note that these functions do @emph{not} accept a CL-style @samp{:key} -argument. A simple device for obtaining the same expressiveness is to -define +@defun sort! sequence less? +@defunx sort! sequence less? key +Returns @var{sequence} which has been mutated to order its elements +according to @var{less?}. If the argument @var{sequence} is a list +and @code{sort!} is compiled, then no new pairs will be allocated. If +the argument @var{sequence} is an array (including vectors and +strings), then the sorted elements are returned in the array +@var{sequence}. +@end defun -@lisp -(define (keyed less? key) - (lambda (x y) (less? (key x) (key y)))) -@end lisp -@noindent -and then, when you would have written -@lisp -(sort a-sequence #'my-less :key #'my-key) -@end lisp -@noindent -in Common LISP, just write -@lisp -(sort! a-sequence (keyed my-less? my-key)) -@end lisp -@noindent -in Scheme. @node Topological Sort, Hashing, Sorting, Sorting and Searching @subsection Topological Sort @@ -11379,13 +11508,23 @@ unspecified. @end menu @itemize @bullet +@ftindex srfi-2 @item SRFI-2 @ref{Guarded LET* special form} +@ftindex srfi-8 @item SRFI-8 @ref{Binding to multiple values} +@ftindex srfi-9 @item SRFI-9 @ref{Define-Record-Type} +@ftindex srfi-23 +@item SRFI-23 @code{(define error slib:error)} +@ftindex srfi-47 @item SRFI-47 @ref{Arrays} -@item SRFI-59 @ref{Vicinity} +@ftindex srfi-63 @item SRFI-63 @ref{Arrays} +@ftindex srfi-59 +@item SRFI-59 @ref{Vicinity} +@ftindex srfi-60 @item SRFI-60 @ref{Bit-Twiddling} +@ftindex srfi-61 @item SRFI-61 @ref{Guarded COND Clause} @end itemize @@ -11882,7 +12021,6 @@ http://www.sci.toyama-u.ac.jp/~iwao/Scheme/Jfilter/index.html @node About SLIB, Index, Other Packages, Top @chapter About SLIB -@ifnottex @noindent More people than I can name have contributed to SLIB. Thanks to all of you! @@ -11890,10 +12028,13 @@ you! @quotation SLIB @value{SLIBVERSION}, released @value{SLIBDATE}.@* Aubrey Jaffer @* -@i{Hyperactive Software} -- The Maniac Inside!@* -@url{http://swiss.csail.mit.edu/~jaffer/SLIB.html} +@c @i{Hyperactive Software} -- The Maniac Inside!@* @end quotation -@end ifnottex + +Current information about SLIB can be found on SLIB's @dfn{WWW} home +page: + +@center @url{http://swiss.csail.mit.edu/~jaffer/SLIB} @menu * Installation:: How to install SLIB on your system. @@ -12322,6 +12463,11 @@ nothing to undermine it in the future. @node About this manual, , Copyrights, About SLIB @section About this manual +@menu +* Copying This Manual:: +* How to use this License for your documents:: +@end menu + @itemize @bullet @item Entries that are labeled as Functions are called for their return @@ -12339,6 +12485,8 @@ At the beginning of each section, there is a line that looks like using the package. @end itemize +@include fdl.texi + @ifinfo @node Index, , About SLIB, Top @unnumbered Index -- cgit v1.2.3