diff options
author | Bryan Newbold <bnewbold@robocracy.org> | 2017-02-20 00:05:38 -0800 |
---|---|---|
committer | Bryan Newbold <bnewbold@robocracy.org> | 2017-02-20 00:05:38 -0800 |
commit | 64f037d91e0c9296dcaef9a0ff3eb33b19a2ed34 (patch) | |
tree | 1b23b8e8005328194e2fb4bf653806c85050933f /slib.texi | |
parent | 5bea21e81ed516440e34e480f2c33ca41aa8c597 (diff) | |
download | slib-64f037d91e0c9296dcaef9a0ff3eb33b19a2ed34.tar.gz slib-64f037d91e0c9296dcaef9a0ff3eb33b19a2ed34.zip |
Import Upstream version 3a5upstream/3a5
Diffstat (limited to 'slib.texi')
-rw-r--r-- | slib.texi | 405 |
1 files changed, 149 insertions, 256 deletions
@@ -18,21 +18,16 @@ 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. +Copyright @copyright{} 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007 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.'' +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A +copy of the license is included in the section entitled ``GNU Free +Documentation License.'' @end quotation @end copying @@ -148,8 +143,8 @@ returns @code{#t} if the symbol @var{feature} is the @code{software-type}, the @code{scheme-implementation-type} @footnote{scheme-implementation-type is the name symbol of the running Scheme implementation (RScheme, |STk|, Bigloo, chez, Elk, gambit, -guile, JScheme, MacScheme, MITScheme, Pocket-Scheme, Scheme48, -Scheme->C, Scheme48, Scsh, T, umb-scheme, or Vscm). Dependence on +guile, JScheme, kawa, MacScheme, MITScheme, Pocket-Scheme, Scheme48, +Scheme->C, Scheme48, Scsh, SISC, T, umb-scheme, or Vscm). Dependence on scheme-implementation-type is almost always the wrong way to do things.}, or if @var{feature} has been provided by a module already loaded; and @code{#f} otherwise. @@ -280,8 +275,8 @@ The catalog can also be queried using @code{slib:in-catalog?}. Returns a @code{CDR} of the catalog entry if one was found for the symbol @var{feature} in the alist @code{*catalog*} (and transitively through any symbol aliases encountered). Otherwise, returns -@code{#f}. The format of catalog entries is explained in @ref{Library -Catalogs}. +@code{#f}. The format of catalog entries is explained in +@ref{Library Catalogs}. @end defun @@ -636,14 +631,12 @@ constructs may be to treat @code{provided?} as a macro. @include top-refs.txi - @node Module Analysis, , Top-level Variable References, Compiling Scheme @subsection Module Analysis @include vet.txi - @node Universal SLIB Procedures, Scheme Syntax Extension Packages, The Library System, Top @chapter Universal SLIB Procedures @@ -660,7 +653,6 @@ implementations as part of the @samp{*.init} files or by * Miscellany:: @end menu - @node Vicinity, Configuration, Universal SLIB Procedures, Universal SLIB Procedures @section Vicinity @@ -767,7 +759,6 @@ variable is used for messages and @code{program-vicinity}. @end defun - @node Configuration, Input/Output, Vicinity, Universal SLIB Procedures @section Configuration @@ -854,6 +845,7 @@ implementation *catalog* : @end example @end defun + @node Input/Output, System, Configuration, Universal SLIB Procedures @section Input/Output @@ -940,6 +932,20 @@ omitted, in which case it defaults to the value returned by @code{(current-output-port)}. @end deffn +@defun file-position port +@defunx file-position port #f +@var{port} must be open to a file. @code{file-position} returns the +current position of the character in @var{port} which will next be +read or written. If the implementation does not support +file-position, then @code{#f} is returned. + +@defunx file-position port k +@var{port} must be open to a file. @code{file-position} sets the +current position in @var{port} which will next be read or written. If +successful, @code{#f} is returned; otherwise @code{file-position} +returns @code{#f}. +@end defun + @defun output-port-width @defunx output-port-width port @@ -1015,26 +1021,27 @@ loop. @deffn {Procedure} slib:exit n @deffnx {Procedure} slib:exit Exits from the Scheme session returning status @var{n} to the system. -If @var{n} is omitted or @code{#t}, a success status is returned to the -system (if possible). If @var{n} is @code{#f} a failure is returned to -the system (if possible). If @var{n} is an integer, then @var{n} is -returned to the system (if possible). If the Scheme session cannot exit -an unspecified value is returned from @code{slib:exit}. +If @var{n} is omitted or @code{#t}, a success status is returned to +the system (if possible). If @var{n} is @code{#f} a failure is +returned to the system (if possible). If @var{n} is an integer, then +@var{n} is returned to the system (if possible). If the Scheme +session cannot exit, then an unspecified value is returned from +@code{slib:exit}. @end deffn @defun browse-url url Web browsers have become so ubiquitous that programming languagues should support a uniform interface to them. -If a @samp{netscape} browser is running, @code{browse-url} causes the -browser to display the page specified by string @var{url} and returns -#t. +If a browser is running, @code{browse-url} causes the browser to +display the page specified by string @var{url} and returns @code{#t}. If the browser is not running, @code{browse-url} starts a browser displaying the argument @var{url}. If the browser starts as a -background job, @code{browse-url} returns #t immediately; if the -browser starts as a foreground job, then @code{browse-url} returns #t -when the browser exits; otherwise it returns #f. +background job, @code{browse-url} returns @code{#t} immediately; if +the browser starts as a foreground job, then @code{browse-url} returns +@code{#t} when the browser exits; otherwise (if no browser) it returns +@code{#f}. @end defun @@ -1057,18 +1064,6 @@ Example: @end lisp @end defun -@defun expt n k -Returns @var{n} raised to the non-negative integer exponent @var{k}. - -Example: -@lisp -(expt 2 5) - @result{} 32 -(expt -3 3) - @result{} -27 -@end lisp -@end defun - @subsection Mutual Exclusion @@ -1159,7 +1154,6 @@ Syntax extensions (macros) included with SLIB. * Yasos:: 'yasos, 'oop, 'collect @end menu - @node Defmacro, R4RS Macros, Scheme Syntax Extension Packages, Scheme Syntax Extension Packages @section Defmacro @@ -1222,6 +1216,7 @@ Returns the result of expanding all defmacros in scheme expression @var{e}. @end defun + @node R4RS Macros, Macro by Example, Defmacro, Scheme Syntax Extension Packages @section R4RS Macros @@ -1253,6 +1248,7 @@ code expressions and definitions may contain macro definitions. The @code{current-input-port} and @code{current-output-port}. @end deffn + @node Macro by Example, Macros That Work, R4RS Macros, Scheme Syntax Extension Packages @section Macro by Example @@ -1281,9 +1277,10 @@ natively supported (most implementations) @end itemize @subsection Caveat -These macros are not referentially transparent (@pxref{Macros, , ,r4rs, -Revised(4) Scheme}). Lexically scoped macros (i.e., @code{let-syntax} -and @code{letrec-syntax}) are not supported. In any case, the problem +These macros are not referentially transparent +(@pxref{Macros, , ,r4rs, Revised(4) Scheme}). Lexically scoped macros +(i.e., @code{let-syntax} and @code{letrec-syntax}) are not supported. +In any case, the problem of referential transparency gains poignancy only when @code{let-syntax} and @code{letrec-syntax} are used. So you will not be courting large-scale disaster unless you're using system-function names as local @@ -1334,6 +1331,7 @@ involved in the matching and is not considered a pattern variable or literal identifier. @end defmac + @node Macros That Work, Syntactic Closures, Macro by Example, Scheme Syntax Extension Packages @section Macros That Work @@ -1525,9 +1523,6 @@ or inserted identifiers, then the big chunk will be copied unnecessarily. That shouldn't matter very often. - - - @node Syntactic Closures, Syntax-Case Macros, Macros That Work, Scheme Syntax Extension Packages @section Syntactic Closures @@ -1979,9 +1974,6 @@ of this proposal is derived from an earlier proposal by Alan Bawden. - - - @node Syntax-Case Macros, Define-Structure, Syntactic Closures, Scheme Syntax Extension Packages @section Syntax-Case Macros @@ -2103,7 +2095,6 @@ Send bug reports, comments, suggestions, and questions to Kent Dybvig (dyb @@ iuvax.cs.indiana.edu). - @node Define-Structure, Define-Record-Type, Syntax-Case Macros, Scheme Syntax Extension Packages @section Define-Structure @@ -2167,6 +2158,7 @@ red @end deffn + @node Define-Record-Type, Fluid-Let, Define-Structure, Scheme Syntax Extension Packages @section Define-Record-Type @@ -2230,6 +2222,15 @@ by the rules of lexical scoping) of its corresponding @url{http://srfi.schemers.org/srfi-8/srfi-8.html} @end defspec +@code{(require 'let-values)} or @code{(require 'srfi-11)} +@ftindex srfi-11 +@ftindex let-values + +@defspec let-values ((formals expression) ...) body @dots{} +@defspecx let-values* ((formals expression) ...) body @dots{} + +@url{http://srfi.schemers.org/srfi-11/srfi-11.html} +@end defspec @node Guarded LET* special form, Guarded COND Clause, Binding to multiple values, Scheme Syntax Extension Packages @@ -2317,7 +2318,6 @@ returns a list of all the characters it produces until the end. @end example - @node Yasos, , Guarded COND Clause, Scheme Syntax Extension Packages @section Yasos @@ -2385,9 +2385,6 @@ reasonable). See the L&FP paper for some suggestions. @end table - - - @node Yasos interface, Setters, Yasos terms, Yasos @subsection Interface @@ -2440,9 +2437,6 @@ and by default id an error otherwise. Objects such as collections @end defun - - - @node Setters, Yasos examples, Yasos interface, Yasos @subsection Setters @@ -2508,9 +2502,6 @@ value is unspecified. @end deffn - - - @node Yasos examples, , Setters, Yasos @subsection Examples @@ -2611,7 +2602,6 @@ value is unspecified. @end lisp - @node Textual Conversion Packages, Mathematical Packages, Scheme Syntax Extension Packages, Top @chapter Textual Conversion Packages @@ -2625,13 +2615,13 @@ value is unspecified. * HTTP and CGI:: Serve WWW sites * Parsing HTML:: 'html-for-each * URI:: Uniform Resource Identifier +* Parsing XML:: 'parse-xml or 'ssax * Printing Scheme:: Nicely * Time and Date:: * NCBI-DNA:: DNA and protein sequences * Schmooz:: Documentation markup for Scheme programs @end menu - @node Precedence Parsing, Format, Textual Conversion Packages, Textual Conversion Packages @section Precedence Parsing @@ -2718,8 +2708,8 @@ The JACAL symbolic math system @noindent Here are the higher-level syntax types and an example of each. -Precedence considerations are omitted for clarity. See @ref{Grammar -Rule Definition} for full details. +Precedence considerations are omitted for clarity. +See @ref{Grammar Rule Definition} for full details. @deftp Grammar nofix bye exit @example bye @@ -2857,6 +2847,7 @@ from a closed port. @findex current-input-port @end defun + @node Token definition, Nud and Led Definition, Ruleset Definition and Use, Precedence Parsing @subsection Token definition @@ -3209,7 +3200,7 @@ The ruleset in effect before @var{tk} was parsed is restored; @ifset html <A NAME="format"></A> @end ifset -@code{(require 'format)} +@code{(require 'format)} or @code{(require 'srfi-28)} @ftindex format @c The @file{format.scm} package was removed because it was not @@ -3219,7 +3210,6 @@ The ruleset in effect before @var{tk} was parsed is restored; @include format.texi - @node Standard Formatted I/O, Programs and Arguments, Format, Textual Conversion Packages @section Standard Formatted I/O @@ -3326,8 +3316,8 @@ if by increasing the precision. For @samp{%x} or @samp{%X}, prefix a leading @samp{0x} or @samp{0X} (respectively) to the result. This doesn't do anything useful for the @samp{%d}, @samp{%i}, or @samp{%u} conversions. Using this flag produces output which can be parsed by the -@code{scanf} functions with the @samp{%i} conversion (@pxref{Standard -Formatted Input}). +@code{scanf} functions with the @samp{%i} conversion +(@pxref{Standard Formatted Input}). @item @samp{0} @@ -3841,6 +3831,7 @@ errors. @end example @end defun + @node Command Line, Parameter lists, Getopt, Programs and Arguments @subsection Command Line @@ -4004,7 +3995,7 @@ system @end table @noindent -@file{batch.scm} uses 2 enhanced relational tables +The @samp{batch} module uses 2 enhanced relational tables (@pxref{Using Databases}) to store information linking the names of @code{operating-system}s to @code{batch-dialect}es. @@ -4252,14 +4243,19 @@ hello world @include html4each.txi -@node URI, Printing Scheme, Parsing HTML, Textual Conversion Packages +@node URI, Parsing XML, Parsing HTML, Textual Conversion Packages @section URI @include uri.txi +@node Parsing XML, Printing Scheme, URI, Textual Conversion Packages +@section Parsing XML -@node Printing Scheme, Time and Date, URI, Textual Conversion Packages +@include xml-parse.txi + + +@node Printing Scheme, Time and Date, Parsing XML, Textual Conversion Packages @section Printing Scheme @menu @@ -4268,7 +4264,6 @@ hello world * Pretty-Print:: 'pretty-print, 'pprint-file @end menu - @node Generic-Write, Object-To-String, Printing Scheme, Printing Scheme @subsection Generic-Write @@ -4317,7 +4312,6 @@ where @end deffn - @node Object-To-String, Pretty-Print, Generic-Write, Printing Scheme @subsection Object-To-String @@ -4440,6 +4434,7 @@ thus can reduce loading time. The following will write into (pprint-filter-file "code.scm" defmacro:expand* "exp-code.scm") @end lisp + @node Time and Date, NCBI-DNA, Printing Scheme, Textual Conversion Packages @section Time and Date @@ -4589,8 +4584,8 @@ Sets (and returns) the default time-zone to that specified by @code{tzset} also sets the variables @var{*timezone*}, @var{daylight?}, and @var{tzname}. This function is automatically called by the time -conversion procedures which depend on the time zone (@pxref{Time and -Date}). +conversion procedures which depend on the time zone +(@pxref{Time and Date}). @end defun @defvar *timezone* @@ -4750,6 +4745,7 @@ Notice that the values returned by @code{decode-universal-time} do not match the arguments to @code{encode-universal-time}. @end defun + @node Time Infrastructure, , Common-Lisp Time, Time and Date @subsection Time Infrastructure @@ -4778,7 +4774,6 @@ match the arguments to @code{encode-universal-time}. @include schmooz.texi - @node Mathematical Packages, Database Packages, Textual Conversion Packages, Top @chapter Mathematical Packages @@ -4801,7 +4796,6 @@ match the arguments to @code{encode-universal-time}. * Matrix Algebra:: 'determinant @end menu - @node Bit-Twiddling, Modular Arithmetic, Mathematical Packages, Mathematical Packages @section Bit-Twiddling @@ -4890,7 +4884,6 @@ of @var{mask} is 0. @subsection Integer Properties @defun logcount n -@defunx bit-count n Returns the number of bits in integer @var{n}. 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, @@ -4907,6 +4900,22 @@ Example: @end lisp @end defun +@noindent +On @code{discuss@@r6rs.org} Ben Harris credits Simon Tatham with the +idea to have @code{bitwise-bit-count} return a negative count for +negative inputs. Alan Bawden came up with the succinct invariant. + +@defun bitwise-bit-count n +If @var{n} is non-negative, this procedure returns the number of 1 +bits in the two's-complement representation of @var{n}. Otherwise it +returns the result of the following computation: + +@lisp +(bitwise-not (bitwise-bit-count (bitwise-not @var{n}))) +@end lisp +@end defun + + @defun integer-length n Returns the number of bits neccessary to represent @var{n}. @@ -5083,8 +5092,6 @@ Returns the integer coded by the @var{bool1} @dots{} arguments. @end defun - - @node Modular Arithmetic, Irrational Integer Functions, Bit-Twiddling, Mathematical Packages @section Modular Arithmetic @@ -5245,7 +5252,6 @@ 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 @@ -5537,6 +5543,7 @@ in http://www.usb.org/developers/data/crcdes.pdf. @end defun + @node Graphing, Solid Modeling, Cyclic Checksum, Mathematical Packages @section Graphing @@ -5897,7 +5904,6 @@ temperatures around 5000.K. @include color.txi - @node Spectra, Color Difference Metrics, Color Spaces, Color @subsection Spectra @@ -6241,7 +6247,6 @@ perceptibility; the default, 2 and 1, for acceptability. @end defun - @node Color Conversions, Color Names, Color Difference Metrics, Color @subsection Color Conversions @@ -6332,7 +6337,6 @@ The integers @var{n1} and @var{n2} must be 10, 12, or 16. @end defun - @node Color Names, Daylight, Color Conversions, Color @subsection Color Names @@ -6431,18 +6435,12 @@ Resene Paints Ltd. @include daylight.txi - @node Root Finding, Minimizing, Color, Mathematical Packages @section Root Finding @code{(require 'root)} @ftindex root -@defun integer-sqrt y -Given a non-negative integer @var{y}, returns the largest integer -whose square is less than or equal to @var{y}. -@end defun - @defun newton:find-integer-root f df/dx x0 Given integer valued procedure @var{f}, its derivative (with respect to its argument) @var{df/dx}, and initial integer value @var{x0} for which @@ -6542,6 +6540,7 @@ iterations performed so far. @var{prec} should return non-false if the iteration should be stopped. @end defun + @node Minimizing, The Limit, Root Finding, Mathematical Packages @section Minimizing @@ -6551,6 +6550,7 @@ if the iteration should be stopped. @include minimize.txi + @node The Limit, Commutative Rings, Minimizing, Mathematical Packages @section The Limit @@ -6910,7 +6910,6 @@ Why relational database? For motivations and design issues see@* @include dbutil.txi - @node Table Operations, Database Interpolation, Using Databases, Relational Database @subsection Table Operations @@ -7246,6 +7245,7 @@ table. Subsequent operations to this table will signal an error. @end defop + @node Database Interpolation, Embedded Commands, Table Operations, Relational Database @subsection Database Interpolation @@ -7271,7 +7271,6 @@ associated with the smallest stored key is used. @end defun - @node Embedded Commands, Database Macros, Database Interpolation, Relational Database @subsection Embedded Commands @@ -7396,8 +7395,8 @@ Adds @var{domain-row} to the @dfn{domains} table if there is no row in the domains table associated with key @code{(car @var{domain-row})} and returns @code{#t}. Otherwise returns @code{#f}. -For the fields and layout of the domain table, @xref{Catalog -Representation}. Currently, these fields are +For the fields and layout of the domain table, +@xref{Catalog Representation}. Currently, these fields are @itemize @bullet @item domain-name @@ -7713,7 +7712,6 @@ ERROR: getopt->parameter-list "unrecognized option" "-?" @end example - @node Database Macros, Database Browser, Embedded Commands, Relational Database @subsection Database Macros @@ -7892,7 +7890,6 @@ without-documentation called @end example - @node Database Browser, , Database Macros, Relational Database @subsection Database Browser @@ -7942,7 +7939,6 @@ the symbol @var{table-name}. * Database Operations:: @end menu - @node Base Table, Catalog Representation, Relational Infrastructure, Relational Infrastructure @subsection Base Table @@ -8320,6 +8316,7 @@ which differs in column @var{index} or a lower indexed key; or false if no higher record is present. @end defop + @node Catalog Representation, Relational Database Objects, Base Table, Relational Infrastructure @subsection Catalog Representation @@ -8760,7 +8757,6 @@ associations as @var{alist}. This procedure is equivalent to: @end deffn - @node Basic Operations on Weight-Balanced Trees, Advanced Operations on Weight-Balanced Trees, Construction of Weight-Balanced Trees, Weight-Balanced Trees @subsection Basic Operations on Weight-Balanced Trees @@ -9090,8 +9086,6 @@ operation is equivalent to @node Data Structures, Sorting and Searching, Other Packages, Other Packages @section Data Structures - - @menu * Arrays:: 'array * Subarrays:: 'subarray @@ -9111,9 +9105,6 @@ operation is equivalent to * Records:: 'record @end menu - - - @node Arrays, Subarrays, Data Structures, Data Structures @subsection Arrays @@ -9264,12 +9255,7 @@ collection; they are potentially more efficient. @defun reduce proc seed collection1 @dots{} A generalization of the list-based @code{reduce-init} -(@pxref{Lists as sequences}) to collections which will shadow the -list-based version if @code{(require 'collect)} follows -@ftindex collect -@code{(require 'common-list-functions)} (@pxref{Common List -Functions}). -@ftindex common-list-functions +(@pxref{Lists as sequences}) to collections. Examples: @lisp @@ -9278,11 +9264,15 @@ Examples: (reduce union '() '((a b c) (b c d) (d a))) @result{} (c b d a). @end lisp + +@code{Reduce} called with two arguments will work as does the +procedure of the same name from @xref{Common List Functions}). +@ftindex common-list-functions @end defun @defun any? pred collection1 @dots{} -A generalization of the list-based @code{some} (@pxref{Lists as -sequences}) to collections. +A generalization of the list-based @code{some} +(@pxref{Lists as sequences}) to collections. Example: @lisp @@ -9383,9 +9373,6 @@ Here is a sample collection: @code{simple-table} which is also a @end lisp - - - @node Dynamic Data Type, Hash Tables, Collections, Data Structures @subsection Dynamic Data Type @@ -9424,15 +9411,12 @@ re-established by those continuations when they are invoked. The @code{dynamic-bind} macro is not implemented. - - @node Hash Tables, Object, Dynamic Data Type, Data Structures @subsection Hash Tables @include hashtab.txi - @node Object, Priority Queues, Hash Tables, Data Structures @subsection Macroless Object System @@ -9451,7 +9435,6 @@ The @code{dynamic-bind} macro is not implemented. @include queue.txi - @node Records, , Queues, Data Structures @subsection Records @@ -9583,7 +9566,6 @@ created the type represented by @var{rtd}. @end ignore - @node Sorting and Searching, Procedures, Data Structures, Other Packages @section Sorting and Searching @@ -9600,8 +9582,6 @@ created the type represented by @var{rtd}. * Sequence Comparison:: 'diff and longest-common-subsequence @end menu - - @node Common List Functions, Tree Operations, Sorting and Searching, Sorting and Searching @subsection Common List Functions @@ -9619,7 +9599,6 @@ optional arguments in some cases. * Non-List functions:: @end menu - @node List construction, Lists as sets, Common List Functions, Common List Functions @subsubsection List construction @@ -9683,10 +9662,6 @@ Example: @end defun - - - - @node Lists as sets, Lists as sequences, List construction, Common List Functions @subsubsection Lists as sets @@ -10152,7 +10127,6 @@ given identical arguments. @end example - @node Destructive list operations, Non-List functions, Lists as sequences, Common List Functions @subsubsection Destructive list operations @@ -10256,7 +10230,6 @@ The examples should suffice to show why this is the case. @end deffn - @node Non-List functions, , Destructive list operations, Common List Functions @subsubsection Non-List functions @@ -10318,90 +10291,14 @@ pair. (Called @code{atom} in Common LISP.) @node Sorting, Topological Sort, Chapter Ordering, Sorting and Searching @subsection Sorting -@code{(require 'sort)} +@code{(require 'sort)} or @code{(require 'srfi-95)} @ftindex sort +@ftindex srfi-95 [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 -(a common blunder is to use quicksort which does not perform well). - -Because @code{sort} and @code{sort!} are not in the standard, there is -very little agreement about what these functions look like. For -example, Dybvig says that Chez Scheme provides -@lisp -(merge predicate list1 list2) -(merge! predicate list1 list2) -(sort predicate list) -(sort! predicate list) -@end lisp -@noindent -while MIT Scheme 7.1, following Common LISP, offers unstable -@lisp -(sort list predicate) -@end lisp -@noindent -TI PC Scheme offers -@lisp -(sort! list/vector predicate?) -@end lisp -@noindent -and Elk offers -@lisp -(sort list/vector predicate?) -(sort! list/vector predicate?) -@end lisp - -Here is a comprehensive catalogue of the variations I have found. - -@enumerate -@item -Both @code{sort} and @code{sort!} may be provided. -@item -@code{sort} may be provided without @code{sort!}. -@item -@code{sort!} may be provided without @code{sort}. -@item -Neither may be provided. -@item -The sequence argument may be either a list or a vector. -@item -The sequence argument may only be a list. -@item -The sequence argument may only be a vector. -@item -The comparison function may be expected to behave like @code{<}. -@item -The comparison function may be expected to behave like @code{<=}. -@item -The interface may be @code{(sort predicate? sequence)}. -@item -The interface may be @code{(sort sequence predicate?)}. -@item -The interface may be @code{(sort sequence &optional (predicate? <))}. -@item -The sort may be stable. -@item -The sort may be unstable. -@end enumerate - -All of this variation really does not help anybody. A nice simple merge -sort is both stable and fast (quite a lot faster than @emph{quick} sort). - 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. - -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. +(but please retain D.H.D.Warren's credit for the original idea). 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 @@ -10415,15 +10312,6 @@ 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, - -@lisp -(not (f x x)) -(and (f x y) (f y z)) @equiv{} (f x z) -@end lisp - The standard functions @code{<}, @code{>}, @code{char<?}, @code{char>?}, @code{char-ci<?}, @code{char-ci>?}, @code{string<?}, @code{string>?}, @code{string-ci<?}, and @code{string-ci>?} are suitable for use as @@ -10433,9 +10321,14 @@ comparison functions. Think of @code{(less? x y)} as saying when [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. +@code{#f} when applied to identical arguments. + +The @code{sorted?}, @code{merge}, and @code{merge!} procedures consume +asymptotic time and space no larger than @i{O(N)}, where @i{N} is the +sum of the lengths of the sequence arguments. +The @code{sort} and @code{sort!} procedures consume asymptotic time +and space no larger than @i{O(N*log(N))}, where @i{N} is the length of +the sequence argument. All five functions take an optional @var{key} argument corresponding to a CL-style @samp{&key} argument. A @var{less?} predicate with a @@ -10445,8 +10338,8 @@ to a CL-style @samp{&key} argument. A @var{less?} predicate with a (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. +All five functions will call the @var{key} argument at most once per +element. The @samp{!} variants sort in place; @code{sort!} returns its @var{sequence} argument. @@ -10471,9 +10364,8 @@ result. @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}. +@var{list2} to build the result. The result will be either +@var{list1} or @var{list2}. @end defun @defun sort sequence less? @@ -10491,12 +10383,13 @@ case that: @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}. +Returns list, array, vector, or string @var{sequence} which has been +mutated to order its elements according to @var{less?}. Given valid +arguments, it is always the case that: + +@lisp +(sorted? (sort! @var{sequence} @var{less?}) @var{less?}) @result{} #t +@end lisp @end defun @@ -10769,7 +10662,6 @@ up here. * Metric Units:: Portable manifest types for numeric values. @end menu - @node Type Coercion, String-Case, Procedures, Procedures @subsection Type Coercion @code{(require 'coerce)} @@ -10832,7 +10724,6 @@ lower-case character. @end defun - @node String Ports, Line I/O, String-Case, Procedures @subsection String Ports @@ -11179,6 +11070,7 @@ namely @code{values}, @code{macro}, and @code{eval}. Description found in R4RS. @end defun + @node Transcripts, Rev2 Procedures, With-File, Standards Support @subsection Transcripts @@ -11192,9 +11084,6 @@ Redefines @code{read-char}, @code{read}, @code{write-char}, @end defun - - - @node Rev2 Procedures, Rev4 Optional Procedures, Transcripts, Standards Support @subsection Rev2 Procedures @@ -11257,7 +11146,6 @@ trailing @samp{?}. @end defun - @node Rev4 Optional Procedures, Multi-argument / and -, Rev2 Procedures, Standards Support @subsection Rev4 Optional Procedures @@ -11280,17 +11168,14 @@ For the specification of these optional procedures, @end deffn - - - @node Multi-argument / and -, Multi-argument Apply, Rev4 Optional Procedures, Standards Support @subsection Multi-argument / and - @code{(require 'multiarg/and-)} @ftindex multiarg -For the specification of these optional forms, @xref{Numerical -operations, , ,r4rs, Revised(4) Scheme}. +For the specification of these optional forms, +@xref{Numerical operations, , ,r4rs, Revised(4) Scheme}. @defun / dividend divisor1 @dots{} @end defun @@ -11299,9 +11184,6 @@ operations, , ,r4rs, Revised(4) Scheme}. @end defun - - - @node Multi-argument Apply, Rationalize, Multi-argument / and -, Standards Support @subsection Multi-argument Apply @@ -11316,14 +11198,12 @@ For the specification of this optional form, @end defun - @node Rationalize, Promises, Multi-argument Apply, Standards Support @subsection Rationalize @include ratize.txi - @node Promises, Dynamic-Wind, Rationalize, Standards Support @subsection Promises @@ -11498,6 +11378,7 @@ not created by the @code{call-with-values} procedure is unspecified. @end defun + @node SRFI, , Values, Standards Support @subsection SRFI @@ -11514,27 +11395,35 @@ unspecified. @item SRFI-8 @ref{Binding to multiple values} @ftindex srfi-9 @item SRFI-9 @ref{Define-Record-Type} +@ftindex srfi-11 +@item SRFI-11 @ref{Binding to multiple values} @ftindex srfi-23 @item SRFI-23 @code{(define error slib:error)} +@ftindex srfi-28 +@item SRFI-28 @ref{Format} @ftindex srfi-47 @item SRFI-47 @ref{Arrays} -@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} +@ftindex srfi-63 +@item SRFI-63 @ref{Arrays} +@ftindex srfi-94 +@item SRFI-94 @ref{Irrational Integer Functions} and @ref{Irrational Real Functions} +@ftindex srfi-95 +@item SRFI-95 @ref{Sorting} @end itemize + @node SRFI-1, , SRFI, SRFI @subsubsection SRFI-1 @include srfi-1.txi - @node Session Support, System Interface, Standards Support, Other Packages @section Session Support @@ -11554,7 +11443,6 @@ is used by the @code{break} and @code{debug} packages. * Trace:: 'trace @end menu - @node Repl, Quick Print, Session Support, Session Support @subsection Repl @@ -11595,6 +11483,7 @@ catching lines and the following lines to your Scheme init file: (repl:top-level macro:eval) @end lisp + @node Quick Print, Debug, Repl, Session Support @subsection Quick Print @@ -11633,6 +11522,7 @@ procedures will be @code{write}n; procedures will be indicated by @samp{#[proc]}. @end defvar + @node Debug, Breakpoints, Quick Print, Session Support @subsection Debug @@ -11672,6 +11562,7 @@ Breakpoints (@pxref{Breakpoints}) all procedures @code{define}d at top-level in @file{file} @dots{}. @end deffn + @node Breakpoints, Trace, Debug, Session Support @subsection Breakpoints @@ -11752,6 +11643,7 @@ To unbreak, type @end lisp @end defun + @node Trace, , Breakpoints, Session Support @subsection Tracing @@ -12045,7 +11937,6 @@ page: * About this manual:: @end menu - @node Installation, The SLIB script, About SLIB, About SLIB @section Installation @@ -12075,7 +11966,7 @@ Build the SLIB catalog for the Scheme implementation. @subsection Unpacking the SLIB Distribution -If the SLIB distribution is a Linux RPM, it will create the SLIB +If the SLIB distribution is a GNU/Linux RPM, it will create the SLIB directory @file{/usr/share/slib}. If the SLIB distribution is a ZIP file, unzip the distribution to create @@ -12258,7 +12149,8 @@ e.g. mv dumpfile /usr/local/vscm/lib/scheme-boot SLIB comes with shell script for Unix platforms. @example -@exdent @b{ slib } [ scm | gsi | mzscheme | guile | slib48 | scheme48 | scmlit ] +@b{ slib } [ scheme | scm | gsi | mzscheme | guile + | scheme48 | scmlit | elk | sisc | kawa ] @end example @noindent @@ -12270,7 +12162,6 @@ implementation to run. Absent the argument, it searches for implementations in the above order. - @node Porting, Coding Guidelines, The SLIB script, About SLIB @section Porting @@ -12364,6 +12255,7 @@ Please @emph{do not} 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. + @node Copyrights, About this manual, Coding Guidelines, About SLIB @section Copyrights @@ -12460,6 +12352,7 @@ nothing to undermine it in the future. @end flushleft @end quotation + @node About this manual, , Copyrights, About SLIB @section About this manual |