3256 lines
		
	
	
		
			135 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			3256 lines
		
	
	
		
			135 KiB
		
	
	
	
		
			HTML
		
	
	
	
| <!doctype html public '-//W3C//DTD HTML 4.0//EN'
 | |
|   'http://www.w3.org/TR/REC-html40/strict.dtd'>
 | |
| 
 | |
| <!-- Is there a portable way to write an em-dash?
 | |
|      Can I have bangs, plusses, or slashes in #tags? Spaces?
 | |
| 	Yes: plus, bang, star   No: space  Yes: slash, question, ampersand
 | |
| 	You can't put sharp in a path, so anything goes, really.
 | |
| 	Nonetheless, some of these confuse Netscape, so I'll avoid them.
 | |
|  -->
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <html lang=en-US>
 | |
|   <head>
 | |
|     <meta name="keywords" content="Scheme, programming language, list processing, SRFI, underage lesbian sluts">
 | |
|     <link rev=made href="mailto:shivers@ai.mit.edu">
 | |
|     <title>SRFI 1: List Library</title>
 | |
| 
 | |
|     <!-- Should have a media=all to get, for example, printing to work.
 | |
|       == But my Netscape will completely ignore the tag if I do that.
 | |
|       -->
 | |
|     <style type="text/css">
 | |
| 	   /* A little general layout hackery for headers & the title. */
 | |
|            body { margin-left: +7%;
 | |
| 	          font-family: "Helvetica", sans-serif;
 | |
| 		  }
 | |
|            /* Netscape workaround: */
 | |
| 	   td, th { font-family: "Helvetica", sans-serif; }
 | |
| 
 | |
| 	   code, pre { font-family: "courier new", "courier"; }
 | |
| 
 | |
|            h1 { margin-left: -5%; }
 | |
| 	   h1, h2 { clear: both; }
 | |
| 	   h1, h2, h3, h4, h5, h6 { color: blue }
 | |
| 	   div.title-text { font-size: large; font-weight: bold; }
 | |
| 
 | |
| 	   div.indent { margin-left: 2em; }	  /* General indentation */
 | |
| 	   pre.code-example { margin-left: 2em; } /* Indent code examples. */
 | |
| 
 | |
| 	   /* This stuff is for definition lists of defined procedures.
 | |
|            ** A proc-def2 is used when you want a stack of procs to go
 | |
| 	   ** with one <dd> ... </dd> body. In this case, make the first
 | |
| 	   ** proc a proc-def1, following ones proc-defi's, and the last one
 | |
|            ** a proc-defn.
 | |
|            **
 | |
|            ** Unfortunately, Netscape has huge bugs with respect to style
 | |
|            ** sheets and dl list rendering. We have to set truly random
 | |
|            ** values here to get the rendering to come out. The proper values
 | |
|            ** are in the following style sheet, for Internet Explorer.
 | |
| 	   ** In the following settings, the *comments* say what the 
 | |
|            ** setting *really* causes Netscape to do.
 | |
| 	   **
 | |
|            ** Ugh. Professional coders sacrifice their self-respect,
 | |
|            ** that others may live.
 | |
|            */
 | |
| 	   /* m-t ignored; m-b sets top margin space. */
 | |
| 	   dt.proc-def1 { margin-top: 0ex; margin-bottom: 3ex; }
 | |
| 	   dt.proc-defi { margin-top: 0ex; margin-bottom: 0ex; }
 | |
| 	   dt.proc-defn { margin-top: 0ex; margin-bottom: 0ex; }
 | |
| 
 | |
| 	   /* m-t works weird depending on whether or not the last line
 | |
|            ** of the previous entry was a pre. Set to zero.
 | |
|            */
 | |
| 	   dt.proc-def  { margin-top: 0ex; margin-bottom: 3ex; }
 | |
| 
 | |
| 	   /* m-b sets space between dd & dt; m-t ignored. */
 | |
| 	   dd.proc-def { margin-bottom: 0.5ex; margin-top: 0ex; } 
 | |
| 
 | |
| 
 | |
| 	   /* Boldface the name of a procedure when it's being defined. */
 | |
| 	   code.proc-def { font-weight: bold; font-size: 110%}
 | |
| 
 | |
| 	   /* For the index of procedures. 
 | |
|            ** Same hackery as for dt.proc-def, above.
 | |
|            */
 | |
| 	   /* m-b sets space between dd & dt; m-t ignored. */
 | |
| 	   dd.proc-index  { margin-bottom: 0ex; margin-top: 0ex; } 
 | |
| 	   /* What the fuck? */
 | |
| 	   pre.proc-index { margin-top: -2ex; }
 | |
| 
 | |
| 	   /* Pull the table of contents back flush with the margin.
 | |
| 	   ** Both NS & IE screw this up in different ways.
 | |
| 	   */
 | |
| 	   #toc-table { margin-top: -2ex; margin-left: -5%; }
 | |
| 
 | |
| 	   /* R5RS proc names are in italic; extended R5RS names 
 | |
|            ** in italic boldface.
 | |
| 	   */
 | |
| 	   span.r5rs-proc { font-weight: bold; }
 | |
| 	   span.r5rs-procx { font-style: italic; font-weight: bold; }
 | |
| 
 | |
| 	   /* Spread out bibliographic lists. */
 | |
| 	   /* More Netscape-specific lossage; see the following stylesheet
 | |
| 	   ** for the proper values (used by IE).
 | |
|            */
 | |
| 	   dt.biblio { margin-bottom: 1ex; }
 | |
| 
 | |
| 	   /* Links to draft copies (e.g., not at the official SRFI site)
 | |
| 	   ** are colored in red, so people will use them during the 
 | |
| 	   ** development process and kill them when the document's done.
 | |
| 	   */
 | |
|            a.draft { color: red; }
 | |
|     </style>
 | |
| 
 | |
|     <style type="text/css"; media=all>
 | |
| 	   /* Nastiness: Here, I'm using a bug to work around a bug.
 | |
| 	   ** Netscape rendering bugs mean you need bogus <dt> and <dd>
 | |
| 	   ** margin settings -- settings which screw up IE's proper rendering.
 | |
| 	   ** Fortunately, Netscape has *another* bug: it will ignore this
 | |
| 	   ** media=all style sheet. So I am placing the (proper) IE values
 | |
| 	   ** here. Perhaps, one day, when these rendering bugs are fixed,
 | |
| 	   ** this gross hackery can be removed.
 | |
| 	   */
 | |
| 	   dt.proc-def1 { margin-top: 3ex; margin-bottom: 0ex; }
 | |
| 	   dt.proc-defi { margin-top: 0ex; margin-bottom: 0ex; }
 | |
| 	   dt.proc-defn { margin-top: 0ex; margin-bottom: 0.5ex; }
 | |
| 	   dt.proc-def  { margin-top: 3ex; margin-bottom: 0.5ex; }
 | |
| 
 | |
| 	   pre { margin-top: 1ex; }
 | |
| 
 | |
| 	   dd.proc-def { margin-bottom: 2ex; margin-top: 0.5ex; } 
 | |
| 
 | |
| 	   /* For the index of procedures. 
 | |
|            ** Same hackery as for dt.proc-def, above.
 | |
|            */
 | |
| 	   dd.proc-index { margin-top: 0ex; } 
 | |
| 	   pre.proc-index { margin-top: 0ex; }
 | |
| 
 | |
| 	   /* Spread out bibliographic lists. */
 | |
| 	   dt.biblio { margin-top: 3ex; margin-bottom: 0ex; }
 | |
| 	   dd.biblio { margin-bottom: 1ex; }
 | |
|     </style>
 | |
|   </head>
 | |
| 
 | |
| <body>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1>Title</h1>
 | |
| <div class=title-text>
 | |
| List Library
 | |
| </div>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1>Author</H1>
 | |
|     <address>
 | |
|        <a href="http://www.ai.mit.edu/~shivers/">Olin Shivers</A> /
 | |
|        <a href="mailto:shivers@ai.mit.edu">shivers@ai.mit.edu</A>
 | |
|     </address>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1>Table of contents</H1>
 | |
| 
 | |
| <!-- A bug in netscape (?) keeps the first link in this UL from being active.
 | |
| ==== So the Abstract link be dead. 99/8/22 -Olin
 | |
| -->
 | |
| <ul id=toc-table>
 | |
| <li><a href="#Abstract">Abstract</a>
 | |
| <li><a href="#Introduction">Introduction</a>
 | |
| <li><a href="#ProcedureIndex">Procedure index</a>
 | |
| <li><a href="#GeneralDiscussion">General discussion</a>
 | |
|   <ul>
 | |
|   <li><a href="#LinearUpdateProcedures">"Linear update" procedures</a>
 | |
|   <li><a href="#ImproperLists">Improper lists</a>
 | |
|   <li><a href="#Errors">Errors</a>
 | |
|   <li><a href="#NotIncludedInThisLibrary">Not included in this library</a>
 | |
|   </ul>
 | |
| <li><a href="#TheProcedures">The procedures</a>
 | |
|   <ul>
 | |
|   <li><a href="#Constructors">Constructors</a>
 | |
|   <li><a href="#Predicates">Predicates</a>
 | |
|   <li><a href="#Selectors">Selectors</a>
 | |
|   <li><a href="#Miscellaneous">Miscellaneous: length, append, reverse, zip & count</a>
 | |
|   <li><a href="#FoldUnfoldMap">Fold, unfold, and map</a>
 | |
|   <li><a href="#FilteringPartitioning">Filtering & partitioning</a>
 | |
|   <li><a href="#Searching">Searching</a>
 | |
|   <li><a href="#Deletion">Deletion</a>
 | |
|   <li><a href="#AssociationLists">Association lists</a>
 | |
|   <li><a href="#SetOperationsOnLists">Set operations on lists</a>
 | |
|   <li><a href="#PrimitiveSideEffects">Primitive side-effects</a>
 | |
|   </ul>
 | |
| <li><a href="#Acknowledgements">Acknowledgements</a>
 | |
| <li><a href="#ReferencesLinks">References & links</a>
 | |
| <li><a href="#Copyright">Copyright</a>
 | |
| </ul>
 | |
| 
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1><a name="Abstract">Abstract</a></H1>
 | |
| <p>
 | |
| <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> Scheme has an impoverished set of list-processing utilities, which is a
 | |
| problem for authors of portable code.  This <abbr title="Scheme Request for Implementation">SRFI</abbr> proposes a coherent and
 | |
| comprehensive set of list-processing procedures; it is accompanied by a
 | |
| reference implementation of the spec. The reference implementation is
 | |
| <ul>
 | |
| <li>portable
 | |
| <li>efficient
 | |
| <li>completely open, public-domain source
 | |
| </ul>
 | |
| 
 | |
| <strong><em>Note: This is a working draft, and tends to lag the plain-text version in terms of actual content.
 | |
| See <a href="ftp://ftp.ai.mit.edu/people/shivers/srfi/srfi-1/srfi-1.txt">
 | |
|     ftp://ftp.ai.mit.edu/people/shivers/srfi/srfi-1/srfi-1.txt</a>
 | |
| for the latest copy of the plain-text draft.
 | |
| </em></strong>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1><a name="Introduction">Introduction</a></h1>
 | |
| <p>
 | |
| The set of basic list and pair operations provided by R4RS/<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> Scheme is far
 | |
| from satisfactory. Because this set is so small and basic, most
 | |
| implementations provide additional utilities, such as a list-filtering
 | |
| function, or a "left fold" operator, and so forth. But, of course, this
 | |
| introduces incompatibilities -- different Scheme implementations provide
 | |
| different sets of procedures.
 | |
| 
 | |
| <p>
 | |
| I have designed a full-featured library of procedures for list processing.
 | |
| While putting this library together, I checked as many Schemes as I could get
 | |
| my hands on. (I have a fair amount of experience with several of these
 | |
| already.) I missed Chez -- no on-line manual that I can find -- but I hit most
 | |
| of the other big, full-featured Schemes. The complete list of list-processing
 | |
| systems I checked is:
 | |
| <div class=indent>
 | |
|     <abbr title="Revised^4 Report on Scheme">R4RS</abbr>/<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> Scheme, MIT Scheme, Gambit, RScheme, MzScheme, slib, 
 | |
|     <a href="#CommonLisp">Common Lisp</a>, Bigloo, guile, T, APL and the SML standard basis
 | |
| </div>
 | |
| <p>
 | |
| As a result, the library I am proposing is fairly rich.
 | |
| <p>
 | |
| Following this initial design phase, this library went through several
 | |
| months of discussion on the SRFI mailing lists, and was altered in light
 | |
| of the ideas and suggestions put forth during this discussion.
 | |
| <p>
 | |
| In parallel with designing this API, I have also written a reference
 | |
| implementation. I have placed this source on the Net with an unencumbered,
 | |
| "open" copyright. A few notes about the reference implementation:
 | |
| 
 | |
| <ul>
 | |
| <li>Although I got procedure names and specs from many Schemes, I wrote this
 | |
|     code myself. Thus, there are <em>no</em> entanglements. 
 | |
|     Any Scheme implementor
 | |
|     can pick this library up with no worries about copyright problems -- both
 | |
|     commercial and non-commercial systems.
 | |
| 
 | |
| <li>The code is written for portability and should be trivial to port to
 | |
|     any Scheme. It has only four deviations from <abbr title="Revised^4 Report on Scheme">R4RS</abbr>, clearly discussed
 | |
|     in the comments: <ul>
 | |
| 	<li>Use of an <code>error</code> procedure;
 | |
| 	<li>Use of the <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> <code>values</code> and a simple <code>receive</code> macro for producing
 | |
| 	  and consuming multiple return values;
 | |
| 	<li>Use of simple <code>:optional</code> and <code>let-optionals</code> macros for optional
 | |
| 	  argument parsing and defaulting;
 | |
| 	<li>Use of a simple <code>check-arg</code> procedure for argument checking.
 | |
|         </ul>
 | |
| 
 | |
| <li>It is written for clarity and well-commented. The current source is
 | |
|     768 lines of source code and 826 lines of comments and white space.
 | |
| 
 | |
| <li>It is written for efficiency. Fast paths are provided for common
 | |
|     cases. Side-effecting procedures such as <code>filter!</code> avoid unnecessary,
 | |
|     redundant <code>set-cdr!</code>s which would thrash a generational GC's write barrier
 | |
|     and the store buffers of fast processors. Functions reuse longest common
 | |
|     tails from input parameters to construct their results where
 | |
|     possible. Constant-space iterations are used in preference to recursions;
 | |
|     local recursions are used in preference to consing temporary intermediate
 | |
|     data structures.
 | |
| <p>
 | |
|     This is not to say that the implementation can't be tuned up for
 | |
|     a specific Scheme implementation. There are notes in comments addressing
 | |
|     ways implementors can tune the reference implementation for performance.
 | |
| </ul>
 | |
| <p>
 | |
| In short, I've written the reference implementation to make it as painless
 | |
| as possible for an implementor -- or a regular programmer -- to adopt this
 | |
| library and get good results with it.
 | |
| 
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1><a name="ProcedureIndex">Procedure Index</a></h1>
 | |
| <p>
 | |
| Here is a short list of the procedures provided by the list-lib package.
 | |
| <a href="#R5RS">R5RS</a></abbr> procedures are shown in 
 | |
| <span class=r5rs-proc>bold</span class=r5rs-proc>;
 | |
| extended <a href="#R5RS">R5RS</a></abbr> 
 | |
|          procedures, in <span class=r5rs-procx>bold italic</span>.
 | |
| <div class=indent>
 | |
| <dl>
 | |
| <dt class=proc-index> Constructors
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <span class=r5rs-proc><a href="#cons">cons</a> <a href="#list">list</a></span>
 | |
| <a href="#xcons">xcons</a> <a href="#cons*">cons*</a> <a href="#make-list">make-list</a> <a href="#list-tabulate">list-tabulate</a> 
 | |
| <a href="#list-copy">list-copy</a> <a href="#circular-list">circular-list</a> <a href="#iota">iota</a>
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Predicates
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <span class=r5rs-proc><a href="#pair-p">pair?</a> <a href="#null-p">null?</a></span>
 | |
| <a href="#proper-list-p">proper-list?</a> <a href="#circular-list-p">circular-list?</a> <a href="#dotted-list-p">dotted-list?</a> 
 | |
| <a href="#not-pair-p">not-pair?</a> <a href="#null-list-p">null-list?</a>
 | |
| <a href="#list=">list=</a>
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Selectors
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <span class=r5rs-proc><a href="#car">car</a> <a href="#cdr">cdr</a> ... <a href="#cddadr">cddadr</a> <a href="#cddddr">cddddr</a> <a href="#list-ref">list-ref</a></span>
 | |
| <a href="#first">first</a> <a href="#second">second</a> <a href="#third">third</a> <a href="#fourth">fourth</a> <a href="#fifth">fifth</a> <a href="#sixth">sixth</a> <a href="#seventh">seventh</a> <a href="#eighth">eighth</a> <a href="#ninth">ninth</a> <a href="#tenth">tenth</a>
 | |
| <a href="#car+cdr">car+cdr</a>
 | |
| <a href="#take">take</a>       <a href="#drop">drop</a>
 | |
| <a href="#take-right">take-right</a> <a href="#drop-right">drop-right</a>
 | |
| <a href="#take!">take!</a>      <a href="#drop-right!">drop-right!</a> 
 | |
| <a href="#split-at">split-at</a>   <a href="#split-at!">split-at!</a> 
 | |
| <a href="#last">last</a> <a href="#last-pair">last-pair</a>
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Miscellaneous: length, append, concatenate, reverse, zip & count
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <span class=r5rs-proc><a href="#length">length</a></span> <a href="#length+">length+</a>
 | |
| <span class=r5rs-proc><a href="#append">append</a></span>  <a href="#concatenate">concatenate</a>  <span class=r5rs-proc><a href="#reverse">reverse</a></span>
 | |
| <a href="#append!">append!</a> <a href="#concatenate!">concatenate!</a> <a href="#reverse!">reverse!</a>
 | |
| <a href="#append-reverse">append-reverse</a> <a href="#append-reverse!">append-reverse!</a>
 | |
| <a href="#zip">zip</a> <a href="#unzip1">unzip1</a> <a href="#unzip2">unzip2</a> <a href="#unzip3">unzip3</a> <a href="#unzip4">unzip4</a> <a href="#unzip5">unzip5</a>
 | |
| <a href="#count">count</a>
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Fold, unfold & map
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <span class=r5rs-procx><a href="#map">map</a> <a href="#for-each">for-each</a></span>
 | |
| <a href="#fold">fold</a>       <a href="#unfold">unfold</a>       <a href="#pair-fold">pair-fold</a>       <a href="#reduce">reduce</a> 
 | |
| <a href="#fold-right">fold-right</a> <a href="#unfold-right">unfold-right</a> <a href="#pair-fold-right">pair-fold-right</a> <a href="#reduce-right">reduce-right</a> 
 | |
| <a href="#append-map">append-map</a> <a href="#append-map!">append-map!</a>
 | |
| <a href="#map!">map!</a> <a href="#pair-for-each">pair-for-each</a> <a href="#filter-map">filter-map</a> <a href="#map-in-order">map-in-order</a>
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Filtering & partitioning
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <a href="#filter">filter</a>  <a href="#partition">partition</a>  <a href="#remove">remove</a>
 | |
| <a href="#filter!">filter!</a> <a href="#partition!">partition!</a> <a href="#remove!">remove!</a> 
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Searching
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <span class=r5rs-procx><a href="#member">member</a></span> <span class=r5rs-proc><a href="#memq">memq</a> <a href="#memv">memv</a></span>
 | |
| <a href="#find">find</a> <a href="#find-tail">find-tail</a> 
 | |
| <a href="#any">any</a> <a href="#every">every</a>
 | |
| <a href="#list-index">list-index</a>
 | |
| <a href="#take-while">take-while</a> <a href="#drop-while">drop-while</a> <a href="#take-while!">take-while!</a>
 | |
| <a href="#span">span</a> <a href="#break">break</a> <a href="#span!">span!</a> <a href="#break!">break!</a>
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Deleting
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <a href="#delete">delete</a>  <a href="#delete-duplicates">delete-duplicates</a> 
 | |
| <a href="#delete!">delete!</a> <a href="#delete-duplicates!">delete-duplicates!</a>
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Association lists
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <span class=r5rs-procx><a href="#assoc">assoc</a></span> <span class=r5rs-proc><a href="#assq">assq</a> <a href="#assv">assv</a></span>
 | |
| <a href="#alist-cons">alist-cons</a> <a href="#alist-copy">alist-copy</a>
 | |
| <a href="#alist-delete">alist-delete</a> <a href="#alist-delete!">alist-delete!</a>
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Set operations on lists
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <a href="#lset<=">lset<=</a> <a href="#lset=">lset=</a> <a href="#lset-adjoin">lset-adjoin</a>
 | |
| <a href="#lset-union">lset-union</a>			<a href="#lset-union!">lset-union!</a>
 | |
| <a href="#lset-intersection">lset-intersection</a>		<a href="#lset-intersection!">lset-intersection!</a>
 | |
| <a href="#lset-difference">lset-difference</a>		        <a href="#lset-difference!">lset-difference!</a>
 | |
| <a href="#lset-xor">lset-xor</a>			<a href="#lset-xor!">lset-xor!</a>
 | |
| <a href="#lset-diff+intersection">lset-diff+intersection</a>	        <a href="#lset-diff+intersection!">lset-diff+intersection!</a>
 | |
| </pre>
 | |
| 
 | |
| <dt class=proc-index> Primitive side-effects
 | |
| <dd class=proc-index>
 | |
| <pre class=proc-index>
 | |
| <span class=r5rs-proc><a href="#set-car!">set-car!</a> <a href="#set-cdr!">set-cdr!</a></span>
 | |
| </pre>
 | |
| </dl>
 | |
| </div>
 | |
| 
 | |
| <p>
 | |
| Four <abbr title="Revised^4 Report on Scheme">R4RS</abbr>/<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> list-processing procedures are extended by this library in
 | |
| backwards-compatible ways:
 | |
| <div class=indent>
 | |
| <table cellspacing=0>
 | |
| <tr valign=baseline><td><code>map for-each</code> 
 | |
|     <td>(Extended to take lists of unequal length) 
 | |
| <tr valign=baseline><td><code>member assoc</code> 
 | |
|     <td>(Extended to take an optional comparison procedure.)
 | |
| </table>
 | |
| </div>
 | |
| 
 | |
| <p>
 | |
| The following <abbr title="Revised^4 Report on Scheme">R4RS</abbr>/<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> list- and pair-processing procedures are also part of
 | |
| list-lib's exports, as defined by the <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>:
 | |
| <div class=indent>
 | |
| <pre>
 | |
| cons pair? null?
 | |
| car cdr ... cdddar cddddr 
 | |
| set-car! set-cdr! 
 | |
| list append reverse
 | |
| length list-ref
 | |
| memq memv assq assv
 | |
| </pre>
 | |
| </div>
 | |
|     
 | |
| <p>
 | |
| The remaining two <abbr title="Revised^4 Report on Scheme">R4RS</abbr>/<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> list-processing 
 | |
| procedures are <em>not</em> part of
 | |
| this library:
 | |
| <div class=indent>
 | |
| <table cellspacing=0>
 | |
| <tr><td><code>list-tail</code> 
 | |
|     <td>(renamed <code>drop</code>)
 | |
| <tr valign=baseline><td><code>list?</code>
 | |
|     <td>(see <code>proper-list?</code>,
 | |
|              <code>circular-list?</code> and 
 | |
|              <code>dotted-list?</code>)
 | |
| </table>
 | |
| </div>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1><a name="GeneralDiscussion">General discussion</a></h1>
 | |
| <p>
 | |
| 
 | |
| A set of general criteria guided the design of this library.
 | |
| 
 | |
| <p>
 | |
| 
 | |
| I don't require "destructive" (what I call "linear update") procedures to 
 | |
| alter and recycle cons cells from the argument lists. They are allowed to, but
 | |
| not required to. (And the reference implementations I have written <em>do</em>
 | |
| recycle the argument lists.)
 | |
| 
 | |
| <p>
 | |
| List-filtering procedures such as <code>filter</code> or <code>delete</code> do not disorder
 | |
| lists. Elements appear in the answer list in the same order as they appear in
 | |
| the argument list. This constrains implementation, but seems like a desirable
 | |
| feature, since in many uses of lists, order matters.  (In particular,
 | |
| disordering an alist is definitely a bad idea.)
 | |
| <p>
 | |
| Contrariwise, although the reference implementations of the list-filtering
 | |
| procedures share longest common tails between argument and answer lists,
 | |
| it not is part of the spec.
 | |
| <p>
 | |
| Because lists are an inherently sequential data structure (unlike, say,
 | |
| vectors), list-inspection functions such as <code>find</code>, <code>find-tail</code>, <code>for-each</code>, <code>any</code>
 | |
| and <code>every</code> commit to a left-to-right traversal order of their argument list.
 | |
| <p>
 | |
| However, constructor functions, such as <code><code>list-tabulate</code></code> and the mapping
 | |
| procedures (<code>append-map</code>, <code>append-map!</code>, <code>map!</code>, <code>pair-for-each</code>, <code>filter-map</code>,
 | |
| <code>map-in-order</code>), do <em>not</em> specify the dynamic order in which their procedural
 | |
| argument is applied to its various values.
 | |
| <p>
 | |
| Predicates return useful true values wherever possible.  Thus <code>any</code> must return
 | |
| the true value produced by its predicate, and <code>every</code>  returns the final true
 | |
| value produced by applying its predicate argument to the last element of its
 | |
| argument list.
 | |
| <p>
 | |
| Functionality is provided both in pure and linear-update (potentially
 | |
| destructive) forms wherever this makes sense.
 | |
| <p>
 | |
| No special status accorded Scheme's built-in equality functions.
 | |
| Any functionality provided in terms of <code>eq?</code>, <code>eqv?</code>, <code>equal?</code> is also
 | |
| available using a client-provided equality function.
 | |
| <p>
 | |
| Proper design counts for more than backwards compatibility, but I have tried,
 | |
| <em>ceteris paribus</em>, 
 | |
| to be as backwards-compatible as possible with existing
 | |
| list-processing libraries, in order to facilitate porting old code to run as a
 | |
| client of the procedures in this library. Name choices and semantics are, for
 | |
| the most part, in agreement with existing practice in many current Scheme
 | |
| systems. I have indicated some incompatibilities in the following text.
 | |
| <p>
 | |
| These procedures are <em>not</em> "sequence generic" -- <em>i.e.</em>, procedures that
 | |
| operate on either vectors and lists. They are list-specific. I prefer to
 | |
| keep the library simple and focussed.
 | |
| <p>
 | |
| I have named these procedures without a qualifying initial "list-" lexeme,
 | |
| which is in keeping with the existing set of list-processing utilities in
 | |
| Scheme.
 | |
| I follow the general Scheme convention (vector-length, string-ref) of
 | |
| placing the type-name before the action when naming procedures -- so
 | |
| we have <code>list-copy</code> and <code>pair-for-each</code> rather than the perhaps
 | |
| more fluid, but less consistent, <code>copy-list</code> or <code>for-each-pair</code>.
 | |
| <p>
 | |
| I have generally followed a regular and consistent naming scheme, composing
 | |
| procedure names from a set of basic lexemes.
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="LinearUpdateProcedures">"Linear update" procedures</a></h2>
 | |
| <p>
 | |
| 
 | |
| Many procedures in this library have "pure" and "linear update" variants.  A
 | |
| "pure" procedure has no side-effects, and in particular does not alter its
 | |
| arguments in any way. A "linear update" procedure is allowed -- but <em>not</em>
 | |
| required -- to side-effect its arguments in order to construct its
 | |
| result. "Linear update" procedures are typically given names ending with an
 | |
| exclamation point. So, for example, <code>(append! list1 list2)</code> is allowed to
 | |
| construct its result by simply using <code>set-cdr!</code> to set the cdr of the last pair
 | |
| of <var>list<sub>1</sub></var> to point to <var>list<sub>2</sub></var>, and then returning <var>list<sub>1</sub></var> (unless <var>list<sub>1</sub></var> is the
 | |
| empty list, in which case it would simply return <var>list<sub>2</sub></var>). However, <code>append!</code> may
 | |
| also elect to perform a pure append operation -- this is a legal definition
 | |
| of <code>append!</code>:
 | |
| <pre class=code-example>
 | |
| (define append! append)
 | |
| </pre>
 | |
| <p>
 | |
| This is why we do not call these procedures "destructive" -- because they
 | |
| aren't <em>required</em> to be destructive. They are <em>potentially</em> destructive.
 | |
| <p>
 | |
| What this means is that you may only apply linear-update procedures to
 | |
| values that you know are "dead" -- values that will never be used again
 | |
| in your program. This must be so, since you can't rely on the value passed
 | |
| to a linear-update procedure after that procedure has been called. It
 | |
| might be unchanged; it might be altered.
 | |
| <p>
 | |
| The "linear" in "linear update" doesn't mean "linear time" or "linear space"
 | |
| or any sort of multiple-of-n kind of meaning. It's a fancy term that
 | |
| type theorists and pure functional programmers use to describe
 | |
| systems where you are only allowed to have exactly one reference to each
 | |
| variable. This provides a guarantee that the value bound to a variable is
 | |
| bound to no other variable. So when you <em>use</em> a variable in a variable
 | |
| reference, you "use it up." Knowing that no one else has a pointer to that
 | |
| value means the a system primitive is free to side-effect its arguments to
 | |
| produce what is, observationally, a pure-functional result.
 | |
| <p>
 | |
| In the context of this library, "linear update" means you, the programmer,
 | |
| know there are <em>no other</em> live references to the value passed to the
 | |
| procedure -- after passing the value to one of these procedures, the
 | |
| value of the old pointer is indeterminate. Basically, you are licensing
 | |
| the Scheme implementation to alter the data structure if it feels like
 | |
| it -- you have declared you don't care either way.
 | |
| <p>
 | |
| You get no help from Scheme in checking that the values you claim are "linear"
 | |
| really are. So you better get it right. Or play it safe and use the non-!
 | |
| procedures -- it doesn't do any good to compute quickly if you get the wrong
 | |
| answer.
 | |
| <p>
 | |
| Why go to all this trouble to define the notion of "linear update" and use it
 | |
| in a procedure spec, instead of the more common notion of a "destructive"
 | |
| operation?  First, note that destructive list-processing procedures are almost
 | |
| always used in a linear-update fashion. This is in part required by the
 | |
| special case of operating upon the empty list, which can't be side-effected.
 | |
| This means that destructive operators are not pure side-effects -- they have
 | |
| to return a result. Second, note that code written using linear-update
 | |
| operators can be trivially ported to a pure, functional subset of Scheme by
 | |
| simply providing pure implementations of the linear-update operators. Finally,
 | |
| requiring destructive side-effects ruins opportunities to parallelise these
 | |
| operations -- and the places where one has taken the trouble to spell out
 | |
| destructive operations are usually exactly the code one would want a
 | |
| parallelising compiler to parallelise: the efficiency-critical kernels of the
 | |
| algorithm.  Linear-update operations are easily parallelised. Going with a
 | |
| linear-update spec doesn't close off these valuable alternative implementation
 | |
| techniques. This list library is intended as a set of low-level, basic
 | |
| operators, so we don't want to exclude these possible implementations.
 | |
| <p>
 | |
| The linear-update procedures in this library are
 | |
| <div class=indent><code>
 | |
| take! drop-right! split-at!
 | |
| append! concatenate! reverse! append-reverse!
 | |
| append-map! map!
 | |
| filter! partition! remove! 
 | |
| take-while! span! break!
 | |
| delete! alist-delete! delete-duplicates!
 | |
| lset-adjoin! lset-union! lset-intersection! 
 | |
| lset-difference! lset-xor! lset-diff+intersection!
 | |
| </code></div>
 | |
| 
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="ImproperLists">Improper Lists</a></h2>
 | |
| <p>
 | |
| 
 | |
| Scheme does not properly have a list type, just as C does not have a string
 | |
| type. Rather, Scheme has a binary-tuple type, from which one can build binary
 | |
| trees. There is an <em>interpretation</em> of Scheme values that allows one to
 | |
| treat these trees as lists. Further complications ensue from the fact that
 | |
| Scheme allows side-effects to these tuples, raising the possibility of lists
 | |
| of unbounded length, and trees of unbounded depth (that is, circular data
 | |
| structures).
 | |
| 
 | |
| <p>
 | |
| However, there is a simple view of the world of Scheme values that considers
 | |
| every value to be a list of some sort. that is, every value is either
 | |
| <ul>
 | |
|     <li>a "proper list" -- a finite, nil-terminated list, such as:<br>
 | |
|           <code>(a b c)</code><br>
 | |
|           <code>()</code><br>
 | |
|           <code>(32)</code><br>
 | |
|     <li>a "dotted list" -- a finite, non-nil terminated list, such as:<br>
 | |
|           <code>(a b c . d)</code><br>
 | |
|           <code>(x . y)</code><br>
 | |
|           <code>42</code><br>
 | |
|           <code>george</code><br>
 | |
|     <li>or a "circular list" -- an infinite, unterminated list.
 | |
| </ul>
 | |
| <p>
 | |
| Note that the zero-length dotted lists are simply all the non-null, non-pair
 | |
| values.
 | |
| 
 | |
| <p>
 | |
| This view is captured by the predicates <code>proper-list?</code>, <code>dotted-list?</code>, and
 | |
| <code>circular-list?</code>. List-lib users should note that dotted lists are not commonly
 | |
| used, and are considered by many Scheme programmers to be an ugly artifact of
 | |
| Scheme's lack of a true list type. However, dotted lists do play a noticeable
 | |
| role in the <em>syntax</em> of Scheme, in the "rest" parameters used by n-ary
 | |
| lambdas: <code>(lambda (x y . rest) ...)</code>.
 | |
| 
 | |
| <p>
 | |
| Dotted lists are <em>not</em> fully supported by list-lib. Most procedures are
 | |
| defined only on proper lists -- that is, finite, nil-terminated lists.  The
 | |
| procedures that will also handle circular or dotted lists are specifically
 | |
| marked. While this design decision restricts the domain of possible arguments
 | |
| one can pass to these procedures, it has the benefit of allowing the
 | |
| procedures to catch the error cases where programmers inadvertently pass
 | |
| scalar values to a list procedure by accident, 
 | |
| <em>e.g.</em>, by switching the arguments to a procedure call.
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="Errors">Errors</a></h2>
 | |
| <p>
 | |
| 
 | |
| Note that statements of the form "it is an error" merely mean "don't
 | |
| do that." They are not a guarantee that a conforming implementation will
 | |
| "catch" such improper use by, for example, raising some kind of exception.
 | |
| Regrettably, <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> Scheme requires no firmer guarantee even for basic operators such
 | |
| as <code>car</code> and <code>cdr</code>, so there's little point in requiring these procedures to do
 | |
| more.  Here is the relevant section of the <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>:
 | |
| <blockquote>
 | |
|     <p>
 | |
|     When speaking of an error situation, this report uses the phrase "an
 | |
|     error is signalled" to indicate that implementations must detect and
 | |
|     report the error.  If such wording does not appear in the discussion
 | |
|     of an error, then implementations are not required to detect or
 | |
|     report the error, though they are encouraged to do so.  An error
 | |
|     situation that implementations are not required to detect is usually
 | |
|     referred to simply as "an error."
 | |
|     <p>
 | |
|     For example, it is an error for a procedure to be passed an argument
 | |
|     that the procedure is not explicitly specified to handle, even though
 | |
|     such domain errors are seldom mentioned in this report.
 | |
|     Implementations may extend a procedure's domain of definition to
 | |
|     include such arguments.
 | |
| </blockquote>
 | |
| 
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="NotIncludedInThisLibrary">Not included in this library</a></h2>
 | |
| <p>
 | |
| The following items are not in this library:
 | |
| <ul>
 | |
| <li>Sort routines
 | |
| <li>Destructuring/pattern-matching macro
 | |
| <li>Tree-processing routines
 | |
| </ul>
 | |
| <p>
 | |
| They should have their own <abbr title="Scheme Request for Implementation">SRFI</abbr> specs.
 | |
| <p>
 | |
| 
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1><a name="TheProcedures">The procedures</a></h1>
 | |
| <p>
 | |
| 
 | |
| In a Scheme system that has a module or package system, these procedures
 | |
| should be contained in a module named "list-lib".
 | |
| 
 | |
| The templates given below obey the following conventions for procedure formals:
 | |
| <table>
 | |
| <tr valign=baseline><th align=left> <var>list</var>	
 | |
|     <td> A proper (finite, nil-terminated) list
 | |
| <tr valign=baseline><th align=left> <var>clist</var>
 | |
|     <td> A proper or circular list
 | |
| <tr valign=baseline><th align=left> <var>flist</var>
 | |
|     <td> A finite (proper or dotted) list
 | |
| <tr valign=baseline><th align=left> <var>pair</var>
 | |
|     <td> A pair
 | |
| <tr valign=baseline>
 | |
|     <th align=left> <var>x</var>, <var>y</var>, <var>d</var>, <var>a</var>
 | |
|     <td> Any value
 | |
| <tr valign=baseline><th align=left> <var>object</var>, <var>value</var>
 | |
|     <td> Any value
 | |
| <tr valign=baseline><th align=left> <var>n</var>, <var>i</var>
 | |
|     <td> A natural number (an integer >= 0)
 | |
| <tr valign=baseline><th align=left> <var>proc</var>
 | |
|     <td> A procedure
 | |
| <tr valign=baseline><th align=left> <var>pred</var>
 | |
|     <td> A procedure whose return value is treated as a boolean
 | |
| <tr valign=baseline><th align=left> <var>=</var>
 | |
|     <td> A boolean procedure taking two arguments
 | |
| </table>
 | |
| 
 | |
| <p>
 | |
| It is an error to pass a circular or dotted list to a procedure not
 | |
| defined to accept such an argument.
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="Constructors">Constructors</a></h2>
 | |
| <p>
 | |
| 
 | |
| <dl>
 | |
| 
 | |
| <!--
 | |
| ==== cons
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="cons"></a>
 | |
| <code class=proc-def>cons</code> <var>a d -> pair</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
|     The primitive constructor.  Returns a newly allocated pair whose car is 
 | |
|     <var>a</var> and whose cdr is <var>d</var>.  
 | |
|     The pair is guaranteed to be different (in the sense of <code>eqv?</code>)
 | |
|     from every existing object.
 | |
| <pre class=code-example>
 | |
| (cons 'a '())        => (a)
 | |
| (cons '(a) '(b c d)) => ((a) b c d)
 | |
| (cons "a" '(b c))    => ("a" b c)
 | |
| (cons 'a 3)          => (a . 3)
 | |
| (cons '(a b) 'c)     => ((a b) . c)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== list
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="list"></a>
 | |
| <code class=proc-def>list</code> <var>object ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
|     Returns a newly allocated list of its arguments.
 | |
| <pre class=code-example>
 | |
| (list 'a (+ 3 4) 'c) =>  (a 7 c)
 | |
| (list)               =>  ()
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== xcons
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="xcons"></a>
 | |
| <code class=proc-def>xcons</code> <var>d a -> pair</var>
 | |
| <dd class=proc-def>
 | |
| <pre>
 | |
| (lambda (d a) (cons a d))
 | |
| </pre>
 | |
|     Of utility only as a value to be conveniently passed to higher-order 
 | |
|     procedures.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (xcons '(b c) 'a) => (a b c)
 | |
| </pre>
 | |
| 
 | |
|     The name stands for "eXchanged CONS."
 | |
| 
 | |
| <!--
 | |
| ==== cons*
 | |
| ============================================================================-->
 | |
| <a name="cons*"></a>
 | |
| <dt class=proc-def><code class=proc-def>cons*</code><var> elt<sub>1</sub> elt<sub>2</sub> ... -> object</var>
 | |
| <dd class=proc-def>
 | |
| 
 | |
|     Like <code>list</code>, 
 | |
|     but the last argument provides the tail of the constructed list,
 | |
|     returning
 | |
|     <div class=indent><code>
 | |
| (cons <var>elt<sub>1</sub></var> (cons <var>elt<sub>2</sub></var> (cons ... <var>elt<sub>n</sub></var>)))
 | |
|     </code></div>
 | |
|     This function is called <code>list*</code> in <a href="#CommonLisp">Common Lisp</a> and about 
 | |
|     half of the Schemes that provide it,
 | |
|     and <code>cons*</code> in the other half.
 | |
| <pre class=code-example>
 | |
| (cons* 1 2 3 4) => (1 2 3 . 4)
 | |
| (cons* 1) => 1
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== make-list
 | |
| ============================================================================-->
 | |
| <a name="make-list"></a>
 | |
| <dt class=proc-def> <code class=proc-def>make-list</code> <var>n [fill] -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Returns an <var>n</var>-element list, 
 | |
|     whose elements are all the value <var>fill</var>.
 | |
|     If the <var>fill</var> argument is not given, the elements of the list may
 | |
|     be arbitrary values.
 | |
| <pre class=code-example>
 | |
| (make-list 4 'c) => (c c c c)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== list-tabulate
 | |
| ============================================================================-->
 | |
| <a name="list-tabulate"></a>
 | |
| <dt class=proc-def><code class=proc-def>list-tabulate</code><var> n init-proc -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Returns an <var>n</var>-element list. Element <var>i</var> of the list, where 0 <= <var>i</var> < <var>n</var>,
 | |
|     is produced by <code>(<var>init-proc</var> <var>i</var>)</code>. No guarantee is made about the dynamic
 | |
|     order in which <var>init-proc</var> is applied to these indices.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (list-tabulate 4 values) => (0 1 2 3)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== list-copy
 | |
| ============================================================================-->
 | |
| <a name="list-copy"></a>
 | |
| <dt class=proc-def><code class=proc-def>list-copy</code><var> flist -> flist</var>
 | |
| <dd class=proc-def>
 | |
|     Copies the spine of the argument.
 | |
|     
 | |
| <!--
 | |
| ==== circular-list
 | |
| ============================================================================-->
 | |
| <a name="circular-list"></a>
 | |
| <dt class=proc-def><code class=proc-def>circular-list</code><var> elt<sub>1</sub> elt<sub>2</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Constructs a circular list of the elements.
 | |
| <pre class=code-example>
 | |
| (circular-list 'z 'q) => (z q z q z q ...)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== iota
 | |
| ============================================================================-->
 | |
| <a name="iota"></a>
 | |
| <dt class=proc-def><code class=proc-def>iota</code><var> count [start step] -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Returns a list containing the elements
 | |
| <pre class=code-example>
 | |
| (<var>start</var> <var>start</var>+<var>step</var> ... <var>start</var>+(<var>count</var>-1)*<var>step</var>)
 | |
| </pre>
 | |
|     The <var>start</var> and <var>step</var> parameters default to 0 and 1, respectively.
 | |
|     This procedure takes its name from the APL primitive.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (iota 5) => (0 1 2 3 4)
 | |
| (iota 5 0 -0.1) => (0 -0.1 -0.2 -0.3 -0.4)
 | |
| </pre>
 | |
| </dl>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="Predicates">Predicates</a></h2>
 | |
| <p>
 | |
| Note: the predicates <code>proper-list?</code>, <code>circular-list?</code>, and <code>dotted-list?</code>
 | |
| partition the entire universe of Scheme values.
 | |
| 
 | |
| <dl>
 | |
| <!--
 | |
| ==== proper-list?
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <code class=proc-def>proper-list?</code><var> x -> boolean</var>
 | |
| <a name="proper-list-p"></a>
 | |
| <dd class=proc-def>
 | |
|     Returns true iff <var>x</var> is a proper list -- a finite, nil-terminated list.
 | |
| <p>
 | |
|     More carefully: The empty list is a proper list. A pair whose cdr is a 
 | |
|     proper list is also a proper list:
 | |
| <pre>
 | |
| <proper-list> ::= ()                            (Empty proper list)
 | |
|               |   (cons <x> <proper-list>)      (Proper-list pair)
 | |
| </pre>
 | |
|     Note that this definition rules out circular lists. This
 | |
|     function is required to detect this case and return false.
 | |
| <p>
 | |
|     Nil-terminated lists are called "proper" lists by <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> and <a href="#CommonLisp">Common Lisp</a>.
 | |
|     The opposite of proper is improper.
 | |
| <p>
 | |
|     <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> binds this function to the variable <code>list?</code>.
 | |
| <p>
 | |
| <pre>
 | |
| (not (proper-list? <var>x</var>)) = (or (dotted-list? <var>x</var>) (circular-list? <var>x</var>))
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== circular-list?
 | |
| ============================================================================-->
 | |
| <a name="circular-list-p"></a>
 | |
| <dt class=proc-def><code class=proc-def>circular-list?</code><var> x -> boolean</var>
 | |
| <dd class=proc-def>
 | |
|     True if <var>x</var> is a circular list. A circular list is a value such that
 | |
|     for every <var>n</var> >= 0, cdr<sup><var>n</var></sup>(<var>x</var>) is a pair.
 | |
| <p>
 | |
|     Terminology: The opposite of circular is finite.
 | |
| <pre>
 | |
| (not (circular-list? <var>x</var>)) = (or (proper-list? <var>x</var>) (dotted-list? <var>x</var>))
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== dotted-list?
 | |
| ============================================================================-->
 | |
| <a name="dotted-list-p"></a>
 | |
| <dt class=proc-def><code class=proc-def>dotted-list?</code><var> x -> boolean</var>
 | |
| <dd class=proc-def>
 | |
|     True if <var>x</var> is a finite, non-nil-terminated list. That is, there exists
 | |
|     an <var>n</var> >= 0 such that cdr<sup><var>n</var></sup>(<var>x</var>) is neither a pair nor (). 
 | |
|     This includes
 | |
|     non-pair, non-() values (<em>e.g.</em> symbols, numbers), 
 | |
|     which are considered to be dotted lists of length 0.
 | |
| <pre>
 | |
| (not (dotted-list? <var>x</var>)) = (or (proper-list? <var>x</var>) (circular-list? <var>x</var>))
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== pair?
 | |
| ============================================================================-->
 | |
| <a name="pair-p"></a>
 | |
| <dt class=proc-def><code class=proc-def>pair?</code><var> object -> boolean</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
|     Returns #t if <var>object</var> is a pair; otherwise, #f.
 | |
| <pre class=code-example>
 | |
| (pair? '(a . b)) =>  #t
 | |
| (pair? '(a b c)) =>  #t
 | |
| (pair? '())      =>  #f
 | |
| (pair? '#(a b))  =>  #f
 | |
| (pair? 7)        =>  #f
 | |
| (pair? 'a)       =>  #f
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== null?
 | |
| ============================================================================-->
 | |
| <a name="null-p"></a>
 | |
| <dt class=proc-def><code class=proc-def>null?</code><var> object -> boolean</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
|     Returns #t if <var>object</var> is the empty list; otherwise, #f.
 | |
| 
 | |
| <!--
 | |
| ==== null-list?
 | |
| ============================================================================-->
 | |
| <a name="null-list-p"></a>
 | |
| <dt class=proc-def><code class=proc-def>null-list?</code><var> list -> boolean</var>
 | |
| <dd class=proc-def>
 | |
|     <var>List</var> is a proper or circular list. This procedure returns true if
 | |
|     the argument is the empty list (), and false otherwise. It is an
 | |
|     error to pass this procedure a value which is not a proper or
 | |
|     circular list.
 | |
| 
 | |
|     This procedure is recommended as the termination condition for 
 | |
|     list-processing procedures that are not defined on dotted lists.
 | |
| 
 | |
| <!--
 | |
| ==== not-pair?
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="not-pair-p"></a>
 | |
| <code class=proc-def>not-pair?</code><var> x -> boolean</var>
 | |
| <dd class=proc-def>
 | |
|     <pre>(lambda (x) (not (pair? x)))</pre>
 | |
|     Provided as a procedure as it can be useful as the termination condition
 | |
|     for list-processing procedures that wish to handle all finite lists,
 | |
|     both proper and dotted.
 | |
| 
 | |
| <!--
 | |
| ==== list=
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="list="></a>
 | |
| <code class=proc-def>list=</code><var> elt= list<sub>1</sub> ... -> boolean</var>
 | |
| <dd class=proc-def>
 | |
|     Determines list equality, given an element-equality procedure.
 | |
|     Proper list <var>A</var> equals proper list <var>B</var> 
 | |
|     if they are of the same length,
 | |
|     and their corresponding elements are equal, 
 | |
|     as determined by <var>elt=</var>. 
 | |
|     If the element-comparison procedure's first argument is
 | |
|     from <var>list<sub>i</sub></var>, 
 | |
|     then its second argument is from <var>list<sub>i+1</sub></var>, 
 | |
|     <em>i.e.</em> it is always called as
 | |
|         <code>(<var>elt=</var> <var>a</var> <var>b</var>)</code>
 | |
|     for <var>a</var> an element of list <var>A</var>, 
 | |
|     and <var>b</var> an element of list <var>B</var>.
 | |
| <p>
 | |
|     In the <var>n</var>-ary case, 
 | |
|     every <var>list<sub>i</sub></var> is compared to 
 | |
|     <var>list<sub>i+1</sub></var> 
 | |
|     (as opposed, for example, to comparing 
 | |
|     <var>list<sub>1</sub></var> to every <var>list<sub>i</sub></var>, 
 | |
|     for <var>i</var>>1). 
 | |
|     If there are no list arguments at all, 
 | |
|     <code>list=</code> simply returns true.
 | |
| <p>
 | |
|     It is an error to apply <code>list=</code> to anything except proper lists.
 | |
|     While
 | |
|     implementations may choose to extend it to circular lists, note that it
 | |
|     cannot reasonably be extended to dotted lists, as it provides no way to
 | |
|     specify an equality procedure for comparing the list terminators.
 | |
| <p>
 | |
|     Note that the dynamic order in which the <var>elt=</var> procedure is
 | |
|     applied to pairs of elements is not specified. 
 | |
|     For example, if <code>list=</code> is applied
 | |
|     to three lists, <var>A</var>, <var>B</var>, and <var>C</var>, 
 | |
|     it may first completely compare <var>A</var> to <var>B</var>,
 | |
|     then compare <var>B</var> to <var>C</var>, 
 | |
|     or it may compare the first elements of <var>A</var> and <var>B</var>,
 | |
|     then the first elements of <var>B</var> and <var>C</var>, 
 | |
|     then the second elements of <var>A</var> and <var>B</var>, and so forth.
 | |
| <p>
 | |
|     The equality procedure must be consistent with <code>eq?</code>. 
 | |
|     That is, it must be the case that
 | |
| <div class=indent>
 | |
|         <code>(eq? <var>x</var> <var>y</var>)</code> => <code>(<var>elt=</var> <var>x</var> <var>y</var>)</code>.
 | |
| </div>
 | |
|     Note that this implies that two lists which are <code>eq?</code> 
 | |
|     are always <var>list=</var>, as well; implementations may exploit this
 | |
|     fact to "short-cut" the element-by-element comparisons.
 | |
| <pre class=code-example>
 | |
| (list= eq?) => #t       ; Trivial cases
 | |
| (list= eq? '(a)) => #t
 | |
| </pre>
 | |
| 
 | |
| </dl>
 | |
| 
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="Selectors">Selectors</a></h2>
 | |
| <dl>
 | |
| 
 | |
| <!--
 | |
| ==== car cdr
 | |
| ============================================================================-->
 | |
| <a name="car"></a>
 | |
| <a name="cdr"></a>
 | |
| <dt class=proc-def1><code class=proc-def>car</code><var> pair -> value</var>
 | |
| <dt class=proc-defn><code class=proc-def>cdr</code><var> pair -> value</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
|     These functions return the contents of the car and cdr field of their
 | |
|     argument, respectively.
 | |
|     Note that it is an error to apply them to the empty list.
 | |
| <pre class=code-example>
 | |
| (car '(a b c))     =>  a             (cdr '(a b c))     =>  (b c)  
 | |
| (car '((a) b c d)) =>  (a)	     (cdr '((a) b c d)) =>  (b c d)
 | |
| (car '(1 . 2))     =>  1	     (cdr '(1 . 2))     =>  2      
 | |
| (car '())          =>  *error*	     (cdr '())          =>  *error*
 | |
| </pre>
 | |
| 
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== caar cadr ... cdddar cddddr
 | |
| ============================================================================-->
 | |
| <a name="caar"></a>
 | |
| <a name="cadr"></a>
 | |
| <a name="cdddar"></a>
 | |
| <a name="cddddr"></a>
 | |
| <dt class=proc-def1><code class=proc-def>caar</code><var> pair -> value</var>
 | |
| <dt class=proc-defi><code class=proc-def>cadr</code><var> pair -> value</var>
 | |
| <dt class=proc-defi><code class=proc-def>:</code>
 | |
| <dt class=proc-defi><code class=proc-def>cdddar</code><var> pair -> value</var>
 | |
| <dt class=proc-defn><code class=proc-def>cddddr</code><var> pair -> value</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
|     These procedures are compositions of <code>car</code> and <code>cdr</code>,
 | |
|     where for example <code>caddr</code> could be defined by
 | |
| <pre class=code-example>    
 | |
| (define caddr (lambda (x) (car (cdr (cdr x))))).
 | |
| </pre>
 | |
|     Arbitrary compositions, up to four deep, are provided.  There are
 | |
|     twenty-eight of these procedures in all.
 | |
| 
 | |
| <!--
 | |
| ==== list-ref
 | |
| ============================================================================-->
 | |
| <a name="list-ref"></a>
 | |
| <dt class=proc-def><code class=proc-def>list-ref</code><var> clist i -> value</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
|     Returns the <var>i</var><sup>th</sup> element of <var>clist</var>.  
 | |
|     (This is the same as the car of 
 | |
|         <code>(drop <var>clist</var> <var>i</var>)</code>.)
 | |
|     It is an error if <var>i</var> >= <var>n</var>, 
 | |
|     where <var>n</var> is the length of <var>clist</var>.
 | |
| <pre class=code-example>    
 | |
| (list-ref '(a b c d) 2) => c
 | |
| </pre>    
 | |
| 
 | |
| <!--
 | |
| ==== tenth
 | |
| ==== ninth
 | |
| ==== eighth
 | |
| ==== seventh
 | |
| ==== sixth
 | |
| ==== fifth
 | |
| ==== fourth
 | |
| ==== third
 | |
| ==== second
 | |
| ==== first
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="first"></a>
 | |
| <code class=proc-def>first   </code><var>pair -> object </var>
 | |
| <dt class=proc-defi>
 | |
| <a name="second"></a>
 | |
| <code class=proc-def>second  </code><var>pair -> object </var>
 | |
| <dt class=proc-defi>
 | |
| <a name="third"></a>
 | |
| <code class=proc-def>third   </code><var>pair -> object </var>
 | |
| <dt class=proc-defi>
 | |
| <a name="fourth"></a>
 | |
| <code class=proc-def>fourth  </code><var>pair -> object </var>
 | |
| <dt class=proc-defi>
 | |
| <a name="fifth"></a>
 | |
| <code class=proc-def>fifth   </code><var>pair -> object </var>
 | |
| <dt class=proc-defi>
 | |
| <a name="sixth"></a>
 | |
| <code class=proc-def>sixth   </code><var>pair -> object </var>
 | |
| <dt class=proc-defi>
 | |
| <a name="seventh"></a>
 | |
| <code class=proc-def>seventh </code><var>pair -> object </var>
 | |
| <dt class=proc-defi>
 | |
| <a name="eighth"></a>
 | |
| <code class=proc-def>eighth  </code><var>pair -> object </var>
 | |
| <dt class=proc-defi>
 | |
| <a name="ninth"></a>
 | |
| <code class=proc-def>ninth   </code><var>pair -> object </var>
 | |
| <dt class=proc-defn>
 | |
| <a name="tenth"></a>
 | |
| <code class=proc-def>tenth   </code><var>pair -> object  </var>
 | |
| <dd class=proc-def>
 | |
|     Synonyms for <code>car</code>, <code>cadr</code>, <code>caddr</code>, ... 
 | |
| 
 | |
| <pre class=code-example>
 | |
| (third '(a b c d e)) => c
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== car+cdr
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="car+cdr"></a>
 | |
| <code class=proc-def>car+cdr</code><var> pair -> [x y]</var>
 | |
| <dd class=proc-def>
 | |
|     The fundamental pair deconstructor:
 | |
| <pre class=code-example>
 | |
| (lambda (p) (values (car p) (cdr p)))
 | |
| </pre>
 | |
|     This can, of course, be implemented more efficiently by a compiler.
 | |
| 
 | |
| <!--
 | |
| ==== drop
 | |
| ==== take
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="take"></a>
 | |
| <code class=proc-def>take</code><var> x i -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="drop"></a>
 | |
| <code class=proc-def>drop</code><var> x i -> object</var>
 | |
| <dd class=proc-def>
 | |
|     <code>take</code> returns the first <var>i</var> elements of list <var>x</var>.<br>
 | |
|     <code>drop</code> returns all but the first <var>i</var> elements of list <var>x</var>.
 | |
| <pre class=code-example>
 | |
| (take '(a b c d e)  2) => (a b)
 | |
| (drop '(a b c d e)  2) => (c d e)
 | |
| </pre>
 | |
|     <var>x</var> may be any value -- a proper, circular, or dotted list:
 | |
| <pre class=code-example>
 | |
| (take '(1 2 3 . d) 2) => (1 2)
 | |
| (drop '(1 2 3 . d) 2) => (3 . d)
 | |
| (take '(1 2 3 . d) 3) => (1 2 3)
 | |
| (drop '(1 2 3 . d) 3) => d
 | |
| </pre>
 | |
|     For a legal <var>i</var>, <code>take</code> and <code>drop</code> partition the list in a manner which
 | |
|     can be inverted with <code>append</code>:
 | |
| <pre class=code-example>
 | |
| (append (take <var>x</var> <var>i</var>) (drop <var>x</var> <var>i</var>)) = <var>x</var>
 | |
| </pre>
 | |
|     <code>drop</code> is exactly equivalent to performing <var>i</var> cdr operations on <var>x</var>;
 | |
|     the returned value shares a common tail with <var>x</var>.
 | |
| 
 | |
|     If the argument is a list of non-zero length, <code>take</code> is guaranteed to
 | |
|     return a freshly-allocated list, even in the case where the entire
 | |
|     list is taken, <em>e.g.</em> <code>(take lis (length lis))</code>.
 | |
| 
 | |
| <!--
 | |
| ==== drop-right
 | |
| ==== take-right
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="take-right"></a>
 | |
| <code class=proc-def>take-right</code><var> flist i -> object</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="drop-right"></a>
 | |
| <code class=proc-def>drop-right</code><var> flist i -> list</var>
 | |
| <dd class=proc-def>
 | |
|     <code>take-right</code> returns the last <var>i</var> elements of <var>flist</var>.<br>
 | |
|     <code>drop-right</code> returns all but the last <var>i</var> elements of <var>flist</var>.
 | |
| <pre class=code-example>
 | |
| (take-right '(a b c d e) 2) => (d e)
 | |
| (drop-right '(a b c d e) 2) => (a b c)
 | |
| </pre>
 | |
|     The returned list may share a common tail with the argument list.
 | |
| <p>
 | |
|     <var>flist</var> may be any finite list, either proper or dotted:
 | |
| <pre class=code-example>
 | |
| (take-right '(1 2 3 . d) 2) => (2 3 . d)
 | |
| (drop-right '(1 2 3 . d) 2) => (1)
 | |
| (take-right '(1 2 3 . d) 0) => d
 | |
| (drop-right '(1 2 3 . d) 0) => (1 2 3)
 | |
| </pre>
 | |
|     For a legal <var>i</var>, <code>take-right</code> and <code>drop-right</code> partition the list in a manner 
 | |
|     which can be inverted with <code>append</code>:
 | |
| <pre class=code-example>
 | |
| (append (take <var>flist</var> <var>i</var>) (drop <var>flist</var> <var>i</var>)) = <var>flist</var>
 | |
| </pre>
 | |
|     <code>take-right</code>'s return value is guaranteed to share a common tail with <var>flist</var>.
 | |
| 
 | |
|     If the argument is a list of non-zero length, <code>drop-right</code> is guaranteed to
 | |
|     return a freshly-allocated list, even in the case where nothing is
 | |
|     dropped, <em>e.g.</em> <code>(drop-right lis 0)</code>.
 | |
| 
 | |
| <!--
 | |
| ==== drop-right!
 | |
| ==== take!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="take!"></a>
 | |
| <code class=proc-def>take!</code><var>        x     i -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="drop-right!"></a>
 | |
| <code class=proc-def>drop-right!</code><var>  flist i -> list</var>
 | |
| <dd class=proc-def>
 | |
|     <code>take!</code> and <code>drop-right!</code> are "linear-update" variants of <code>take</code> and
 | |
|     <code>drop-right</code>: the procedure is allowed, but not required, to alter the
 | |
|     argument list to produce the result.
 | |
| <p>
 | |
|     If <var>x</var> is circular, <code>take!</code> may return a shorter-than-expected list:
 | |
| <pre class=code-example>
 | |
| (take! (circular-list 1 3 5) 8) => (1 3)
 | |
| (take! (circular-list 1 3 5) 8) => (1 3 5 1 3 5 1 3)
 | |
| </pre>
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== split-at! 
 | |
| ==== split-at
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="split-at"></a>
 | |
| <code class=proc-def>split-at </code><var> x i -> [list object]</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="split-at!"></a>
 | |
| <code class=proc-def>split-at!</code><var> x i -> [list object]</var>
 | |
| <dd class=proc-def>
 | |
|     <code>split-at</code> splits the list <var>x</var> 
 | |
|     at index <var>i</var>, returning a list of the 
 | |
|     first <var>i</var> elements, and the remaining tail. It is equivalent
 | |
|     to
 | |
| <pre class=code-example>
 | |
| (values (take x i) (drop x i))
 | |
| </pre>
 | |
|     <code>split-at!</code> is the linear-update variant. It is allowed, but not
 | |
|     required, to alter the argument list to produce the result.
 | |
| <pre class=code-example>
 | |
| (split-at '(a b c d e f g h) 3) =>
 | |
|     (a b c)
 | |
|     (d e f g h)
 | |
| </pre>
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== last-pair
 | |
| ==== last
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="last"></a>
 | |
| <code class=proc-def>last</code><var> pair -> object</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="last-pair"></a>
 | |
| <code class=proc-def>last-pair</code><var> pair -> pair</var>
 | |
| <dd class=proc-def>
 | |
|     <code>last</code> returns the last element of the non-empty, 
 | |
|     finite list <var>pair</var>.
 | |
|     <code>last-pair</code> returns the last pair in the non-empty,
 | |
|     finite list <var>pair</var>.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (last '(a b c)) => c
 | |
| (last-pair '(a b c)) => (c)
 | |
| </pre>
 | |
| 
 | |
| </dl>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="Miscellaneous">Miscellaneous: length, append, concatenate, reverse, zip & count</a></h2>
 | |
| 
 | |
| <dl>
 | |
| <!--
 | |
| ==== length+
 | |
| ==== length
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="length"></a>
 | |
| <code class=proc-def>length  </code><var>list -> integer</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="length+"></a>
 | |
| <code class=proc-def>length+ </code><var>clist -> integer or #f</var>
 | |
| <dd class=proc-def>
 | |
|     Both <code>length</code> and <code>length+</code> return the length of the argument.
 | |
|     It is an error to pass a value to <code>length</code> which is not a proper
 | |
|     list (finite and nil-terminated). In particular, this means an
 | |
|     implementation may diverge or signal an error when <code>length</code> is
 | |
|     applied to a circular list.
 | |
| <p>    
 | |
|     <code>length+</code>, on the other hand, returns <code>#F</code> when applied to a circular
 | |
|     list.
 | |
| <p>    
 | |
|     The length of a proper list is a non-negative integer <var>n</var> such that <code>cdr</code> 
 | |
|     applied <var>n</var> times to the list produces the empty list.
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== append append!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="append"></a>
 | |
| <code class=proc-def>append </code><var> list<sub>1</sub> ... -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="append!"></a>
 | |
| <code class=proc-def>append!</code><var> list<sub>1</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
|     <code>append</code> returns a list consisting of the elements 
 | |
|     of <var>list<sub>1</sub></var>
 | |
|     followed by the elements of the other list parameters.
 | |
| <pre class=code-example>
 | |
| (append '(x) '(y))        =>  (x y)
 | |
| (append '(a) '(b c d))    =>  (a b c d)
 | |
| (append '(a (b)) '((c)))  =>  (a (b) (c))
 | |
| </pre>
 | |
|     The resulting list is always newly allocated, except that it
 | |
|     shares structure with the final <var>list<sub>i</sub></var> argument.  
 | |
|     This last argument may be any value at all; 
 | |
|     an improper list results if it is not
 | |
|     a proper list. All other arguments must be proper lists.
 | |
| <pre class=code-example>
 | |
| (append '(a b) '(c . d))  =>  (a b c . d)
 | |
| (append '() 'a)           =>  a
 | |
| (append '(x y))           =>  (x y)
 | |
| (append)                  =>  ()
 | |
| </pre>
 | |
| 
 | |
|     <code>append!</code> is the "linear-update" variant of <code>append</code>
 | |
|     -- it is allowed, but not required, to alter cons cells in the argument
 | |
|     lists to construct the result list. 
 | |
|     The last argument is never altered; the result
 | |
|     list shares structure with this parameter.
 | |
| 
 | |
| <!--
 | |
| ==== concatenate concatenate!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="concatenate"></a>
 | |
| <code class=proc-def>concatenate </code><var> list-of-lists -> value</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="concatenate!"></a>
 | |
| <code class=proc-def>concatenate!</code><var> list-of-lists -> value</var>
 | |
| <dd class=proc-def>
 | |
|     These functions append the elements of their argument together.
 | |
|     That is, <code>concatenate</code> returns
 | |
| <pre class=code-example>
 | |
| (apply append list-of-lists)
 | |
| </pre>
 | |
|     or, equivalently,
 | |
| <pre class=code-example>
 | |
| (reduce-right append '() list-of-lists)
 | |
| </pre>
 | |
| 
 | |
|     <code>concatenate!</code> is the linear-update variant, defined in
 | |
|     terms of <code>append!</code> instead of <code>append</code>.
 | |
|     
 | |
| <p>
 | |
|     Note that some Scheme implementations do not support passing more than a
 | |
|     certain number (<em>e.g.</em>, 64) of arguments to an n-ary procedure.  
 | |
|     In these implementations, the <code>(apply append ...)</code> idiom
 | |
|     would fail when applied to long lists, 
 | |
|     but <code>concatenate</code> would continue to function properly.
 | |
| 
 | |
| <p>
 | |
|     As with <code>append</code> and <code>append!</code>, 
 | |
|     the last element of the input list may be any value at all.
 | |
| 
 | |
| <!--
 | |
| ==== reverse reverse!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="reverse"></a>
 | |
| <code class=proc-def>reverse </code><var> list -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="reverse!"></a>
 | |
| <code class=proc-def>reverse!</code><var> list -> list</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
| 
 | |
|     <code>reverse</code> returns a newly allocated list consisting of
 | |
|     the elements of <var>list</var> in reverse order.
 | |
| <pre class=code-example>
 | |
| (reverse '(a b c)) =>  (c b a)
 | |
| (reverse '(a (b c) d (e (f))))
 | |
|     =>  ((e (f)) d (b c) a)
 | |
| </pre>
 | |
|     <code>reverse!</code> is the linear-update variant of <code>reverse</code>.
 | |
|     It is permitted, but not required, to alter the argument's cons cells 
 | |
|     to produce the reversed list.
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== append-reverse!
 | |
| ==== append-reverse
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="append-reverse"></a>
 | |
| <code class=proc-def>append-reverse  </code><var>rev-head tail -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="append-reverse!"></a>
 | |
| <code class=proc-def>append-reverse! </code><var>rev-head tail -> list</var>
 | |
| <dd class=proc-def>
 | |
|     <code>append-reverse</code> returns
 | |
| 	<code>(append (reverse <var>rev-head</var>) <var>tail</var>)</code>.
 | |
|     It is provided because it is a common operation -- a common
 | |
|     list-processing style calls for this exact operation to transfer values
 | |
|     accumulated in reverse order onto the front of another list, and because
 | |
|     the implementation is significantly more efficient than the simple
 | |
|     composition it replaces. (But note that this pattern of iterative 
 | |
|     computation followed by a reverse can frequently be rewritten as a 
 | |
|     recursion, dispensing with the <code>reverse</code> and <code>append-reverse</code> steps, and 
 | |
|     shifting temporary, intermediate storage from the heap to the stack, 
 | |
|     which is typically a win for reasons of cache locality and eager storage 
 | |
|     reclamation.)
 | |
| <p>
 | |
|     <code>append-reverse!</code> is just the linear-update variant -- it is allowed, but
 | |
|     not required, to alter <var>rev-head</var>'s cons cells to construct the result.
 | |
| 
 | |
| <!--
 | |
| ==== zip
 | |
| ============================================================================-->
 | |
| <a name="zip"></a>
 | |
| <dt class=proc-def><code class=proc-def>zip</code> <var>clist<sub>1</sub> clist<sub>2</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
| <pre>(lambda lists (apply map list lists))
 | |
| </pre>
 | |
|     If <code>zip</code> is passed <var>n</var> lists, it returns a list as long as the shortest
 | |
|     of these lists, each element of which is an <var>n</var>-element list comprised
 | |
|     of the corresponding elements from the parameter lists.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (zip '(one two three) 
 | |
|      '(1 2 3)
 | |
|      '(odd even odd even odd even odd even))
 | |
|     => ((one 1 odd) (two 2 even) (three 3 odd))
 | |
| 
 | |
| (zip '(1 2 3)) => ((1) (2) (3))
 | |
| </pre>
 | |
|     At least one of the argument lists must be finite:
 | |
| <pre class=code-example>
 | |
| (zip '(3 1 4 1) (circular-list #f #t)) 
 | |
|     => ((3 #f) (1 #t) (4 #f) (1 #t))
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== unzip5
 | |
| ==== unzip4
 | |
| ==== unzip3
 | |
| ==== unzip2
 | |
| ==== unzip1
 | |
| ============================================================================-->
 | |
| <a name="unzip1"></a>
 | |
| <dt class=proc-def1>  <code class=proc-def>unzip1</code><var> list -> list</var>
 | |
| <a name="unzip2"></a>
 | |
| <dt class=proc-defi> <code class=proc-def>unzip2</code><var> list -> [list list]</var>
 | |
| <a name="unzip3"></a>
 | |
| <dt class=proc-defi> <code class=proc-def>unzip3</code><var> list -> [list list list]</var>
 | |
| <a name="unzip4"></a>
 | |
| <dt class=proc-defi> <code class=proc-def>unzip4</code><var> list -> [list list list list]</var>
 | |
| <a name="unzip5"></a>
 | |
| <dt class=proc-defn> <code class=proc-def>unzip5</code><var> list -> [list list list list list]</var>
 | |
| <dd class=proc-def>
 | |
|     <code>unzip1</code> takes a list of lists, 
 | |
|     where every list must contain at least one element, 
 | |
|     and returns a list containing the initial element of each such list. 
 | |
|     That is, it returns <code>(map car lists)</code>.  
 | |
|     <code>unzip2</code> takes a list of lists, where every list must contain at least
 | |
|     two elements, and returns two values: a list of the first elements,
 | |
|     and a list of the second elements. <code>unzip3</code> does the same for the first
 | |
|     three elements of the lists, and so forth.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (unzip2 '((1 one) (2 two) (3 three))) =>
 | |
|     (1 2 3) 
 | |
|     (one two three)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== count
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="count"></a>
 | |
| <code class=proc-def>count</code><var> pred clist<sub>1</sub> clist<sub>2</sub> -> integer</var>
 | |
| <dd class=proc-def>
 | |
|     <var>pred</var> is a procedure taking as many arguments as there
 | |
|     are lists and returning a single value. It is applied 
 | |
|     element-wise to the elements of the <var>list</var>s, and a count is
 | |
|     tallied of the number of elements that produce a true value. This count
 | |
|     is returned. <code>count</code> is "iterative" in that it is guaranteed
 | |
|     to apply <var>pred</var> to the <var>list</var> elements in a
 | |
|     left-to-right order.
 | |
|     The counting stops when the shortest list expires.
 | |
| <pre class=code-example>
 | |
| (count even? '(3 1 4 1 5 9 2 5 6)) => 3
 | |
| (count < '(1 2 4 8) '(2 4 6 8 10 12 14 16)) => 3
 | |
| </pre>
 | |
|     At least one of the argument lists must be finite:
 | |
| <pre class=code-example>
 | |
| (count < '(3 1 4 1) (circular-list 1 10)) => 2
 | |
| </pre>
 | |
| 
 | |
| </dl>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="FoldUnfoldMap">Fold, unfold & map</a></h2>
 | |
| <dl>
 | |
| <!--
 | |
| ==== fold
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="fold"></a>
 | |
| <code class=proc-def>fold</code><var> kons knil clist<sub>1</sub> clist<sub>2</sub> ... -> value</var>
 | |
| <dd class=proc-def>
 | |
|     The fundamental list iterator. 
 | |
| <p>
 | |
|     First, consider the single list-parameter case. If <var>clist<sub>1</sub></var> = (<var>e<sub>1</sub></var> <var>e<sub>2</sub></var> ... <var>e<sub>n</sub></var>),
 | |
|     then this procedure returns
 | |
| <div class=indent>
 | |
| <code>(<var>kons</var> <var>e<sub>n</sub></var> ... (<var>kons</var> <var>e<sub>2</sub></var> (<var>kons</var> <var>e<sub>1</sub></var> <var>knil</var>)) ... )</code>
 | |
| </div>
 | |
|     That is, it obeys the (tail) recursion
 | |
| <pre class=code-example>
 | |
| (fold <var>kons</var> <var>knil</var> <var>lis</var>) = (fold <var>kons</var> (<var>kons</var> (car <var>lis</var>) <var>knil</var>) (cdr <var>lis</var>))
 | |
| (fold <var>kons</var> <var>knil</var> '()) = <var>knil</var>
 | |
| </pre>
 | |
| 
 | |
|     Examples:
 | |
| <pre class=code-example>
 | |
| (fold + 0 lis)			; Add up the elements of LIS.
 | |
| 
 | |
| (fold cons '() lis)		; Reverse LIS.
 | |
| 
 | |
| (fold cons tail rev-head)	; See APPEND-REVERSE.
 | |
| 
 | |
| ;; How many symbols in LIS?
 | |
| (fold (lambda (x count) (if (symbol? x) (+ count 1) count))
 | |
|       0
 | |
|       lis)
 | |
| 
 | |
| ;; Length of the longest string in LIS:
 | |
| (fold (lambda (s max-len) (max max-len (string-length s)))
 | |
|       0
 | |
|       lis)
 | |
| </pre>
 | |
| 
 | |
|     If <var>n</var> list arguments are provided, then the <var>kons</var> function must take
 | |
|     <var>n</var>+1 parameters: one element from each list, and the "seed" or fold
 | |
|     state, which is initially <var>knil</var>. The fold operation terminates when
 | |
|     the shortest list runs out of values:
 | |
| <pre class=code-example>
 | |
| (fold cons* '() '(a b c) '(1 2 3 4 5)) => (c 3 b 2 a 1)
 | |
| </pre>
 | |
|     At least one of the list arguments must be finite.
 | |
| 
 | |
| <!--
 | |
| ==== fold-right
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="fold-right"></a>
 | |
| <code class=proc-def>fold-right</code><var> kons knil clist<sub>1</sub> clist<sub>2</sub> ... -> value</var>
 | |
| <dd class=proc-def>
 | |
|     The fundamental list recursion operator. 
 | |
| <p>
 | |
|     First, consider the single list-parameter case. If <var>clist<sub>1</sub></var> = <code>(<var>e<sub>1</sub></var> <var>e<sub>2</sub></var> ... <var>e<sub>n</sub></var>)</code>, 
 | |
|     then this procedure returns
 | |
| <div class=indent><code>
 | |
| (<var>kons</var> <var>e<sub>1</sub></var> (<var>kons</var> <var>e<sub>2</sub></var> ... (<var>kons</var> <var>e<sub>n</sub></var> <var>knil</var>)))
 | |
| </code></div>
 | |
|     That is, it obeys the recursion
 | |
| <pre class=code-example>
 | |
| (fold-right <var>kons</var> <var>knil</var> <var>lis</var>) = (<var>kons</var> (car <var>lis</var>) (fold-right <var>kons</var> <var>knil</var> (cdr <var>lis</var>)))
 | |
| (fold-right <var>kons</var> <var>knil</var> '()) = <var>knil</var>
 | |
| </pre>
 | |
|         
 | |
|     Examples:
 | |
| <pre class=code-example>
 | |
| (fold-right cons '() lis)		; Copy LIS.
 | |
| 
 | |
| ;; Filter the even numbers out of LIS.
 | |
| (fold-right (lambda (x l) (if (even? x) (cons x l) l)) '() lis))
 | |
| </pre>
 | |
| 
 | |
|     If <var>n</var> list arguments are provided, then the <var>kons</var> function must take
 | |
|     <var>n</var>+1 parameters: one element from each list, and the "seed" or fold
 | |
|     state, which is initially <var>knil</var>. The fold operation terminates when
 | |
|     the shortest list runs out of values:
 | |
| <pre class=code-example>
 | |
| (fold-right cons* '() '(a b c) '(1 2 3 4 5)) => (a 1 b 2 c 3)
 | |
| </pre>
 | |
|     At least one of the list arguments must be finite.
 | |
| 
 | |
| <!--
 | |
| ==== pair-fold
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="pair-fold"></a>
 | |
| <code class=proc-def>pair-fold</code><var> kons knil clist<sub>1</sub> clist<sub>2</sub> ... -> value</var>
 | |
| <dd class=proc-def>
 | |
|     Analogous to <code>fold</code>, but <var>kons</var> is applied to successive sublists of the 
 | |
|     lists, rather than successive elements -- that is, <var>kons</var> is applied to the
 | |
|     pairs making up the lists, giving this (tail) recursion:
 | |
| <pre class=code-example>
 | |
| (pair-fold <var>kons</var> <var>knil</var> <var>lis</var>) = (let ((tail (cdr <var>lis</var>)))
 | |
|                               (pair-fold <var>kons</var> (<var>kons</var> <var>lis</var> <var>knil</var>) tail))
 | |
| (pair-fold <var>kons</var> <var>knil</var> <code>'()</code>) = <var>knil</var>
 | |
| </pre>
 | |
|     For finite lists, the <var>kons</var> function may reliably apply
 | |
|     <code>set-cdr!</code> to the pairs it is given
 | |
|     without altering the sequence of execution.
 | |
| <p>
 | |
|     Example:
 | |
| <pre class=code-example>
 | |
| ;;; Destructively reverse a list.
 | |
| (pair-fold (lambda (pair tail) (set-cdr! pair tail) pair) '() lis))
 | |
| </pre>
 | |
| 
 | |
|     At least one of the list arguments must be finite.
 | |
| 
 | |
|     
 | |
| <!--
 | |
| ==== pair-fold-right
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="pair-fold-right"></a>
 | |
| <code class=proc-def>pair-fold-right</code><var> kons knil clist<sub>1</sub> clist<sub>2</sub> ... -> value</var>
 | |
| <dd class=proc-def>
 | |
|     Holds the same relationship with <code>fold-right</code> that <code>pair-fold</code> holds with <code>fold</code>.
 | |
|     Obeys the recursion
 | |
| <pre class=code-example>
 | |
| (pair-fold-right <var>kons</var> <var>knil</var> <var>lis</var>) = 
 | |
|     (<var>kons</var> <var>lis</var> (pair-fold-right <var>kons</var> <var>knil</var> (cdr <var>lis</var>)))
 | |
| (pair-fold-right <var>kons</var> <var>knil</var> <code>'()</code>) = <var>knil</var>
 | |
| </pre>
 | |
|     
 | |
|     Example:
 | |
| <pre class=code-example>
 | |
| (pair-fold-right cons '() '(a b c)) => ((a b c) (b c) (c))
 | |
| </pre>
 | |
| 
 | |
|     At least one of the list arguments must be finite.
 | |
| 
 | |
| <!--
 | |
| ==== reduce
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="reduce"></a>
 | |
| <code class=proc-def>reduce</code><var> f ridentity list -> value</var>
 | |
| <dd class=proc-def>
 | |
|     <code>reduce</code> is a variant of <code>fold</code>. 
 | |
| <p>
 | |
|     <var>ridentity</var> should be a "right identity" of the procedure <var>f</var> -- that is, 
 | |
|     for any value <var>x</var> acceptable to <var>f</var>,
 | |
| <pre class=code-example>
 | |
| (<var>f</var> <var>x</var> <var>ridentity</var>) = <var>x</var>
 | |
| </pre>
 | |
|     
 | |
|     <code>reduce</code> has the following definition:
 | |
| <div class=indent>
 | |
| If <var>list</var> = (),  return <var>ridentity</var>;<br>
 | |
| Otherwise,    return <code>(fold <var>f</var> (car <var>list</var>) (cdr <var>list</var>))</code>.
 | |
| </div>
 | |
|     ...in other words, we compute 
 | |
|     <code>(fold <var>f</var> <var>ridentity</var> <var>list</var>)</code>.
 | |
| <p>
 | |
|     Note that <var>ridentity</var> is used <em>only</em> in the empty-list case.
 | |
|     You typically use <code>reduce</code> when applying <var>f</var> is expensive and you'd
 | |
|     like to avoid the extra application incurred when <code>fold</code> applies
 | |
|     <var>f</var> to the head of <var>list</var> and the identity value,
 | |
|     redundantly producing the same value passed in to <var>f</var>. 
 | |
|     For example, if <var>f</var> involves searching a file directory or 
 | |
|     performing a database query, this can be significant. 
 | |
|     In general, however, <code>fold</code> is useful in many contexts where <code>reduce</code> is not
 | |
|     (consider the examples given in the <code>fold</code> definition -- only one of the
 | |
|     five folds uses a function with a right identity. 
 | |
|     The other four may not be performed with <code>reduce</code>).
 | |
| 
 | |
| <p>
 | |
|     Note: MIT Scheme and Haskell flip F's arg order for their <code>reduce</code> and
 | |
|     <code>fold</code> functions.
 | |
| 
 | |
| <pre class=code-example>
 | |
| ;; Take the max of a list of non-negative integers.
 | |
| (reduce max 0 nums) ; i.e., (apply max 0 nums)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== reduce-right
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="reduce-right"></a>
 | |
| <code class=proc-def>reduce-right</code><var> f ridentity list -> value</var>
 | |
| <dd class=proc-def>
 | |
|     <code>reduce-right</code> is the fold-right variant of <code>reduce</code>.
 | |
|     It obeys the following definition:
 | |
| <pre class=code-example>
 | |
| (reduce-right <var>f</var> <var>ridentity</var> '()) = <var>ridentity</var>
 | |
| (reduce-right <var>f</var> <var>ridentity</var> '(<var>e<sub>1</sub></var>)) = (<var>f</var> <var>e<sub>1</sub></var> <var>ridentity</var>) = <var>e<sub>1</sub></var>
 | |
| (reduce-right <var>f</var> <var>ridentity</var> '(<var>e<sub>1</sub></var> <var>e<sub>2</sub></var> ...)) =
 | |
|     (<var>f</var> <var>e<sub>1</sub></var> (reduce <var>f</var> <var>ridentity</var> (<var>e<sub>2</sub></var> ...)))
 | |
| </pre>
 | |
|     ...in other words, we compute 
 | |
|     <code>(fold-right <var>f</var> <var>ridentity</var> <var>list</var>)</code>.
 | |
|     
 | |
| <pre class=code-example>
 | |
| ;; Append a bunch of lists together.
 | |
| ;; I.e., (apply append list-of-lists)
 | |
| (reduce-right append '() list-of-lists)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== unfold
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="unfold"></a>
 | |
| <code class=proc-def>unfold</code><var> p f g seed [tail-gen] -> list</var>
 | |
| <dd class=proc-def>
 | |
| <code>unfold</code> is best described by its basic recursion:
 | |
| <pre class=code-example>
 | |
| (unfold <var>p</var> <var>f</var> <var>g</var> <var>seed</var>) = 
 | |
|     (if (<var>p</var> <var>seed</var>) (<var>tail-gen</var> <var>seed</var>)
 | |
|         (cons (<var>f</var> <var>seed</var>)
 | |
|               (unfold <var>p</var> <var>f</var> <var>g</var> (<var>g</var> <var>seed</var>))))
 | |
| </pre>
 | |
| <dl>
 | |
| <dt> <var>p</var> <dd> Determines when to stop unfolding.
 | |
| <dt> <var>f</var> <dd> Maps each seed value to the corresponding list element.
 | |
| <dt> <var>g</var> <dd> Maps each seed value to next seed value.
 | |
| <dt> <var>seed</var> <dd> The "state" value for the unfold.
 | |
| <dt> <var>tail-gen</var> <dd> Creates the tail of the list; 
 | |
|                               defaults to <code>(lambda (x) '())</code>
 | |
| </dl>
 | |
| <p>
 | |
|     In other words, we use <var>g</var> to generate a sequence of seed values
 | |
| <div class=indent>
 | |
| <var>seed</var>, <var>g</var>(<var>seed</var>), <var>g<sup>2</sup></var>(<var>seed</var>), <var>g<sup>3</sup></var>(<var>seed</var>), ...
 | |
| </div>
 | |
|     These seed values are mapped to list elements by <var>f</var>, 
 | |
|     producing the elements of the result list in a left-to-right order. 
 | |
|     <var>P</var> says when to stop.
 | |
| 
 | |
| <p>
 | |
|     <code>unfold</code> is the fundamental recursive list constructor, 
 | |
|     just as <code>fold-right</code> is 
 | |
|     the fundamental recursive list consumer.
 | |
|     While <code>unfold</code> may seem a bit abstract
 | |
|     to novice functional programmers, it can be used in a number of ways:
 | |
| 
 | |
| <pre class=code-example>
 | |
| ;; List of squares: 1^2 ... 10^2
 | |
| (unfold (lambda (x) (> x 10))
 | |
|         (lambda (x) (* x x))
 | |
| 	(lambda (x) (+ x 1))
 | |
| 	1)
 | |
| 		
 | |
| (unfold null-list? car cdr lis) ; Copy a proper list.
 | |
| 
 | |
| ;; Read current input port into a list of values.
 | |
| (unfold eof-object? values (lambda (x) (read)) (read))
 | |
| 
 | |
| ;; Copy a possibly non-proper list:
 | |
| (unfold not-pair? car cdr lis 
 | |
|               values)
 | |
| 
 | |
| ;; Append HEAD onto TAIL:
 | |
| (unfold null-list? car cdr head 
 | |
|               (lambda (x) tail))
 | |
| </pre>
 | |
| 
 | |
|     Interested functional programmers may enjoy noting that 
 | |
|     <code>fold-right</code> and <code>unfold</code>
 | |
|     are in some sense inverses. 
 | |
|     That is, given operations <var>knull?</var>, <var>kar</var>, 
 | |
|     <var>kdr</var>, <var>kons</var>, and <var>knil</var> satisfying
 | |
| <div class=indent>
 | |
| <code>(<var>kons</var> (<var>kar</var> <var>x</var>) (<var>kdr</var> <var>x</var>))</code> = <code>x</code>
 | |
|     and 
 | |
| <code>(<var>knull?</var> <var>knil</var>)</code> = <code>#t</code>
 | |
| </div>
 | |
|     then
 | |
| <div class=indent>
 | |
| <code>(fold-right <var>kons</var> <var>knil</var> (unfold <var>knull?</var> <var>kar</var> <var>kdr</var> <var>x</var>))</code> = <var>x</var>
 | |
| </div>
 | |
|     and
 | |
| <div class=indent>
 | |
| <code>(unfold <var>knull?</var> <var>kar</var> <var>kdr</var> (fold-right <var>kons</var> <var>knil</var> <var>x</var>))</code> = <var>x</var>.
 | |
| </div>
 | |
| 
 | |
|     This combinator sometimes is called an "anamorphism;" when an
 | |
|     explicit <var>tail-gen</var> procedure is supplied, it is called an
 | |
|     "apomorphism."
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== unfold-right
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="unfold-right"></a>
 | |
| <code class=proc-def>unfold-right</code><var> p f g seed [tail] -> list</var>
 | |
| <dd class=proc-def>
 | |
|     <code>unfold-right</code> constructs a list with the following loop:
 | |
| <pre class=code-example>
 | |
| (let lp ((seed seed) (lis tail))
 | |
|   (if (p seed) lis
 | |
|       (lp (g seed)
 | |
|           (cons (f seed) lis))))
 | |
| </pre>
 | |
| <dl>
 | |
| <dt> <var>p</var> <dd> Determines when to stop unfolding.
 | |
| <dt> <var>f</var> <dd> Maps each seed value to the corresponding list element.
 | |
| <dt> <var>g</var> <dd> Maps each seed value to next seed value.
 | |
| <dt> <var>seed</var> <dd> The "state" value for the unfold.
 | |
| <dt> <var>tail</var> <dd> list terminator; defaults to <code>'()</code>.
 | |
| </dl>
 | |
| <p>
 | |
|     In other words, we use <var>g</var> to generate a sequence of seed values
 | |
| <div class=indent>
 | |
| <var>seed</var>, <var>g</var>(<var>seed</var>), <var>g<sup>2</sup></var>(<var>seed</var>), <var>g<sup>3</sup></var>(<var>seed</var>), ...
 | |
| </div>
 | |
|     These seed values are mapped to list elements by <var>f</var>, 
 | |
|     producing the elements of the result list in a right-to-left order. 
 | |
|     <var>P</var> says when to stop.
 | |
| 
 | |
| <p>
 | |
|     <code>unfold-right</code> is the fundamental iterative list constructor, 
 | |
|     just as <code>fold</code> is the
 | |
|     fundamental iterative list consumer. 
 | |
|     While <code>unfold-right</code> may seem a bit abstract
 | |
|     to novice functional programmers, it can be used in a number of ways:
 | |
| <pre class=code-example>
 | |
| ;; List of squares: 1^2 ... 10^2
 | |
| (unfold-right zero? 
 | |
|               (lambda (x) (* x x))
 | |
|               (lambda (x) (- x 1))
 | |
|               10)
 | |
| 	
 | |
| ;; Reverse a proper list.
 | |
| (unfold-right null-list? car cdr lis)
 | |
| 
 | |
| ;; Read current input port into a list of values.
 | |
| (unfold-right eof-object? values (lambda (x) (read)) (read))
 | |
| 
 | |
| ;; (append-reverse rev-head tail)
 | |
| (unfold-right null-list? car cdr rev-head tail)
 | |
| </pre>
 | |
| 
 | |
|     Interested functional programmers may enjoy noting that 
 | |
|     <code>fold</code> and <code>unfold-right</code>
 | |
|     are in some sense inverses. 
 | |
|     That is, given operations <var>knull?</var>, <var>kar</var>, 
 | |
|     <var>kdr</var>, <var>kons</var>, and <var>knil</var> satisfying
 | |
| <div class=indent>
 | |
| <code>(<var>kons</var> (<var>kar</var> <var>x</var>) (<var>kdr</var> <var>x</var>))</code> = <code>x</code>
 | |
|     and 
 | |
| <code>(<var>knull?</var> <var>knil</var>)</code> = <code>#t</code>
 | |
| </div>
 | |
|     then
 | |
| <div class=indent>
 | |
| <code>(fold <var>kons</var> <var>knil</var> (unfold-right <var>knull?</var> <var>kar</var> <var>kdr</var> <var>x</var>))</code> = <var>x</var>
 | |
| </div>
 | |
|     and
 | |
| <div class=indent>
 | |
| <code>(unfold-right <var>knull?</var> <var>kar</var> <var>kdr</var> (fold <var>kons</var> <var>knil</var> <var>x</var>))</code> = <var>x</var>.
 | |
| </div>
 | |
| 
 | |
|     This combinator presumably has some pretentious mathematical name;
 | |
|     interested readers are invited to communicate it to the author.
 | |
| 
 | |
| <!--
 | |
| ==== map
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="map"></a>
 | |
| <code class=proc-def>map</code><var> proc clist<sub>1</sub> clist<sub>2</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>+]
 | |
| 
 | |
|      <var>proc</var> is a procedure taking as many arguments 
 | |
|      as there are list arguments and returning a single value.  
 | |
|      <code>map</code> applies <var>proc</var> element-wise to the elements
 | |
|      of the lists and returns a list of the results, 
 | |
|      in order.  
 | |
|      The dynamic order in which <var>proc</var> 
 | |
|      is applied to the elements of the lists is unspecified.
 | |
|     
 | |
| <pre class=code-example>
 | |
| (map cadr '((a b) (d e) (g h))) =>  (b e h)
 | |
| 
 | |
| (map (lambda (n) (expt n n))
 | |
|      '(1 2 3 4 5))
 | |
|     =>  (1 4 27 256 3125)
 | |
| 
 | |
| (map + '(1 2 3) '(4 5 6)) =>  (5 7 9)
 | |
| 
 | |
| (let ((count 0))
 | |
|   (map (lambda (ignored)
 | |
|          (set! count (+ count 1))
 | |
|          count)
 | |
|        '(a b))) =>  (1 2) <em>or</em> (2 1)
 | |
| </pre>
 | |
| 
 | |
|     This procedure is extended from its 
 | |
|     <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>
 | |
|     specification to allow the arguments to be of unequal length; 
 | |
|     it terminates when the shortest list runs out. 
 | |
| <p>
 | |
|     At least one of the argument lists must be finite:
 | |
| <pre class=code-example>
 | |
| (map + '(3 1 4 1) (circular-list 1 0)) => (4 1 5 1)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== for-each
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="for-each"></a>
 | |
| <code class=proc-def>for-each</code><var> proc clist<sub>1</sub> clist<sub>2</sub> ... -> unspecified</var>
 | |
| <dd class=proc-def>
 | |
|      [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>+]
 | |
| 
 | |
|      The arguments to <code>for-each</code> are like the arguments to 
 | |
|      <code>map</code>, but
 | |
|      <code>for-each</code> calls <var>proc</var> for its side effects rather
 | |
|      than for its values.  
 | |
|      Unlike <code>map</code>, <code>for-each</code> is guaranteed to call 
 | |
|      <var>proc</var> on the elements of the lists in order from the first
 | |
|      element(s) to the last, 
 | |
|      and the value returned by <code>for-each</code> is unspecified.
 | |
| <pre class=code-example>
 | |
| (let ((v (make-vector 5)))
 | |
|   (for-each (lambda (i)
 | |
|               (vector-set! v i (* i i)))
 | |
|             '(0 1 2 3 4))
 | |
|   v)  =>  #(0 1 4 9 16)
 | |
| </pre>
 | |
|     
 | |
|     This procedure is extended from its
 | |
|     <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>
 | |
|     specification to allow the arguments to be of unequal length; 
 | |
|     it terminates when the shortest list runs out. 
 | |
| <p>
 | |
|     At least one of the argument lists must be finite.
 | |
| 
 | |
| <!--
 | |
| ==== append-map!
 | |
| ==== append-map
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="append-map"></a>
 | |
| <code class=proc-def>append-map  </code><var>f clist<sub>1</sub> clist<sub>2</sub> ... -> value</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="append-map!"></a>
 | |
| <code class=proc-def>append-map! </code><var>f clist<sub>1</sub> clist<sub>2</sub> ... -> value</var>
 | |
| <dd class=proc-def>
 | |
|     Equivalent to 
 | |
| <div class=indent><code>
 | |
| (apply append  (map <var>f</var> <var>clist<sub>1</sub></var> <var>clist<sub>2</sub></var> ...))
 | |
| </code></div>
 | |
|     and
 | |
| <div class=indent><code>
 | |
| (apply append! (map <var>f</var> <var>clist<sub>1</sub></var> <var>clist<sub>2</sub></var> ...))
 | |
| </code></div>
 | |
| 
 | |
|     Map <var>f</var> over the elements of the lists, just as in the <code>map</code> function.
 | |
|     However, the results of the applications are appended together to
 | |
|     make the final result. <code>append-map</code> uses <code>append</code> to append the results
 | |
|     together; <code>append-map!</code> uses <code>append!</code>.
 | |
| <p>
 | |
|     The dynamic order in which the various applications of <var>f</var> are made is
 | |
|     not specified.
 | |
| <p>
 | |
|     Example:
 | |
| <pre class=code-example>
 | |
| (append-map! (lambda (x) (list x (- x))) '(1 3 8))
 | |
|     => (1 -1 3 -3 8 -8)
 | |
| </pre>
 | |
| 
 | |
|     At least one of the list arguments must be finite.
 | |
| 
 | |
| <!--
 | |
| ==== map!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="map!"></a>
 | |
| <code class=proc-def>map!</code><var> f list<sub>1</sub> clist<sub>2</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Linear-update variant of <code>map</code> -- <code>map!</code> is allowed, but not required, to 
 | |
|     alter the cons cells of <var>list<sub>1</sub></var> to construct the result list.
 | |
| <p>
 | |
|     The dynamic order in which the various applications of <var>f</var> are made is
 | |
|     not specified.
 | |
|     
 | |
|     In the n-ary case, <var>clist<sub>2</sub></var>, <var>clist<sub>3</sub></var>, ... must have at least as many
 | |
|     elements as <var>list<sub>1</sub></var>.
 | |
| 
 | |
| <!--
 | |
| ==== map-in-order
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="map-in-order"></a>
 | |
| <code class=proc-def>map-in-order </code><var>f</var> <var>clist<sub>1</sub> clist<sub>2</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     A variant of the <code>map</code> procedure that guarantees to apply <var>f</var> across
 | |
|     the elements of the <var>list<sub>i</sub></var> arguments in a left-to-right order. This
 | |
|     is useful for mapping procedures that both have side effects and
 | |
|     return useful values.
 | |
| <p>
 | |
|     At least one of the list arguments must be finite.
 | |
| 
 | |
| <!--
 | |
| ==== pair-for-each
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="pair-for-each"></a>
 | |
| <code class=proc-def>pair-for-each </code><var>f clist<sub>1</sub> clist<sub>2</sub> ... -> unspecific</var>
 | |
| <dd class=proc-def>
 | |
|     Like <code>for-each</code>, but <var>f</var> is applied to successive sublists of the argument
 | |
|     lists. That is, <var>f</var> is applied to the cons cells of the lists, rather
 | |
|     than the lists' elements. These applications occur in left-to-right
 | |
|     order.
 | |
| <p>
 | |
|     The <var>f</var> procedure may reliably apply <code>set-cdr!</code> to the pairs it is given
 | |
|     without altering the sequence of execution.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (pair-for-each (lambda (pair) (display pair) (newline)) '(a b c)) ==>
 | |
|     (a b c)
 | |
|     (b c)
 | |
|     (c)
 | |
| </pre>
 | |
| 
 | |
|     At least one of the list arguments must be finite.
 | |
| 
 | |
| <!--
 | |
| ==== filter-map
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="filter-map"></a>
 | |
| <code class=proc-def>filter-map</code><var> f clist<sub>1</sub> clist<sub>2</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Like <code>map</code>, but only true values are saved.
 | |
| <pre class=code-example>
 | |
| (filter-map (lambda (x) (and (number? x) (* x x))) '(a 1 b 3 c 7))
 | |
|     => (1 9 49)
 | |
| </pre>
 | |
|     The dynamic order in which the various applications of <var>f</var> are made is
 | |
|     not specified.
 | |
| <p>
 | |
|     At least one of the list arguments must be finite.
 | |
| </dl>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="FilteringPartitioning">Filtering & partitioning</a></h2>
 | |
| <dl>
 | |
| 
 | |
| <!--
 | |
| ==== filter
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="filter"></a>
 | |
| <code class=proc-def>filter</code><var> pred list -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Return all the elements of <var>list</var> that satisfy predicate <var>pred</var>.
 | |
|     The list is not disordered -- elements that appear in the result list
 | |
|     occur in the same order as they occur in the argument list.
 | |
|     The returned list may share a common tail with the argument list.
 | |
|     The dynamic order in which the various applications of <var>pred</var> are made is
 | |
|     not specified.
 | |
|     
 | |
| <pre class=code-example>
 | |
| (filter even? '(0 7 8 8 43 -4)) => (0 8 8 -4)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== partition
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="partition"></a>
 | |
| <code class=proc-def>partition</code><var> pred list -> [list list]</var>
 | |
| <dd class=proc-def>
 | |
|     Partitions the elements of <var>list</var> with predicate <var>pred</var>, and returns two
 | |
|     values: the list of in-elements and the list of out-elements.
 | |
|     The list is not disordered -- elements occur in the result lists
 | |
|     in the same order as they occur in the argument list.
 | |
|     The dynamic order in which the various applications of <var>pred</var> are made is
 | |
|     not specified. One of the returned lists may share a common tail with the
 | |
|     argument list.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (partition symbol? '(one 2 3 four five 6)) => 
 | |
|     (one four five)
 | |
|     (2 3 6)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== remove
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="remove"></a>
 | |
| <code class=proc-def>remove</code><var> pred list -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Returns <var>list</var> without the elements that satisfy predicate <var>pred</var>:
 | |
| <pre class=code-example>
 | |
| (lambda (pred list) (filter (lambda (x) (not (pred x))) list))
 | |
| </pre>
 | |
|     The list is not disordered -- elements that appear in the result list
 | |
|     occur in the same order as they occur in the argument list.
 | |
|     The returned list may share a common tail with the argument list.
 | |
|     The dynamic order in which the various applications of <var>pred</var> are made is 
 | |
|     not specified.
 | |
|     
 | |
| <pre class=code-example>
 | |
| (remove even? '(0 7 8 8 43 -4)) => (7 43)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== remove!
 | |
| ==== partition!
 | |
| ==== filter!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="filter!"></a>
 | |
| <code class=proc-def>filter!    </code><var>pred list -> list</var>
 | |
| <dt class=proc-defi>
 | |
| <a name="partition!"></a>
 | |
| <code class=proc-def>partition! </code><var>pred list -> [list list]</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="remove!"></a>
 | |
| <code class=proc-def>remove!    </code><var>pred list -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Linear-update variants of <code>filter</code>, <code>partition</code> and <code>remove</code>.
 | |
|     These procedures are allowed, but not required, to alter the cons cells
 | |
|     in the argument list to construct the result lists.
 | |
| 
 | |
| </dl>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="Searching">Searching</a></h2>
 | |
| <p>
 | |
| 
 | |
| The following procedures all search lists for a leftmost element satisfying
 | |
| some criteria. This means they do not always examine the entire list; thus,
 | |
| there is no efficient way for them to reliably detect and signal an error when
 | |
| passed a dotted or circular list. Here are the general rules describing how
 | |
| these procedures work when applied to different kinds of lists:
 | |
| 
 | |
| <dl>
 | |
|     <dt> Proper lists: 
 | |
|     <dd> The standard, canonical behavior happens in this case.
 | |
| 
 | |
|     <dt> Dotted lists: 
 | |
|     <dd> It is an error to pass these procedures a dotted list
 | |
|                   that does not contain an element satisfying the search
 | |
|                   criteria. That is, it is an error if the procedure has
 | |
|                   to search all the way to the end of the dotted list.
 | |
| 		  However, this <abbr title="Scheme Request for Implementation">SRFI</abbr> does <em>not</em> specify anything at all
 | |
|                   about the behavior of these procedures when passed a
 | |
|                   dotted list containing an element satisfying the search
 | |
|                   criteria. It may finish successfully, signal an error,
 | |
|                   or perform some third action. Different implementations
 | |
|                   may provide different functionality in this case; code
 | |
|                   which is compliant with this <abbr title="Scheme Request for Implementation">SRFI</abbr> may not rely on any
 | |
|                   particular behavior. Future <abbr title="Scheme Request for Implementation">SRFI</abbr>'s may refine SRFI-1
 | |
|                   to define specific behavior in this case.
 | |
|                   <p>
 | |
| 		  In brief, SRFI-1 compliant code may not pass a dotted
 | |
|                   list argument to these procedures.
 | |
| 
 | |
|     <dt> Circular lists: 
 | |
|     <dd> It is an error to pass these procedures a circular list
 | |
|                   that does not contain an element satisfying the search
 | |
|                   criteria. Note that the procedure is not required to 
 | |
|                   detect this case; it may simply diverge. It is, however,
 | |
|                   acceptable to search a circular list <em>if the search is
 | |
|                   successful</em> -- that is, if the list contains an element
 | |
|                   satisfying the search criteria.
 | |
| </dl>
 | |
| <p>
 | |
| Here are some examples, using the <code>find</code> and <code>any</code> procedures as canonical
 | |
| representatives:
 | |
| <pre class=code-example>
 | |
| ;; Proper list -- success
 | |
| (find even? '(1 2 3))	=> 2
 | |
| (any  even? '(1 2 3))	=> #t
 | |
| 
 | |
| ;; proper list -- failure
 | |
| (find even? '(1 7 3))	=> #f
 | |
| (any  even? '(1 7 3))	=> #f
 | |
| 
 | |
| ;; Failure is error on a dotted list.
 | |
| (find even? '(1 3 . x))	=> error
 | |
| (any  even? '(1 3 . x))	=> error
 | |
| 
 | |
| ;; The dotted list contains an element satisfying the search.
 | |
| ;; This case is not specified -- it could be success, an error, 
 | |
| ;; or some third possibility.
 | |
| (find even? '(1 2 . x))	=> error/undefined
 | |
| (any  even? '(1 2 . x))	=> error/undefined ; success, error or other.
 | |
| 
 | |
| ;; circular list -- success
 | |
| (find even? (circular-list 1 6 3)) => 6
 | |
| (any  even? (circular-list 1 6 3)) => #t
 | |
| 
 | |
| ;; circular list -- failure is error. Procedure may diverge.
 | |
| (find even? (circular-list 1 3)) => error
 | |
| (any  even? (circular-list 1 3)) => error
 | |
| </pre>
 | |
| 
 | |
| <dl>
 | |
| <!--
 | |
| ==== find
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="find"></a>
 | |
| <code class=proc-def>find</code><var> pred clist -> value</var>
 | |
| <dd class=proc-def>
 | |
|     Return the first element of <var>clist</var> that satisfies predicate <var>pred</var>;
 | |
|     false if no element does.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (find even? '(3 1 4 1 5 9)) => 4
 | |
| </pre>
 | |
| 
 | |
|     Note that <code>find</code> has an ambiguity in its lookup semantics -- if <code>find</code>
 | |
|     returns <code>#f</code>, you cannot tell (in general) if it found a <code>#f</code> element
 | |
|     that satisfied <var>pred</var>, or if it did not find any element at all. In
 | |
|     many situations, this ambiguity cannot arise -- either the list being
 | |
|     searched is known not to contain any <code>#f</code> elements, or the list is
 | |
|     guaranteed to have an element satisfying <var>pred</var>. However, in cases
 | |
|     where this ambiguity can arise, you should use <code>find-tail</code> instead of
 | |
|     <code>find</code> -- <code>find-tail</code> has no such ambiguity:
 | |
| <pre class=code-example>
 | |
| (cond ((find-tail pred lis) => (lambda (pair) ...)) ; Handle (CAR PAIR)
 | |
|       (else ...)) ; Search failed.
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== find-tail
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="find-tail"></a>
 | |
| <code class=proc-def>find-tail</code><var> pred clist -> pair or false</var>
 | |
| <dd class=proc-def>
 | |
|     Return the first pair of <var>clist</var> whose car satisfies <var>pred</var>. If no pair does,
 | |
|     return false.
 | |
| <p>
 | |
|     <code>find-tail</code> can be viewed as a general-predicate variant of the <code>member</code>
 | |
|     function.
 | |
| <p>
 | |
|     Examples: 
 | |
| <pre class=code-example>
 | |
| (find-tail even? '(3 1 37 -8 -5 0 0)) => (-8 -5 0 0)
 | |
| (find-tail even? '(3 1 37 -5)) => #f
 | |
| 
 | |
| ;; MEMBER X LIS:
 | |
| (find-tail (lambda (elt) (equal? x elt)) lis)
 | |
| </pre>
 | |
| 
 | |
|     In the circular-list case, this procedure "rotates" the list.
 | |
| 
 | |
| <p>
 | |
|     <code>Find-tail</code> is essentially <code>drop-while</code>, 
 | |
|     where the sense of the predicate is inverted: 
 | |
|     <code>Find-tail</code> searches until it finds an element satisfying
 | |
|     the predicate; <code>drop-while</code> searches until it finds an 
 | |
|     element that <em>doesn't</em> satisfy the predicate.
 | |
| 
 | |
| <!--
 | |
| ==== take-while take-while!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="take-while"></a>
 | |
| <code class=proc-def>take-while </code><var> pred clist -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="take-while!"></a>
 | |
| <code class=proc-def>take-while!</code><var> pred clist -> list</var>
 | |
| <dd class=proc-def>
 | |
| 
 | |
| Returns the longest initial prefix of <var>clist</var> whose elements all
 | |
| satisfy the predicate <var>pred</var>.
 | |
| 
 | |
| <p>
 | |
| <code>Take-while!</code> is the linear-update variant. It is allowed, but not
 | |
| required, to alter the argument list to produce the result.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (take-while even? '(2 18 3 10 22 9)) => (2 18)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== drop-while
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="drop-while"></a>
 | |
| <code class=proc-def>drop-while</code><var> pred clist -> list</var>
 | |
| <dd class=proc-def>
 | |
| Drops the longest initial prefix of <var>clist</var> whose elements all
 | |
| satisfy the predicate <var>pred</var>, and returns the rest of the list.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (drop-while even? '(2 18 3 10 22 9)) => (3 10 22 9)
 | |
| </pre>
 | |
| The circular-list case may be viewed as "rotating" the list.
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== span span! break break!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="span"></a>
 | |
| <code class=proc-def>span  </code><var> pred clist -> [list clist]</var>
 | |
| <dt class=proc-defi>
 | |
| <a name="span!"></a>
 | |
| <code class=proc-def>span! </code><var> pred list  -> [list list]</var>
 | |
| <dt class=proc-defi>
 | |
| <a name="break"></a>
 | |
| <code class=proc-def>break </code><var> pred clist -> [list clist]</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="break!"></a>
 | |
| <code class=proc-def>break!</code><var> pred list  -> [list list]</var>
 | |
| <dd class=proc-def>
 | |
| 
 | |
| <code>Span</code> splits the list into the longest initial prefix whose
 | |
| elements all satisfy <var>pred</var>, and the remaining tail. 
 | |
| <code>Break</code> inverts the sense of the predicate: 
 | |
| the tail commences with the first element of the input list
 | |
| that satisfies the predicate.
 | |
| 
 | |
| <p>
 | |
| In other words: 
 | |
| <code>span</code> finds the intial span of elements 
 | |
| satisfying <var>pred</var>, 
 | |
| and <code>break</code> breaks the list at the first element satisfying 
 | |
| <var>pred</var>.
 | |
| 
 | |
| <p>
 | |
| <code>Span</code> is equivalent to 
 | |
| <pre class=code-example>
 | |
| (values (take-while <var>pred</var> <var>clist</var>) 
 | |
|         (drop-while <var>pred</var> <var>clist</var>))
 | |
| </pre>
 | |
| 
 | |
| <p>
 | |
| <code>Span!</code> and <code>break!</code> are the linear-update variants. 
 | |
| They are allowed, but not required, 
 | |
| to alter the argument list to produce the result.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (span even? '(2 18 3 10 22 9)) =>
 | |
|   (2 18)
 | |
|   (3 10 22 9)
 | |
| 
 | |
| (break even? '(3 1 4 1 5 9)) =>
 | |
|   (3 1)
 | |
|   (4 1 5 9)
 | |
| </pre>
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== any
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="any"></a>
 | |
| <code class=proc-def>any</code><var> pred clist<sub>1</sub> clist<sub>2</sub> ... -> value</var>
 | |
| <dd class=proc-def>
 | |
|     Applies the predicate across the lists, returning true if the predicate
 | |
|     returns true on any application.
 | |
| <p>
 | |
|     If there are <var>n</var> list arguments <var>clist<sub>1</sub></var> ... <var>clist<sub>n</sub></var>, then <var>pred</var> must be a
 | |
|     procedure taking <var>n</var> arguments and returning a boolean result.
 | |
| <p>
 | |
|     <code>any</code> applies <var>pred</var> to the first elements of the <var>clist<sub>i</sub></var> parameters.
 | |
|     If this application returns a true value, <code>any</code> immediately returns
 | |
|     that value. Otherwise, it iterates, applying <var>pred</var> to the second
 | |
|     elements of the <var>clist<sub>i</sub></var> parameters, then the third, and so forth.
 | |
|     The iteration stops when a true value is produced or one of the lists runs
 | |
|     out of values; in
 | |
|     the latter case, <code>any</code> returns <code>#f</code>. 
 | |
|     The application of <var>pred</var> to the last element of the
 | |
|     lists is a tail call.
 | |
| <p>
 | |
|     Note the difference between <code>find</code> and <code>any</code> -- <code>find</code> returns the element
 | |
|     that satisfied the predicate; <code>any</code> returns the true value that the
 | |
|     predicate produced.
 | |
| <p>
 | |
|     Like <code>every</code>, <code>any</code>'s name does not end with a question mark -- this is to
 | |
|     indicate that it does not return a simple boolean (<code>#t</code> or <code>#f</code>), but a
 | |
|     general value.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (any integer? '(a 3 b 2.7))   => #t
 | |
| (any integer? '(a 3.1 b 2.7)) => #f
 | |
| (any < '(3 1 4 1 5)
 | |
|        '(2 7 1 8 2)) => #t
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== every
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="every"></a>
 | |
| <code class=proc-def>every</code><var> pred clist<sub>1</sub> clist<sub>2</sub> ... -> value</var>
 | |
| <dd class=proc-def>
 | |
|     Applies the predicate across the lists, returning true if the predicate
 | |
|     returns true on every application.
 | |
| <p>
 | |
|     If there are <var>n</var> list arguments <var>clist<sub>1</sub></var> ... <var>clist<sub>n</sub></var>, then <var>pred</var> must be a
 | |
|     procedure taking <var>n</var> arguments and returning a boolean result.
 | |
| <p>
 | |
|     <code>every</code> applies <var>pred</var> to the first elements of the <var>clist<sub>i</sub></var> parameters.
 | |
|     If this application returns false, <code>every</code> immediately returns false.
 | |
|     Otherwise, it iterates, applying <var>pred</var> to the second elements of the
 | |
|     <var>clist<sub>i</sub></var> parameters, then the third, and so forth. The iteration stops
 | |
|     when a false value is produced or one of the lists runs out of values.
 | |
|     In the latter case, <code>every</code> returns
 | |
|     the true value produced by its final application of <var>pred</var>. 
 | |
|     The application of <var>pred</var> to the last element of the lists 
 | |
|     is a tail call.
 | |
| <p>
 | |
|     If one of the <var>clist<sub>i</sub></var> has no elements, <code>every</code> simply returns <code>#t</code>.
 | |
| <p>
 | |
|     Like <code>any</code>, <code>every</code>'s name does not end with a question mark -- this is to
 | |
|     indicate that it does not return a simple boolean (<code>#t</code> or <code>#f</code>), but a
 | |
|     general value.
 | |
| 
 | |
| <!--
 | |
| ==== list-index
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="list-index"></a>
 | |
| <code class=proc-def>list-index</code><var> pred clist<sub>1</sub> clist<sub>2</sub> ... -> integer or false</var>
 | |
| <dd class=proc-def>
 | |
|     Return the index of the leftmost element that satisfies <var>pred</var>.
 | |
| <p>
 | |
|     If there are <var>n</var> list arguments <var>clist<sub>1</sub></var> ... <var>clist<sub>n</sub></var>, then <var>pred</var> must be a
 | |
|     function taking <var>n</var> arguments and returning a boolean result.
 | |
| <p>
 | |
|     <code>list-index</code> applies <var>pred</var> to the first elements of the <var>clist<sub>i</sub></var> parameters.
 | |
|     If this application returns true, <code>list-index</code> immediately returns zero.
 | |
|     Otherwise, it iterates, applying <var>pred</var> to the second elements of the
 | |
|     <var>clist<sub>i</sub></var> parameters, then the third, and so forth. When it finds a tuple of
 | |
|     list elements that cause <var>pred</var> to return true, it stops and returns the
 | |
|     zero-based index of that position in the lists.
 | |
| <p>
 | |
|     The iteration stops when one of the lists runs out of values; in this
 | |
|     case, <code>list-index</code> returns <code>#f</code>.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (list-index even? '(3 1 4 1 5 9)) => 2
 | |
| (list-index < '(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)) => 1
 | |
| (list-index = '(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)) => #f
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== member memq memv
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="member"></a>
 | |
| <code class=proc-def>member</code><var> x list [=] -> list</var>
 | |
| <dt class=proc-defi>
 | |
| <a name="memq"></a>
 | |
| <code class=proc-def>memq</code><var> x list -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="memv"></a>
 | |
| <code class=proc-def>memv</code><var> x list -> list</var>
 | |
| <dd class=proc-def>
 | |
|      [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>+]
 | |
| 
 | |
|     These procedures return the first sublist of <var>list</var> whose car is
 | |
|     <var>x</var>, where the sublists of <var>list</var> are the 
 | |
|     non-empty lists returned by 
 | |
|         <code>(drop <var>list</var> <var>i</var>)</code>
 | |
|     for <var>i</var> less than the length of <var>list</var>.  
 | |
|     If <var>x</var> does
 | |
|     not occur in <var>list</var>, then <code>#f</code> is returned.  
 | |
|     <code>memq</code> uses <code>eq?</code> to compare <var>x</var>
 | |
|     with the elements of <var>list</var>, 
 | |
|     while <code>memv</code> uses <code>eqv?</code>, and
 | |
|     <code>member</code> uses <code>equal?</code>.
 | |
| 
 | |
| <pre class=code-example>
 | |
|     (memq 'a '(a b c))          =>  (a b c)
 | |
|     (memq 'b '(a b c))          =>  (b c)
 | |
|     (memq 'a '(b c d))          =>  #f
 | |
|     (memq (list 'a) '(b (a) c)) =>  #f
 | |
|     (member (list 'a)
 | |
|             '(b (a) c))         =>  ((a) c)
 | |
|     (memq 101 '(100 101 102))   =>  *unspecified*
 | |
|     (memv 101 '(100 101 102))   =>  (101 102)
 | |
| </pre>
 | |
| 
 | |
|     <code>member</code> is extended from its 
 | |
|     <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>
 | |
|     definition to allow the client to pass in
 | |
|     an optional equality procedure <var>=</var> used to compare keys. 
 | |
| 
 | |
| <p>
 | |
|     The comparison procedure is used to compare the elements <var>e<sub>i</sub></var> of <var>list</var>
 | |
|     to the key <var>x</var> in this way:
 | |
| <div class=indent><code>
 | |
| (= <var>x</var> <var>e<sub>i</sub></var>)		; list is (E1 ... En)
 | |
| </code></div>
 | |
|     That is, the first argument is always <var>x</var>, and the second argument is
 | |
|     one of the list elements. Thus one can reliably find the first element
 | |
|     of <var>list</var> that is greater than five with
 | |
| 	<code>(member 5 <var>list</var> <)</code>
 | |
| 
 | |
| <p>
 | |
|     Note that fully general list searching may be performed with
 | |
|     the <code>find-tail</code> and <code>find</code> procedures, <em>e.g.</em>
 | |
| <pre class=code-example>
 | |
| (find-tail even? list) ; Find the first elt with an even key.
 | |
| </pre>
 | |
| 
 | |
| </dl>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="Deletion">Deletion</a></h2>
 | |
| <p>
 | |
| 
 | |
| <dl>
 | |
| <!--
 | |
| ==== delete!
 | |
| ==== delete
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="delete"></a>
 | |
| <code class=proc-def>delete  </code><var>x list [=] -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="delete!"></a>
 | |
| <code class=proc-def>delete! </code><var>x list [=] -> list</var>
 | |
| <dd class=proc-def>
 | |
|     <code>delete</code> uses the comparison procedure =, which defaults to <code>equal?</code>, to find
 | |
|     all elements of <var>list</var> that are equal to <var>x</var>, and deletes them from <var>list</var>. The
 | |
|     dynamic order in which the various applications of <var>=</var> are made is not
 | |
|     specified.
 | |
| 
 | |
| <p>
 | |
|     The list is not disordered -- elements that appear in the result list
 | |
|     occur in the same order as they occur in the argument list.
 | |
|     The result may share a common tail with the argument list.
 | |
| 
 | |
| <p>
 | |
|     Note that fully general element deletion can be performed with the <code>remove</code>
 | |
|     and <code>remove!</code> procedures, <em>e.g.</em>:
 | |
| <pre class=code-example>
 | |
| ;; Delete all the even elements from LIS:
 | |
| (remove even? lis)
 | |
| </pre>
 | |
| 
 | |
|     The comparison procedure is used in this way:
 | |
| 	<code>(= <var>x</var> <var>e<sub>i</sub></var>)</code>.
 | |
|     That is, <var>x</var> is always the first argument, 
 | |
|     and a list element is always the
 | |
|     second argument. The comparison procedure will be used to compare each
 | |
|     element of <var>list</var> exactly once; the order in which it is applied to the
 | |
|     various <var>e<sub>i</sub></var> is not specified.  Thus, one can reliably remove all the
 | |
|     numbers greater than five from a list with
 | |
| 	<code>(delete 5 list <)</code>
 | |
| 
 | |
| <p>
 | |
|     <code>delete!</code> is the linear-update variant of <code>delete</code>.
 | |
|     It is allowed, but not required, to alter the cons cells in
 | |
|     its argument list to construct the result.    
 | |
| 
 | |
| <!--
 | |
| ==== delete-duplicates!
 | |
| ==== delete-duplicates
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="delete-duplicates"></a>
 | |
| <code class=proc-def>delete-duplicates  </code><var>list [=] -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="delete-duplicates!"></a>
 | |
| <code class=proc-def>delete-duplicates! </code><var>list [=] -> list</var>
 | |
| <dd class=proc-def>
 | |
|     <code>delete-duplicates</code> removes duplicate elements from the
 | |
|     list argument.
 | |
|     If there are multiple equal elements in the argument list, the result list
 | |
|     only contains the first or leftmost of these elements in the result.
 | |
|     The order of these surviving elements is the same as in the original
 | |
|     list -- <code>delete-duplicates</code> does not disorder the list (hence it is useful
 | |
|     for "cleaning up" association lists).
 | |
| <p>
 | |
|     The <var>=</var> parameter is used to compare the elements of the list; it defaults
 | |
|     to <code>equal?</code>. If <var>x</var> comes before <var>y</var> in <var>list</var>, then the comparison is performed 
 | |
| 	<code>(= <var>x</var> <var>y</var>)</code>.
 | |
|     The comparison procedure will be used to compare each pair of elements in 
 | |
|     <var>list</var> no more than once; 
 | |
|     the order in which it is applied to the various pairs is not specified.
 | |
| <p>
 | |
|     Implementations of <code>delete-duplicates</code>
 | |
|     are allowed to share common tails
 | |
|     between argument and result lists -- for example, if the list argument
 | |
|     contains only unique elements, it may simply return exactly
 | |
|     this list.
 | |
| <p>
 | |
|     Be aware that, in general, <code>delete-duplicates</code>
 | |
|     runs in time O(n<sup>2</sup>) for <var>n</var>-element lists.
 | |
|     Uniquifying long lists can be accomplished in O(n lg n) time by sorting
 | |
|     the list to bring equal elements together, then using a linear-time
 | |
|     algorithm to remove equal elements. Alternatively, one can use algorithms
 | |
|     based on element-marking, with linear-time results.
 | |
| 
 | |
| <p>
 | |
|     <code>delete-duplicates!</code> is the linear-update variant of <code>delete-duplicates</code>; it
 | |
|     is allowed, but not required, to alter the cons cells in its argument
 | |
|     list to construct the result.
 | |
| <pre class=code-example>
 | |
| (delete-duplicates '(a b a c a b c z)) => (a b c z)
 | |
| 
 | |
| ;; Clean up an alist:
 | |
| (delete-duplicates '((a . 3) (b . 7) (a . 9) (c . 1))
 | |
|                    (lambda (x y) (eq? (car x) (car y))))
 | |
|     => ((a . 3) (b . 7) (c . 1))
 | |
| </pre>
 | |
| </dl>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="AssociationLists">Association lists</a></h2>
 | |
| <p>
 | |
| An "association list" (or "alist") is a list of pairs. The car of each pair
 | |
| contains a key value, and the cdr contains the associated data value. They can
 | |
| be used to construct simple look-up tables in Scheme. Note that association
 | |
| lists are probably inappropriate for performance-critical use on large data;
 | |
| in these cases, hash tables or some other alternative should be employed.
 | |
| 
 | |
| <dl>
 | |
| <!--
 | |
| ==== assoc assq assv
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="assoc"></a>
 | |
| <code class=proc-def>assoc</code><var> key alist [=] -> pair or #f</var>
 | |
| <dt class=proc-defi>
 | |
| <a name="assq"></a>
 | |
| <code class=proc-def>assq</code><var> key alist -> pair or #f</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="assv"></a>
 | |
| <code class=proc-def>assv</code><var> key alist -> pair or #f</var>
 | |
| <dd class=proc-def>
 | |
| 
 | |
|      [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>+]
 | |
|     <var>alist</var> must be an association list -- a list of pairs.  
 | |
|     These procedures
 | |
|     find the first pair in <var>alist</var> whose car field is <var>key</var>, 
 | |
|     and returns that pair.  
 | |
|     If no pair in <var>alist</var> has <var>key</var> as its car, 
 | |
|     then <code>#f</code> is returned.  
 | |
|     <code>assq</code> uses <code>eq?</code> to compare <var>key</var> 
 | |
|     with the car fields of the pairs in <var>alist</var>, 
 | |
|     while <code>assv</code> uses <code>eqv?</code> 
 | |
|     and <code>assoc</code> uses <code>equal?</code>.
 | |
| <pre class=code-example>
 | |
| (define e '((a 1) (b 2) (c 3)))
 | |
| (assq 'a e)                            =>  (a 1)
 | |
| (assq 'b e)                            =>  (b 2)
 | |
| (assq 'd e)                            =>  #f
 | |
| (assq (list 'a) '(((a)) ((b)) ((c))))  =>  #f
 | |
| (assoc (list 'a) '(((a)) ((b)) ((c)))) =>  ((a))
 | |
| (assq 5 '((2 3) (5 7) (11 13)))	   =>  *unspecified*
 | |
| (assv 5 '((2 3) (5 7) (11 13)))	   =>  (5 7)
 | |
| </pre>
 | |
| 
 | |
|     <code>assoc</code> is extended from its 
 | |
|     <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> 
 | |
|     definition to allow the client to pass in
 | |
|     an optional equality procedure <var>=</var> used to compare keys.
 | |
| 
 | |
| <p>
 | |
|     The comparison procedure is used to compare the elements <var>e<sub>i</sub></var> of <var>list</var>
 | |
|     to the <var>key</var> parameter in this way:
 | |
| <div class=indent><code>
 | |
| (= <var>key</var> (car <var>e<sub>i</sub></var>))	; list is (E1 ... En)
 | |
| </code></div>
 | |
|     That is, the first argument is always <var>key</var>, 
 | |
|     and the second argument is one of the list elements. 
 | |
|     Thus one can reliably find the first entry
 | |
|     of <var>alist</var> whose key is greater than five with
 | |
| 	<code>(assoc 5 <var>alist</var> <)</code>
 | |
|      
 | |
| <p>
 | |
|     Note that fully general alist searching may be performed with
 | |
|     the <code>find-tail</code> and <code>find</code> procedures, <em>e.g.</em>
 | |
| <pre class=code-example>
 | |
| ;; Look up the first association in <var>alist</var> with an even key:
 | |
| (find (lambda (a) (even? (car a))) alist)
 | |
| </pre>
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== alist-cons
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="alist-cons"></a>
 | |
| <code class=proc-def>alist-cons</code><var> key datum alist -> alist</var>
 | |
| <dd class=proc-def>
 | |
| <pre>
 | |
| (lambda (key datum alist) (cons (cons key datum) alist))
 | |
| </pre>
 | |
|     Cons a new alist entry mapping <var>key</var> -> <var>datum</var> onto <var>alist</var>.
 | |
| 
 | |
| <!--
 | |
| ==== alist-copy
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="alist-copy"></a>
 | |
| <code class=proc-def>alist-copy</code><var> alist -> alist</var>
 | |
| <dd class=proc-def>
 | |
|     Make a fresh copy of <var>alist</var>. This means copying each pair that
 | |
|     forms an association as well as the spine of the list, <em>i.e.</em>
 | |
| <pre>
 | |
| (lambda (a) (map (lambda (elt) (cons (car elt) (cdr elt))) a))
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== alist-delete!
 | |
| ==== alist-delete
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="alist-delete"></a>
 | |
| <code class=proc-def>alist-delete  </code><var>key alist [=] -> alist</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="alist-delete!"></a>
 | |
| <code class=proc-def>alist-delete! </code><var>key alist [=] -> alist</var>
 | |
| <dd class=proc-def>
 | |
|     <code>alist-delete</code> deletes all associations from <var>alist</var> with the given <var>key</var>, 
 | |
|     using key-comparison procedure =, which defaults to <code>equal?</code>. 
 | |
|     The dynamic order in which the various applications of <var>=</var> are made is not 
 | |
|     specified. 
 | |
| <p>
 | |
|     Return values may share common tails with the <var>alist</var> argument.
 | |
|     The alist is not disordered -- elements that appear in the result alist
 | |
|     occur in the same order as they occur in the argument alist.
 | |
| <p>
 | |
|     The comparison procedure is used to compare the element keys <var>k<sub>i</sub></var> of <var>alist</var>'s
 | |
|     entries to the <var>key</var> parameter in this way:
 | |
| 	<code>(= <var>key</var> <var>k<sub>i</sub></var>)</code>.
 | |
|     Thus, one can reliably remove all entries of <var>alist</var> whose key is greater
 | |
|     than five with
 | |
| 	<code>(alist-delete 5 <var>alist</var> <)</code>
 | |
| <p>
 | |
|     <code>alist-delete!</code> is the linear-update variant of <code>alist-delete</code>.
 | |
|     It is allowed, but not required,
 | |
|     to alter cons cells from the <var>alist</var> parameter to construct the result.
 | |
| 
 | |
| </dl>
 | |
| 
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="SetOperationsOnLists">Set operations on lists</a></h2>
 | |
| <p>
 | |
| These procedures implement operations on sets represented as lists of elements.
 | |
| They all take an <var>=</var> argument used to compare elements of lists. 
 | |
| This equality procedure is required to be consistent with <code>eq?</code>. 
 | |
| That is, it must be the case that
 | |
| <div class=indent>
 | |
|         <code>(eq? <var>x</var> <var>y</var>)</code> => <code>(<var>=</var> <var>x</var> <var>y</var>)</code>.
 | |
| </div>
 | |
| Note that this implies, in turn, that two lists that are <code>eq?</code> are
 | |
| also set-equal by any legal comparison procedure. This allows for
 | |
| constant-time determination of set operations on <code>eq?</code> lists.
 | |
| 
 | |
| <p>
 | |
| Be aware that these procedures typically run in time 
 | |
| O(<var>n</var> * <var>m</var>) 
 | |
| for <var>n</var>- and <var>m</var>-element list arguments.  
 | |
| Performance-critical applications
 | |
| operating upon large sets will probably wish to use other data
 | |
| structures and algorithms.
 | |
| 
 | |
| <dl>
 | |
| <!--
 | |
| ==== lset<=
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="lset<="></a>
 | |
| <code class=proc-def>lset<=</code><var> = list<sub>1</sub> ... -> boolean</var>
 | |
| <dd class=proc-def>
 | |
|     Returns true iff every <var>list<sub>i</sub></var> is a subset of <var>list<sub>i+1</sub></var>, using <var>=</var> for
 | |
|     the element-equality procedure. 
 | |
|     List <var>A</var> is a subset of list <var>B</var> if every
 | |
|     element in <var>A</var> is equal to some element of <var>B</var>. 
 | |
|     When performing an element comparison, 
 | |
|     the <var>=</var> procedure's first argument is an element
 | |
|     of <var>A</var>; its second, an element of <var>B</var>.
 | |
| <pre class=code-example>
 | |
| (lset<= eq? '(a) '(a b a) '(a b c c)) => #t
 | |
| 
 | |
| (lset<= eq?) => #t             ; Trivial cases
 | |
| (lset<= eq? '(a)) => #t
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== lset=
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="lset="></a>
 | |
| <code class=proc-def>lset=</code><var> = list<sub>1</sub> list<sub>2</sub> ... -> boolean</var>
 | |
| <dd class=proc-def>
 | |
|     Returns true iff every <var>list<sub>i</sub></var> is set-equal to <var>list<sub>i+1</sub></var>, using <var>=</var> for
 | |
|     the element-equality procedure. "Set-equal" simply means that
 | |
|     <var>list<sub>i</sub></var> is a subset of <var>list<sub>i+1</sub></var>, and <var>list<sub>i+1</sub></var> is a subset of <var>list<sub>i</sub></var>.
 | |
|     The <var>=</var> procedure's first argument is an element of <var>list<sub>i</sub></var>; its second is an element of
 | |
|     <var>list<sub>i+1</sub></var>.
 | |
| <pre class=code-example>
 | |
| (lset= eq? '(b e a) '(a e b) '(e e b a)) => #t
 | |
| 
 | |
| (lset= eq?) => #t               ; Trivial cases
 | |
| (lset= eq? '(a)) => #t
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== lset-adjoin
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="lset-adjoin"></a>
 | |
| <code class=proc-def>lset-adjoin</code><var> = list elt<sub>1</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Adds the <var>elt<sub>i</sub></var> elements not already in the list parameter to the 
 | |
|     result list. The result shares a common tail with the list parameter.
 | |
|     The new elements are added to the front of the list, but no guarantees
 | |
|     are made about their order. The <var>=</var> parameter is an equality procedure
 | |
|     used to determine if an <var>elt<sub>i</sub></var> is already a member of <var>list</var>. Its first 
 | |
|     argument is an element of <var>list</var>; its second is one of the <var>elt<sub>i</sub></var>.
 | |
| <p>
 | |
|     The list parameter is always a suffix of the result -- even if the list
 | |
|     parameter contains repeated elements, these are not reduced.
 | |
| <pre class=code-example>
 | |
| (lset-adjoin eq? '(a b c d c e) 'a 'e 'i 'o 'u) => (u o i a b c d c e)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== lset-union
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="lset-union"></a>
 | |
| <code class=proc-def>lset-union</code><var> = list<sub>1</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Returns the union of the lists, using <var>=</var> for the element-equality
 | |
|     procedure.
 | |
| <p>
 | |
|     The union of lists <var>A</var> and <var>B</var> is constructed as follows:
 | |
|     <ul>
 | |
|         <li> If <var>A</var> is the empty list, 
 | |
|              the answer is <var>B</var> (or a copy of <var>B</var>).
 | |
|         <li> Otherwise, the result is initialised to be list <var>A</var> 
 | |
|              (or a copy of <var>A</var>).
 | |
| 	<li> Proceed through the elements of list <var>B</var> 
 | |
|              in a left-to-right order.
 | |
| 	     If <var>b</var> is such an element of <var>B</var>, 
 | |
|              compare every element <var>r</var> of the current result list 
 | |
|              to <var>b</var>: 
 | |
|              <code>(= <var>r</var> <var>b</var>)</code>. 
 | |
|              If all comparisons fail, 
 | |
|              <var>b</var> is consed onto the front of the result.
 | |
|     </ul>
 | |
|     However, there is no guarantee that = will be applied to every pair
 | |
|     of arguments from <var>A</var> and <var>B</var>. 
 | |
|     In particular, if <var>A</var> is <code>eq</code>? to <var>B</var>, 
 | |
|     the operation may immediately terminate.
 | |
| 
 | |
| <p>
 | |
|     In the n-ary case, the two-argument list-union operation is simply
 | |
|     folded across the argument lists.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (lset-union eq? '(a b c d e) '(a e i o u)) => 
 | |
|     (u o i a b c d e)
 | |
| 
 | |
| ;; Repeated elements in LIST1 are preserved.
 | |
| (lset-union eq? '(a a c) '(x a x)) => (x a a c)
 | |
| 
 | |
| ;; Trivial cases
 | |
| (lset-union eq?) => ()
 | |
| (lset-union eq? '(a b c)) => (a b c)
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== lset-intersection
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="lset-intersection"></a>
 | |
| <code class=proc-def>lset-intersection</code><var> = list<sub>1</sub> list<sub>2</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Returns the intersection of the lists, 
 | |
|     using <var>=</var> for the element-equality procedure.
 | |
| <p>
 | |
|     The intersection of lists <var>A</var> and <var>B</var>
 | |
|     is comprised of every element of <var>A</var> that is <var>=</var> 
 | |
|     to some element of <var>B</var>: 
 | |
|         <code>(<var>=</var> <var>a</var> <var>b</var>)</code>, 
 | |
|     for <var>a</var> in <var>A</var>, and <var>b</var> in <var>B</var>.
 | |
|     Note this implies that an element which appears in <var>B</var> 
 | |
|     and multiple times in list <var>A</var>
 | |
|     will also appear multiple times in the result.
 | |
| <p>
 | |
|     The order in which elements appear in the result is the same as
 | |
|     they appear in <var>list<sub>1</sub></var> -- 
 | |
|     that is, <code>lset-intersection</code> essentially filters 
 | |
|     <var>list<sub>1</sub></var>, 
 | |
|     without disarranging element order. 
 | |
|     The result may
 | |
|     share a common tail with <var>list<sub>1</sub></var>.
 | |
| <p>
 | |
|     In the n-ary case, the two-argument list-intersection operation is simply
 | |
|     folded across the argument lists. However, the dynamic order in which the
 | |
|     applications of <var>=</var> are made is not specified. 
 | |
|     The procedure may check an
 | |
|     element of <var>list<sub>1</sub></var> for membership 
 | |
|     in every other list before proceeding to
 | |
|     consider the next element of <var>list<sub>1</sub></var>, 
 | |
|     or it may completely intersect <var>list<sub>1</sub></var>
 | |
|     and <var>list<sub>2</sub></var> 
 | |
|     before proceeding to <var>list<sub>3</sub></var>, 
 | |
|     or it may go about its work in some third order.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (lset-intersection eq? '(a b c d e) '(a e i o u)) => (a e)
 | |
| 
 | |
| ;; Repeated elements in LIST1 are preserved.
 | |
| (lset-intersection eq? '(a x y a) '(x a x z)) => '(a x a)
 | |
| 
 | |
| (lset-intersection eq? '(a b c)) => (a b c)     ; Trivial case
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== lset-difference
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="lset-difference"></a>
 | |
| <code class=proc-def>lset-difference</code><var> = list<sub>1</sub> list<sub>2</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Returns the difference of the lists, using <var>=</var> for the element-equality
 | |
|     procedure -- all the elements of <var>list<sub>1</sub></var> that are not
 | |
|     <var>=</var> to any element from one of the
 | |
|     other <var>list<sub>i</sub></var> parameters. 
 | |
| <p>
 | |
|     The <var>=</var> procedure's first argument is 
 | |
|     always an element of <var>list<sub>1</sub></var>; 
 | |
|     its second is an element of one of the other <var>list<sub>i</sub></var>.
 | |
|     Elements that are repeated multiple times in the 
 | |
|     <var>list<sub>1</sub></var> parameter 
 | |
|     will occur multiple times in the result. 
 | |
| 
 | |
|     The order in which elements appear in the result is the same as
 | |
|     they appear in <var>list<sub>1</sub></var> -- 
 | |
|     that is, <code>lset-difference</code> essentially
 | |
|     filters <var>list<sub>1</sub></var>, without disarranging element order. 
 | |
|     The result may share a common tail with <var>list<sub>1</sub></var>. 
 | |
| 
 | |
|     The dynamic order in which the applications of <var>=</var> are made is not
 | |
|     specified. 
 | |
|     The procedure may check an element of <var>list<sub>1</sub></var>
 | |
|     for membership in every other list before proceeding to consider the
 | |
|     next element of <var>list<sub>1</sub></var>,
 | |
|     or it may completely compute the difference of 
 | |
|     <var>list<sub>1</sub></var> and <var>list<sub>2</sub></var> before
 | |
|     proceeding to <var>list<sub>3</sub></var>, 
 | |
|     or it may go about its work in some third order.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (lset-difference eq? '(a b c d e) '(a e i o u)) => (b c d)
 | |
| 
 | |
| (lset-difference eq? '(a b c)) => (a b c) ; Trivial case
 | |
| </pre>
 | |
| 
 | |
| <!--
 | |
| ==== lset-xor
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="lset-xor"></a>
 | |
| <code class=proc-def>lset-xor</code><var> = list<sub>1</sub> ... -> list</var>
 | |
| <dd class=proc-def>
 | |
|     Returns the exclusive-or of the sets, 
 | |
|     using <var>=</var> for the element-equality procedure. 
 | |
|     If there are exactly two lists, this is all the elements
 | |
|     that appear in exactly one of the two lists. The operation is associative,
 | |
|     and thus extends to the n-ary case -- the elements that appear in an
 | |
|     odd number of the lists. The result may share a common tail with any of
 | |
|     the <var>list<sub>i</sub></var> parameters.
 | |
| <p>
 | |
|     More precisely, for two lists <var>A</var> and <var>B</var>, 
 | |
|     <var>A</var> xor <var>B</var> is a list of
 | |
|     <ul>
 | |
|      <li> every element <var>a</var> of <var>A</var>
 | |
|           such that there is no element <var>b</var> of <var>B</var>
 | |
|           such that <code>(<var>=</var> <var>a</var> <var>b</var>)</code>, and
 | |
|      <li> every element <var>b</var> of <var>B</var> 
 | |
|           such that there is no element <var>a</var> of <var>A</var>
 | |
|           such that <code>(<var>=</var> <var>b</var> <var>a</var>)</code>.
 | |
|     </ul>
 | |
|     However, an implementation is allowed to assume that <var>=</var> is
 | |
|     symmetric -- that is, that
 | |
| <div class=indent>
 | |
| 	<code>(<var>=</var> <var>a</var> <var>b</var>)</code> => 
 | |
|         <code>(<var>=</var> <var>b</var> <var>a</var>)</code>.
 | |
| </div>
 | |
|     This means, for example, that if a comparison 
 | |
|     <code>(<var>=</var> <var>a</var> <var>b</var>)</code> produces
 | |
|     true for some <var>a</var> in <var>A</var> 
 | |
|     and <var>b</var> in <var>B</var>,
 | |
|     both <var>a</var> and <var>b</var> may be removed from
 | |
|     inclusion in the result.
 | |
| <p>
 | |
|     In the n-ary case, the binary-xor operation is simply folded across
 | |
|     the lists.
 | |
| 
 | |
| <pre class=code-example>
 | |
| (lset-xor eq? '(a b c d e) '(a e i o u)) => (d c b i o u)
 | |
| 
 | |
| ;; Trivial cases.
 | |
| (lset-xor eq?) => ()
 | |
| (lset-xor eq? '(a b c d e)) => (a b c d e)
 | |
| </pre>
 | |
| 
 | |
| 
 | |
| <!--
 | |
| ==== lset-diff+intersection
 | |
| ============================================================================-->
 | |
| <dt class=proc-def>
 | |
| <a name="lset-diff+intersection"></a>
 | |
| <code class=proc-def>lset-diff+intersection</code><var> = list<sub>1</sub> list<sub>2</sub> ... -> [list list]</var>
 | |
| <dd class=proc-def>
 | |
|     Returns two values -- the difference and the intersection of the lists.
 | |
|     Is equivalent to 
 | |
| <pre class=code-example>
 | |
| (values (lset-difference <var>=</var> <var>list<sub>1</sub></var> <var>list<sub>2</sub></var> ...)
 | |
|         (lset-intersection <var>=</var> <var>list<sub>1</sub></var>
 | |
|                              (lset-union <var>=</var> <var>list<sub>2</sub></var> ...)))
 | |
| </pre>
 | |
|     but can be implemented more efficiently.
 | |
| <p>
 | |
|     The <var>=</var> procedure's first argument is an element of <var>list<sub>1</sub></var>; its second
 | |
|     is an element of one of the other <var>list<sub>i</sub></var>.
 | |
| <p>
 | |
|     Either of the answer lists may share a 
 | |
|     common tail with <var>list<sub>1</sub></var>.
 | |
|     This operation essentially partitions <var>list<sub>1</sub></var>.
 | |
| 
 | |
| <!--
 | |
| ==== lset-diff+intersection! 
 | |
| ==== lset-xor!
 | |
| ==== lset-difference!
 | |
| ==== lset-intersection!
 | |
| ==== lset-union!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="lset-union!"></a>
 | |
| <code class=proc-def>lset-union!             </code><var>= list<sub>1</sub> ... -> list</var>
 | |
| <dt class=proc-defi>
 | |
| <a name="lset-intersection!"></a>
 | |
| <code class=proc-def>lset-intersection!      </code><var>= list<sub>1</sub> list<sub>2</sub> ... -> list</var>
 | |
| <dt class=proc-defi>
 | |
| <a name="lset-difference!"></a>
 | |
| <code class=proc-def>lset-difference!        </code><var>= list<sub>1</sub> list<sub>2</sub> ... -> list</var>
 | |
| <dt class=proc-defi>
 | |
| <a name="lset-xor!"></a>
 | |
| <code class=proc-def>lset-xor!               </code><var>= list<sub>1</sub> ... -> list</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="lset-diff+intersection!"></a>
 | |
| <code class=proc-def>lset-diff+intersection! </code><var>= list<sub>1</sub> list<sub>2</sub> ... -> [list list]</var>
 | |
| <dd class=proc-def>
 | |
|     These are linear-update variants. They are allowed, but not required,
 | |
|     to use the cons cells in their first list parameter to construct their
 | |
|     answer. <code>lset-union!</code> is permitted to recycle cons cells from <em>any</em> 
 | |
|     of its list arguments.
 | |
| </dl>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h2><a name="PrimitiveSideEffects">Primitive side-effects</a></h2>
 | |
| <p>
 | |
| These two procedures are the primitive, 
 | |
| <abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr> 
 | |
| side-effect operations on pairs.
 | |
| 
 | |
| <dl>
 | |
| <!--
 | |
| ==== set-car!
 | |
| ============================================================================-->
 | |
| <dt class=proc-def1>
 | |
| <a name="set-car!"></a>
 | |
| <code class=proc-def>set-car!</code><var> pair object -> unspecified</var>
 | |
| <dt class=proc-defn>
 | |
| <a name="set-cdr!"></a>
 | |
| <code class=proc-def>set-cdr!</code><var> pair object -> unspecified</var>
 | |
| <dd class=proc-def>
 | |
|      [<abbr title="Revised^5 Report on Scheme"><a href="#R5RS">R5RS</a></abbr>]
 | |
|      These procedures store <var>object</var> in the car and cdr field
 | |
|      of <var>pair</var>, respectively.
 | |
|      The value returned is unspecified.
 | |
| <pre class=code-example>
 | |
| (define (f) (list 'not-a-constant-list))
 | |
| (define (g) '(constant-list))
 | |
| (set-car! (f) 3) =>  *unspecified*
 | |
| (set-car! (g) 3) =>  *error*
 | |
| </pre>
 | |
| </dl>
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1><a name="Acknowledgements">Acknowledgements</a></h1>
 | |
| <p>
 | |
| The design of this library benefited greatly from the feedback provided during
 | |
| the <abbr title="Scheme Request for Implementation">SRFI</abbr> discussion phase. Among those contributing thoughtful commentary and
 | |
| suggestions, both on the mailing list and by private discussion, were Mike
 | |
| Ashley, Darius Bacon, Alan Bawden, Phil Bewig, Jim Blandy, Dan Bornstein, Per
 | |
| Bothner, Anthony Carrico, Doug Currie, Kent Dybvig, Sergei Egorov, Doug Evans,
 | |
| Marc Feeley, Matthias Felleisen, Will Fitzgerald, Matthew Flatt, Dan Friedman,
 | |
| Lars Thomas Hansen, Brian Harvey, Erik Hilsdale, Wolfgang Hukriede, Richard
 | |
| Kelsey, Donovan Kolbly, Shriram Krishnamurthi, Dave Mason, Jussi Piitulainen,
 | |
| David Pokorny, Duncan Smith, Mike Sperber, Maciej Stachowiak, Harvey J. Stein,
 | |
| John David Stone, and Joerg F. Wittenberger. I am grateful to them for their
 | |
| assistance.
 | |
| <p>
 | |
| I am also grateful the authors, implementors and documentors of all the systems
 | |
| mentioned in the introduction. Aubrey Jaffer and Kent Pitman should be noted
 | |
| for their work in producing Web-accessible versions of the R5RS and 
 | |
| <a href="#CommonLisp">Common Lisp</a> spec, which was a tremendous aid.
 | |
| <p>
 | |
| This is not to imply that these individuals necessarily endorse the final
 | |
| results, of course. 
 | |
| 
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1><a name="ReferencesLinks">References & links</a></h1>
 | |
| <p>
 | |
| 
 | |
| <dl>
 | |
| <dt class=biblio>This document, in HTML:
 | |
| <dd><a href="http://srfi.schemers.org/srfi-1/srfi-1.html">
 | |
|     http://srfi.schemers.org/srfi-1/srfi-1.html</a>
 | |
| 
 | |
|     <br><a class=draft
 | |
|            href="ftp://ftp.ai.mit.edu/people/shivers/srfi/srfi-1/srfi-1.html">
 | |
|     ftp://ftp.ai.mit.edu/people/shivers/srfi/srfi-1/srfi-1.html (draft)</a>
 | |
| 
 | |
| <dt class=biblio>This document, in simple text format:
 | |
| <dd><a href="http://srfi.schemers.org/srfi-1/srfi-1.txt">
 | |
|     http://srfi.schemers.org/srfi-1/srfi-1.txt</a>
 | |
| 
 | |
|     <br><a class=draft
 | |
|            href="ftp://ftp.ai.mit.edu/people/shivers/srfi/srfi-1/srfi-1.txt">
 | |
|     ftp://ftp.ai.mit.edu/people/shivers/srfi/srfi-1/srfi-1.txt (draft)</a>
 | |
| 
 | |
| <dt class=biblio>Source code for the reference implementation:
 | |
| <dd><a HREF="http://srfi.schemers.org/srfi-1/srfi-1-reference.scm">
 | |
|     http://srfi.schemers.org/srfi-1/srfi-1-reference.scm</a>
 | |
| 
 | |
|     <br><a class=draft
 | |
|            href="ftp://ftp.ai.mit.edu/people/shivers/srfi/srfi-1/srfi-1-reference.scm">
 | |
|     ftp://ftp.ai.mit.edu/people/shivers/srfi/srfi-1/srfi-1-reference.scm (draft)</a>
 | |
| 
 | |
| <dt class=biblio>Archive of SRFI-1 discussion-list email:
 | |
| <dd><a href="http://srfi.schemers.org/srfi-1/mail-archive/maillist.html">
 | |
|     http://srfi.schemers.org/srfi-1/mail-archive/maillist.html</a>
 | |
| 
 | |
| <dt class=biblio>SRFI web site:
 | |
| <dd><a href="http://srfi.schemers.org/">
 | |
|     http://srfi.schemers.org/</a>
 | |
| </dl>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <dl>
 | |
| <dt class=biblio><strong><a name="CommonLisp">[CommonLisp]</a></strong></dt>
 | |
| <dd><em>Common Lisp: the Language</em><br>
 | |
| Guy L. Steele Jr. (editor).<br>
 | |
| Digital Press, Maynard, Mass., second edition 1990.<br>
 | |
| Available at <a href="http://www.elwood.com/alu/table/references.htm#cltl2">
 | |
| http://www.elwood.com/alu/table/references.htm#cltl2</a>.
 | |
| <p>
 | |
| 
 | |
| The Common Lisp "HyperSpec," produced by Kent Pitman, is essentially
 | |
| the ANSI spec for Common Lisp:
 | |
| <a href="http://www.harlequin.com/education/books/HyperSpec/">
 | |
| http://www.harlequin.com/education/books/HyperSpec/</a>.
 | |
| 
 | |
| <dt class=biblio><strong><a name="R5RS">[R5RS]</a></strong></dt>
 | |
| <dd>Revised<sup>5</sup> report on the algorithmic language Scheme.<br>
 | |
|     R. Kelsey, W. Clinger, J. Rees (editors). <br>
 | |
|     Higher-Order and Symbolic Computation, Vol. 11, No. 1, September, 1998. <br>
 | |
|     and ACM SIGPLAN Notices, Vol. 33, No. 9, October, 1998. <br>
 | |
|     Available at <a href="http://www.schemers.org/Documents/Standards/">
 | |
|     http://www.schemers.org/Documents/Standards/</a>.
 | |
| 
 | |
| </dl>
 | |
| 
 | |
| 
 | |
| 
 | |
| <!--========================================================================-->
 | |
| <h1><a name="Copyright">Copyright</a></h1>
 | |
| <p>
 | |
| 
 | |
| Certain portions of this document -- the specific, marked segments of text
 | |
| describing the R5RS procedures -- were adapted with permission from the R5RS
 | |
| report.
 | |
| <p>
 | |
|     
 | |
| All other text is copyright (C) Olin Shivers (1998, 1999). 
 | |
| All Rights Reserved. 
 | |
| <p>
 | |
| This document and translations of it may be copied and furnished to
 | |
| others, and derivative works that comment on or otherwise explain it
 | |
| or assist in its implementation may be prepared, copied, published and
 | |
| distributed, in whole or in part, without restriction of any kind,
 | |
| provided that the above copyright notice and this paragraph are
 | |
| included on all such copies and derivative works.  However, this
 | |
| document itself may not be modified in any way, such as by removing
 | |
| the copyright notice or references to the Scheme Request For
 | |
| Implementation process or editors, except as needed for the purpose of
 | |
| developing <abbr title="Scheme Request for Implementation">SRFI</abbr>s in which case the procedures for copyrights defined
 | |
| in the <abbr title="Scheme Request for Implementation">SRFI</abbr> process must be followed, or as required to translate it
 | |
| into languages other than English.
 | |
| <p>
 | |
| The limited permissions granted above are perpetual and will not be
 | |
| revoked by the authors or their successors or assigns.
 | |
| <p>
 | |
| This document and the information contained herein is provided on an
 | |
| "AS IS" basis and THE AUTHOR AND THE <abbr title="Scheme Request for Implementation">SRFI</abbr> EDITORS DISCLAIM ALL
 | |
| WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY
 | |
| WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
 | |
| RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
 | |
| PARTICULAR PURPOSE.
 | |
| 
 | |
| </body>
 | |
| </html>
 |