2901 lines
		
	
	
		
			169 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			2901 lines
		
	
	
		
			169 KiB
		
	
	
	
		
			HTML
		
	
	
	
| <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
 | |
| <html>
 | |
| <!-- Generated from TeX source by tex2page, v 4o4, 
 | |
|      (c) Dorai Sitaram, http://www.cs.rice.edu/~dorai/tex2page -->
 | |
| <head>
 | |
| <title>
 | |
| Revised^5 Report on the Algorithmic Language Scheme
 | |
| </title>
 | |
| <link rel="stylesheet" type="text/css" href="r5rs-Z-C.css" title=default>
 | |
| <meta name=robots content="noindex,follow">
 | |
| </head>
 | |
| <body>
 | |
| 
 | |
| <p><div class=navigation>[Go to <span><a href="r5rs.html">first</a>, <a href="r5rs-Z-H-8.html">previous</a></span><span>, <a href="r5rs-Z-H-10.html">next</a></span> page<span>;   </span><span><a href="r5rs-Z-H-2.html#%_toc_start">contents</a></span><span><span>;   </span><a href="r5rs-Z-H-15.html#%_index_start">index</a></span>]</div><p>
 | |
| 
 | |
| <a name="%_chap_6"></a>
 | |
| <h1 class=chapter>
 | |
| <div class=chapterheading><a href="r5rs-Z-H-2.html#%_toc_%_chap_6">Chapter 6</a></div><p>
 | |
| <a href="r5rs-Z-H-2.html#%_toc_%_chap_6">Standard procedures</a></h1><p>
 | |
| 
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <a name="%_idx_200"></a>
 | |
| <a name="%_idx_202"></a>
 | |
| <a name="%_idx_204"></a><p>
 | |
| 
 | |
| This chapter describes Scheme's built-in procedures.  The initial (or
 | |
| ``top level'') Scheme environment starts out with a number of variables
 | |
| bound to locations containing useful values, most of which are primitive
 | |
| procedures that manipulate data.  For example, the variable <tt>abs</tt> is
 | |
| bound to (a location initially containing) a procedure of one argument
 | |
| that computes the absolute value of a number, and the variable <tt>+</tt>
 | |
| is bound to a procedure that computes sums.  Built-in procedures that
 | |
| can easily be written in terms of other built-in procedures are identified as
 | |
| ``library procedures''.<p>
 | |
| 
 | |
| A program may use a top-level definition to bind any variable.  It may
 | |
| subsequently alter any such binding by an assignment (see <a href="r5rs-Z-H-7.html#%_sec_4.1.6">4.1.6</a>).
 | |
| These operations do not modify the behavior of Scheme's built-in
 | |
| procedures.  Altering any top-level binding that has not been introduced by a
 | |
| definition has an unspecified effect on the behavior of the built-in procedures.<p>
 | |
| 
 | |
| <a name="%_sec_6.1"></a>
 | |
| <h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.1">6.1  Equivalence predicates</a></h2><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| A <a name="%_idx_206"></a><em>predicate</em> is a procedure that always returns a boolean
 | |
| value (<tt>#t</tt> or <tt>#f</tt>).  An <a name="%_idx_208"></a><em>equivalence predicate</em> is
 | |
| the computational analogue of a mathematical equivalence relation (it is
 | |
| symmetric, reflexive, and transitive).  Of the equivalence predicates
 | |
| described in this section, <tt>eq?</tt> is the finest or most
 | |
| discriminating, and <tt>equal?</tt> is the coarsest.  <tt>Eqv?</tt> is
 | |
| slightly less discriminating than <tt>eq?</tt>.  <p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_210"></a>eqv?<i> <i>obj<sub>1</sub></i> <i>obj<sub>2</sub></i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| The <tt>eqv?</tt> procedure defines a useful equivalence relation on objects.
 | |
| Briefly, it returns <tt>#t</tt> if <i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> should
 | |
| normally be regarded as the same object.  This relation is left slightly
 | |
| open to interpretation, but the following partial specification of
 | |
| <tt>eqv?</tt> holds for all implementations of Scheme.<p>
 | |
| 
 | |
| The <tt>eqv?</tt> procedure returns <tt>#t</tt> if:<p>
 | |
| 
 | |
| <p><ul>
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are both <tt>#t</tt> or both <tt>#f</tt>.<p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are both symbols and<p>
 | |
| 
 | |
| <tt><p>(string=? (symbol->string obj1)<br>
 | |
|           (symbol->string obj2))<br>
 | |
|             ===>  <tt>#t</tt><p></tt><p>
 | |
| 
 | |
| <blockquote><em>Note:  </em> 
 | |
| This assumes that neither <i>obj<sub>1</sub></i> nor <i>obj<sub>2</sub></i> is an ``uninterned
 | |
| symbol'' as alluded to in section <a href="#%_sec_6.3.3">6.3.3</a>.  This report does
 | |
| not presume to specify the behavior of <tt>eqv?</tt> on implementation-dependent
 | |
| extensions.
 | |
| </blockquote><p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are both numbers, are numerically
 | |
| equal (see <tt>=</tt>, section <a href="#%_sec_6.2">6.2</a>), and are either both
 | |
| exact<a name="%_idx_212"></a> or both inexact<a name="%_idx_214"></a>.<p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are both characters and are the same
 | |
| character according to the <tt>char=?</tt> procedure
 | |
| (section <a href="#%_sec_6.3.4">6.3.4</a>).<p>
 | |
| 
 | |
| <li>both <i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are the empty list.<p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are pairs, vectors, or strings that denote the
 | |
| same locations in the store (section <a href="r5rs-Z-H-6.html#%_sec_3.4">3.4</a>).<p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are procedures whose location tags are
 | |
| equal (section <a href="r5rs-Z-H-7.html#%_sec_4.1.4">4.1.4</a>).
 | |
| </ul><p><p>
 | |
| 
 | |
| The <tt>eqv?</tt> procedure returns <tt>#f</tt> if:<p>
 | |
| 
 | |
| <p><ul>
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are of different types
 | |
| (section <a href="r5rs-Z-H-6.html#%_sec_3.2">3.2</a>).<p>
 | |
| 
 | |
| <li>one of <i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> is <tt>#t</tt> but the other is
 | |
| <tt>#f</tt>.<p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are symbols but<p>
 | |
| 
 | |
| <tt><p>(string=? (symbol->string <i>obj<sub>1</sub></i>)<br>
 | |
|           (symbol->string <i>obj<sub>2</sub></i>))<br>
 | |
|             ===>  <tt>#f</tt><p></tt><p>
 | |
| 
 | |
| <li>one of <i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> is an exact number but the other
 | |
| is an inexact number.<p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are numbers for which the <tt>=</tt>
 | |
| procedure returns <tt>#f</tt>.<p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are characters for which the <tt>char=?</tt>
 | |
| procedure returns <tt>#f</tt>.<p>
 | |
| 
 | |
| <li>one of <i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> is the empty list but the other
 | |
| is not.<p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are pairs, vectors, or strings that denote
 | |
| distinct locations.<p>
 | |
| 
 | |
| <li><i>obj<sub>1</sub></i> and <i>obj<sub>2</sub></i> are procedures that would behave differently
 | |
| (return different value(s) or have different side effects) for some arguments.<p>
 | |
| 
 | |
| </ul><p><p>
 | |
| 
 | |
| <tt><p>(eqv? 'a 'a)                             ===>  <tt>#t</tt><br>
 | |
| (eqv? 'a 'b)                             ===>  <tt>#f</tt><br>
 | |
| (eqv? 2 2)                               ===>  <tt>#t</tt><br>
 | |
| (eqv? '() '())                           ===>  <tt>#t</tt><br>
 | |
| (eqv? 100000000 100000000)               ===>  <tt>#t</tt><br>
 | |
| (eqv? (cons 1 2) (cons 1 2))             ===>  <tt>#f</tt><br>
 | |
| (eqv? (lambda () 1)<br>
 | |
|       (lambda () 2))                     ===>  <tt>#f</tt><br>
 | |
| (eqv? #f 'nil)                          ===>  <tt>#f</tt><br>
 | |
| (let ((p (lambda (x) x)))<br>
 | |
|   (eqv? p p))                                 ===>  <tt>#t</tt><p></tt><p>
 | |
| 
 | |
| The following examples illustrate cases in which the above rules do
 | |
| not fully specify the behavior of <tt>eqv?</tt>.  All that can be said
 | |
| about such cases is that the value returned by <tt>eqv?</tt> must be a
 | |
| boolean.<p>
 | |
| 
 | |
| <tt><p>(eqv? "" "")                     ===>  <i>unspecified</i><br>
 | |
| (eqv? '#() '#())                 ===>  <i>unspecified</i><br>
 | |
| (eqv? (lambda (x) x)<br>
 | |
|       (lambda (x) x))            ===>  <i>unspecified</i><br>
 | |
| (eqv? (lambda (x) x)<br>
 | |
|       (lambda (y) y))            ===>  <i>unspecified</i><p></tt><p>
 | |
| 
 | |
| The next set of examples shows the use of <tt>eqv?</tt> with procedures
 | |
| that have local state.  <tt>Gen-counter</tt> must return a distinct
 | |
| procedure every time, since each procedure has its own internal counter.
 | |
| <tt>Gen-loser</tt>, however, returns equivalent procedures each time, since
 | |
| the local state does not affect the value or side effects of the
 | |
| procedures.<p>
 | |
| 
 | |
| <tt><p>(define gen-counter<br>
 | |
|   (lambda ()<br>
 | |
|     (let ((n 0))<br>
 | |
|       (lambda () (set! n (+ n 1)) n))))<br>
 | |
| (let ((g (gen-counter)))<br>
 | |
|   (eqv? g g))                   ===>  <tt>#t</tt><br>
 | |
| (eqv? (gen-counter) (gen-counter))<br>
 | |
|                                 ===>  <tt>#f</tt><br>
 | |
| (define gen-loser<br>
 | |
|   (lambda ()<br>
 | |
|     (let ((n 0))<br>
 | |
|       (lambda () (set! n (+ n 1)) 27))))<br>
 | |
| (let ((g (gen-loser)))<br>
 | |
|   (eqv? g g))                   ===>  <tt>#t</tt><br>
 | |
| (eqv? (gen-loser) (gen-loser))<br>
 | |
|                                 ===>  <i>unspecified</i><br>
 | |
| <br>
 | |
| (letrec ((f (lambda () (if (eqv? f g) 'both 'f)))<br>
 | |
|          (g (lambda () (if (eqv? f g) 'both 'g))))<br>
 | |
|   (eqv? f g))<br>
 | |
|                                 ===>  <i>unspecified</i><br>
 | |
| <br>
 | |
| (letrec ((f (lambda () (if (eqv? f g) 'f 'both)))<br>
 | |
|          (g (lambda () (if (eqv? f g) 'g 'both))))<br>
 | |
|   (eqv? f g))<br>
 | |
|                                 ===>  <tt>#f</tt><p></tt><p>
 | |
| 
 | |
| 
 | |
| Since it is an error to modify constant objects (those returned by
 | |
| literal expressions), implementations are permitted, though not
 | |
| required, to share structure between constants where appropriate.  Thus
 | |
| the value of <tt>eqv?</tt> on constants is sometimes
 | |
| implementation-dependent.<p>
 | |
| 
 | |
| <tt><p>(eqv? '(a) '(a))                         ===>  <i>unspecified</i><br>
 | |
| (eqv? "a" "a")                           ===>  <i>unspecified</i><br>
 | |
| (eqv? '(b) (cdr '(a b)))                 ===>  <i>unspecified</i><br>
 | |
| (let ((x '(a)))<br>
 | |
|   (eqv? x x))                            ===>  <tt>#t</tt><p></tt><p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em> 
 | |
| The above definition of <tt>eqv?</tt> allows implementations latitude in
 | |
| their treatment of procedures and literals:  implementations are free
 | |
| either to detect or to fail to detect that two procedures or two literals
 | |
| are equivalent to each other, and can decide whether or not to
 | |
| merge representations of equivalent objects by using the same pointer or
 | |
| bit pattern to represent both.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_216"></a>eq?<i> <i>obj<sub>1</sub></i> <i>obj<sub>2</sub></i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Eq?</tt> is similar to <tt>eqv?</tt> except that in some cases it is
 | |
| capable of discerning distinctions finer than those detectable by
 | |
| <tt>eqv?</tt>.<p>
 | |
| 
 | |
| <tt>Eq?</tt> and <tt>eqv?</tt> are guaranteed to have the same
 | |
| behavior on symbols, booleans, the empty list, pairs, procedures,
 | |
| and non-empty
 | |
| strings and vectors.  <tt>Eq?</tt>'s behavior on numbers and characters is
 | |
| implementation-dependent, but it will always return either true or
 | |
| false, and will return true only when <tt>eqv?</tt> would also return
 | |
| true.  <tt>Eq?</tt> may also behave differently from <tt>eqv?</tt> on empty
 | |
| vectors and empty strings.<p>
 | |
| 
 | |
| <tt><p>(eq? 'a 'a)                             ===>  <tt>#t</tt><br>
 | |
| (eq? '(a) '(a))                         ===>  <i>unspecified</i><br>
 | |
| (eq? (list 'a) (list 'a))               ===>  <tt>#f</tt><br>
 | |
| (eq? "a" "a")                           ===>  <i>unspecified</i><br>
 | |
| (eq? "" "")                             ===>  <i>unspecified</i><br>
 | |
| (eq? '() '())                           ===>  <tt>#t</tt><br>
 | |
| (eq? 2 2)                               ===>  <i>unspecified</i><br>
 | |
| (eq? #<tt>\</tt>A #<tt>\</tt>A)         ===>  <i>unspecified</i><br>
 | |
| (eq? car car)                           ===>  <tt>#t</tt><br>
 | |
| (let ((n (+ 2 3)))<br>
 | |
|   (eq? n n))              ===>  <i>unspecified</i><br>
 | |
| (let ((x '(a)))<br>
 | |
|   (eq? x x))              ===>  <tt>#t</tt><br>
 | |
| (let ((x '#()))<br>
 | |
|   (eq? x x))              ===>  <tt>#t</tt><br>
 | |
| (let ((p (lambda (x) x)))<br>
 | |
|   (eq? p p))              ===>  <tt>#t</tt><p></tt><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em> It will usually be possible to implement <tt>eq?</tt> much
 | |
| more efficiently than <tt>eqv?</tt>, for example, as a simple pointer
 | |
| comparison instead of as some more complicated operation.  One reason is
 | |
| that it may not be possible to compute <tt>eqv?</tt> of two numbers in
 | |
| constant time, whereas <tt>eq?</tt> implemented as pointer comparison will
 | |
| always finish in constant time.  <tt>Eq?</tt> may be used like <tt>eqv?</tt>
 | |
| in applications using procedures to implement objects with state since
 | |
| it obeys the same constraints as <tt>eqv?</tt>.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_218"></a>equal?<i> <i>obj<sub>1</sub></i> <i>obj<sub>2</sub></i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Equal?</tt> recursively compares the contents of pairs, vectors, and
 | |
| strings, applying <tt>eqv?</tt> on other objects such as numbers and symbols.
 | |
| A rule of thumb is that objects are generally <tt>equal?</tt> if they print
 | |
| the same.  <tt>Equal?</tt> may fail to terminate if its arguments are
 | |
| circular data structures.<p>
 | |
| 
 | |
| <tt><p>(equal? 'a 'a)                          ===>  <tt>#t</tt><br>
 | |
| (equal? '(a) '(a))                      ===>  <tt>#t</tt><br>
 | |
| (equal? '(a (b) c)<br>
 | |
|         '(a (b) c))                     ===>  <tt>#t</tt><br>
 | |
| (equal? "abc" "abc")                    ===>  <tt>#t</tt><br>
 | |
| (equal? 2 2)                            ===>  <tt>#t</tt><br>
 | |
| (equal? (make-vector 5 'a)<br>
 | |
|         (make-vector 5 'a))             ===>  <tt>#t</tt><br>
 | |
| (equal? (lambda (x) x)<br>
 | |
|         (lambda (y) y))          ===>  <i>unspecified</i><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.2"></a>
 | |
| <h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.2">6.2  Numbers</a></h2><p>
 | |
| 
 | |
| 
 | |
| <a name="%_idx_220"></a><p>
 | |
| 
 | |
| 
 | |
| 
 | |
| <p>
 | |
| 
 | |
| Numerical computation has traditionally been neglected by the Lisp
 | |
| community.  Until Common Lisp there was no carefully thought out
 | |
| strategy for organizing numerical computation, and with the exception of
 | |
| the MacLisp system [<a href="r5rs-Z-H-14.html#%_sec_7.3">20</a>] little effort was made to
 | |
| execute numerical code efficiently.  This report recognizes the excellent work
 | |
| of the Common Lisp committee and accepts many of their recommendations.
 | |
| In some ways this report simplifies and generalizes their proposals in a manner
 | |
| consistent with the purposes of Scheme.<p>
 | |
| 
 | |
| It is important to distinguish between the mathematical numbers, the
 | |
| Scheme numbers that attempt to model them, the machine representations
 | |
| used to implement the Scheme numbers, and notations used to write numbers.
 | |
| This report uses the types <i>number</i>, <i>complex</i>, <i>real</i>,
 | |
| <i>rational</i>, and <i>integer</i> to refer to both mathematical numbers
 | |
| and Scheme numbers.  Machine representations such as fixed point and
 | |
| floating point are referred to by names such as <i>fixnum</i> and
 | |
| <i>flonum</i>.<p>
 | |
| 
 | |
| 
 | |
| <a name="%_sec_6.2.1"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.2.1">6.2.1  Numerical types</a></h3><p>
 | |
| 
 | |
| 
 | |
| <a name="%_idx_222"></a><p>
 | |
| 
 | |
| 
 | |
| 
 | |
| Mathematically, numbers may be arranged into a tower of subtypes
 | |
| in which each level is a subset of the level above it:
 | |
| <p>
 | |
|          number <br>
 | |
|     complex <br>
 | |
|     real <br>
 | |
|     rational <br>
 | |
|     integer 
 | |
| <p><p>
 | |
| 
 | |
| For example, 3 is an integer.  Therefore 3 is also a rational,
 | |
| a real, and a complex.  The same is true of the Scheme numbers
 | |
| that model 3.  For Scheme numbers, these types are defined by the
 | |
| predicates <tt>number?</tt>, <tt>complex?</tt>, <tt>real?</tt>, <tt>rational?</tt>,
 | |
| and <tt>integer?</tt>.<p>
 | |
| 
 | |
| There is no simple relationship between a number's type and its
 | |
| representation inside a computer.  Although most implementations of
 | |
| Scheme will offer at least two different representations of 3, these
 | |
| different representations denote the same integer.<p>
 | |
| 
 | |
| 
 | |
| Scheme's numerical operations treat numbers as abstract data, as
 | |
| independent of their representation as possible.  Although an implementation
 | |
| of Scheme may use fixnum, flonum, and perhaps other representations for
 | |
| numbers, this should not be apparent to a casual programmer writing
 | |
| simple programs.<p>
 | |
| 
 | |
| It is necessary, however, to distinguish between numbers that are
 | |
| represented exactly and those that may not be.  For example, indexes
 | |
| into data structures must be known exactly, as must some polynomial
 | |
| coefficients in a symbolic algebra system.  On the other hand, the
 | |
| results of measurements are inherently inexact, and irrational numbers
 | |
| may be approximated by rational and therefore inexact approximations.
 | |
| In order to catch uses of inexact numbers where exact numbers are
 | |
| required, Scheme explicitly distinguishes exact from inexact numbers.
 | |
| This distinction is orthogonal to the dimension of type.<p>
 | |
| 
 | |
| <a name="%_sec_6.2.2"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.2.2">6.2.2  Exactness</a></h3><p>
 | |
| 
 | |
| 
 | |
| <a name="%_idx_224"></a> 
 | |
| Scheme numbers are either <i>exact</i> or <i>inexact</i>.  A number is
 | |
| exact if it was written as an exact constant or was derived from
 | |
| exact numbers using only exact operations.  A number is
 | |
| inexact if it was written as an inexact constant,
 | |
| if it was
 | |
| derived using inexact ingredients, or if it was derived using
 | |
| inexact operations. Thus inexactness is a contagious
 | |
| property of a number.
 | |
| 
 | |
| If two implementations produce exact results for a
 | |
| computation that did not involve inexact intermediate results,
 | |
| the two ultimate results will be mathematically equivalent.  This is
 | |
| generally not true of computations involving inexact numbers
 | |
| since approximate methods such as floating point arithmetic may be used,
 | |
| but it is the duty of each implementation to make the result as close as
 | |
| practical to the mathematically ideal result.<p>
 | |
| 
 | |
| Rational operations such as <tt>+</tt> should always produce
 | |
| exact results when given exact arguments.
 | |
| If the operation is unable to produce an exact result,
 | |
| then it may either report the violation of an implementation restriction
 | |
| or it may silently coerce its
 | |
| result to an inexact value.
 | |
| See section <a href="#%_sec_6.2.3">6.2.3</a>.<p>
 | |
| 
 | |
| With the exception of <tt>inexact->exact</tt>, the operations described in
 | |
| this section must generally return inexact results when given any inexact
 | |
| arguments.  An operation may, however, return an exact result if it can
 | |
| prove that the value of the result is unaffected by the inexactness of its
 | |
| arguments.  For example, multiplication of any number by an exact zero
 | |
| may produce an exact zero result, even if the other argument is
 | |
| inexact.<p>
 | |
| 
 | |
| <a name="%_sec_6.2.3"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.2.3">6.2.3  Implementation restrictions</a></h3><p>
 | |
| 
 | |
| <a name="%_idx_226"></a><p>
 | |
| 
 | |
| Implementations of Scheme are not required to implement the whole
 | |
| tower of subtypes given in section <a href="#%_sec_6.2.1">6.2.1</a>,
 | |
| but they must implement a coherent subset consistent with both the
 | |
| purposes of the implementation and the spirit of the Scheme language.
 | |
| For example, an implementation in which all numbers are real
 | |
| may still be quite useful.<p>
 | |
| 
 | |
| Implementations may also support only a limited range of numbers of
 | |
| any type, subject to the requirements of this section.  The supported
 | |
| range for exact numbers of any type may be different from the
 | |
| supported range for inexact numbers of that type.  For example,
 | |
| an implementation that uses flonums to represent all its
 | |
| inexact real numbers may
 | |
| support a practically unbounded range of exact integers
 | |
| and rationals
 | |
| while limiting the range of inexact reals (and therefore
 | |
| the range of inexact integers and rationals)
 | |
| to the dynamic range of the flonum format.
 | |
| Furthermore
 | |
| the gaps between the representable inexact integers and
 | |
| rationals are
 | |
| likely to be very large in such an implementation as the limits of this
 | |
| range are approached.<p>
 | |
| 
 | |
| An implementation of Scheme must support exact integers
 | |
| throughout the range of numbers that may be used for indexes of
 | |
| lists, vectors, and strings or that may result from computing the length of a
 | |
| list, vector, or string.  The <tt>length</tt>, <tt>vector-length</tt>,
 | |
| and <tt>string-length</tt> procedures must return an exact
 | |
| integer, and it is an error to use anything but an exact integer as an
 | |
| index.  Furthermore any integer constant within the index range, if
 | |
| expressed by an exact integer syntax, will indeed be read as an exact
 | |
| integer, regardless of any implementation restrictions that may apply
 | |
| outside this range.  Finally, the procedures listed below will always
 | |
| return an exact integer result provided all their arguments are exact integers
 | |
| and the mathematically expected result is representable as an exact integer
 | |
| within the implementation:<p>
 | |
| 
 | |
| <tt><p>+            -             *<br>
 | |
| quotient     remainder     modulo<br>
 | |
| max          min           abs<br>
 | |
| numerator    denominator   gcd<br>
 | |
| lcm          floor         ceiling<br>
 | |
| truncate     round         rationalize<br>
 | |
| expt<p></tt><p>
 | |
| 
 | |
| Implementations are encouraged, but not required, to support
 | |
| exact integers and exact rationals of
 | |
| practically unlimited size and precision, and to implement the
 | |
| above procedures and the <tt>/</tt> procedure in
 | |
| such a way that they always return exact results when given exact
 | |
| arguments.  If one of these procedures is unable to deliver an exact
 | |
| result when given exact arguments, then it may either report a
 | |
| violation of an
 | |
| implementation restriction or it may silently coerce its result to an
 | |
| inexact number.  Such a coercion may cause an error later.<p>
 | |
| 
 | |
| 
 | |
| An implementation may use floating point and other approximate 
 | |
| representation strategies for inexact numbers.
 | |
| This report recommends, but does not require, that the IEEE 32-bit
 | |
| and 64-bit floating point standards be followed by implementations that use
 | |
| flonum representations, and that implementations using
 | |
| other representations should match or exceed the precision achievable
 | |
| using these floating point standards [<a href="r5rs-Z-H-14.html#%_sec_7.3">12</a>].<p>
 | |
| 
 | |
| In particular, implementations that use flonum representations
 | |
| must follow these rules: A flonum result
 | |
| must be represented with at least as much precision as is used to express any of
 | |
| the inexact arguments to that operation.  It is desirable (but not required) for
 | |
| potentially inexact operations such as <tt>sqrt</tt>, when applied to exact
 | |
| arguments, to produce exact answers whenever possible (for example the
 | |
| square root of an exact 4 ought to be an exact 2).
 | |
| If, however, an
 | |
| exact number is operated upon so as to produce an inexact result
 | |
| (as by <tt>sqrt</tt>), and if the result is represented as a flonum, then
 | |
| the most precise flonum format available must be used; but if the result
 | |
| is represented in some other way then the representation must have at least as
 | |
| much precision as the most precise flonum format available.<p>
 | |
| 
 | |
| Although Scheme allows a variety of written
 | |
| notations for
 | |
| numbers, any particular implementation may support only some of them.
 | |
| For example, an implementation in which all numbers are real
 | |
| need not support the rectangular and polar notations for complex
 | |
| numbers.  If an implementation encounters an exact numerical constant that
 | |
| it cannot represent as an exact number, then it may either report a
 | |
| violation of an implementation restriction or it may silently represent the
 | |
| constant by an inexact number.<p>
 | |
| 
 | |
| <a name="%_sec_6.2.4"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.2.4">6.2.4  Syntax of numerical constants</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| 
 | |
| 
 | |
| The syntax of the written representations for numbers is described formally in
 | |
| section <a href="r5rs-Z-H-10.html#%_sec_7.1.1">7.1.1</a>.  Note that case is not significant in numerical
 | |
| constants.<p>
 | |
| 
 | |
| 
 | |
| A number may be written in binary, octal, decimal, or
 | |
| hexadecimal by the use of a radix prefix.  The radix prefixes are <tt>#b</tt><a name="%_idx_228"></a> (binary), <tt>#o</tt><a name="%_idx_230"></a> (octal), <tt>#d</tt><a name="%_idx_232"></a> (decimal), and <tt>#x</tt><a name="%_idx_234"></a> (hexadecimal).  With
 | |
| no radix prefix, a number is assumed to be expressed in decimal.<p>
 | |
| 
 | |
| A
 | |
| numerical constant may be specified to be either exact or
 | |
| inexact by a prefix.  The prefixes are <tt>#e</tt><a name="%_idx_236"></a>
 | |
| for exact, and <tt>#i</tt><a name="%_idx_238"></a> for inexact.  An exactness
 | |
| prefix may appear before or after any radix prefix that is used.  If
 | |
| the written representation of a number has no exactness prefix, the
 | |
| constant may be either inexact or exact.  It is
 | |
| inexact if it contains a decimal point, an
 | |
| exponent, or a ``<tt>#</tt>'' character in the place of a digit,
 | |
| otherwise it is exact.
 | |
| 
 | |
| In systems with inexact numbers
 | |
| of varying precisions it may be useful to specify
 | |
| the precision of a constant.  For this purpose, numerical constants
 | |
| may be written with an exponent marker that indicates the
 | |
| desired precision of the inexact
 | |
| representation.  The letters <tt>s</tt>, <tt>f</tt>,
 | |
| <tt>d</tt>, and <tt>l</tt> specify the use of <i>short</i>, <i>single</i>,
 | |
| <i>double</i>, and <i>long</i> precision, respectively.  (When fewer
 | |
| than four internal
 | |
| inexact
 | |
| representations exist, the four size
 | |
| specifications are mapped onto those available.  For example, an
 | |
| implementation with two internal representations may map short and
 | |
| single together and long and double together.)  In addition, the
 | |
| exponent marker <tt>e</tt> specifies the default precision for the
 | |
| implementation.  The default precision has at least as much precision
 | |
| as <i>double</i>, but
 | |
| implementations may wish to allow this default to be set by the user.<p>
 | |
| 
 | |
| <tt><p>3.14159265358979F0<br>
 | |
|         Round to single --- 3.141593<br>
 | |
| 0.6L0<br>
 | |
|         Extend to long --- .600000000000000<p></tt><p>
 | |
| 
 | |
| <a name="%_sec_6.2.5"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.2.5">6.2.5  Numerical operations</a></h3><p>
 | |
| 
 | |
| The reader is referred to section <a href="r5rs-Z-H-4.html#%_sec_1.3.3">1.3.3</a> for a summary
 | |
| of the naming conventions used to specify restrictions on the types of
 | |
| arguments to numerical routines.
 | |
| The examples used in this section assume that any numerical constant written
 | |
| using an exact notation is indeed represented as an exact
 | |
| number.  Some examples also assume that certain numerical constants written
 | |
| using an inexact notation can be represented without loss of
 | |
| accuracy; the inexact constants were chosen so that this is
 | |
| likely to be true in implementations that use flonums to represent
 | |
| inexact numbers.<p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_240"></a>number?<i> obj</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_242"></a>complex?<i> obj</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_244"></a>real?<i> obj</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_246"></a>rational?<i> obj</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_248"></a>integer?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These numerical type predicates can be applied to any kind of
 | |
| argument, including non-numbers.  They return <tt>#t</tt> if the object is
 | |
| of the named type, and otherwise they return <tt>#f</tt>.
 | |
| In general, if a type predicate is true of a number then all higher
 | |
| type predicates are also true of that number.  Consequently, if a type
 | |
| predicate is false of a number, then all lower type predicates are
 | |
| also false of that number.
 | |
| 
 | |
| If <em>z</em> is an inexact complex number, then <tt>(real? <em>z</em>)</tt> is true if
 | |
| and only if <tt>(zero? (imag-part <em>z</em>))</tt> is true.  If <em>x</em> is an inexact
 | |
| real number, then <tt>(integer? <em>x</em>)</tt> is true if and only if
 | |
| <tt>(= <em>x</em> (round <em>x</em>))</tt>.<p>
 | |
| 
 | |
| <tt><p>(complex? 3+4i)                 ===>  <tt>#t</tt><br>
 | |
| (complex? 3)                    ===>  <tt>#t</tt><br>
 | |
| (real? 3)                       ===>  <tt>#t</tt><br>
 | |
| (real? -2.5+0.0i)               ===>  <tt>#t</tt><br>
 | |
| (real? #e1e10)                  ===>  <tt>#t</tt><br>
 | |
| (rational? 6/10)                ===>  <tt>#t</tt><br>
 | |
| (rational? 6/3)                 ===>  <tt>#t</tt><br>
 | |
| (integer? 3+0i)                 ===>  <tt>#t</tt><br>
 | |
| (integer? 3.0)                  ===>  <tt>#t</tt><br>
 | |
| (integer? 8/4)                  ===>  <tt>#t</tt><p></tt><p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| The behavior of these type predicates on inexact numbers
 | |
| is unreliable, since any inaccuracy may affect the result.
 | |
| </blockquote><p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| In many implementations the <tt>rational?</tt> procedure will be the same
 | |
| as <tt>real?</tt>, and the <tt>complex?</tt> procedure will be the same as
 | |
| <tt>number?</tt>, but unusual implementations may be able to represent
 | |
| some irrational numbers exactly or may extend the number system to
 | |
| support some kind of non-complex numbers.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_250"></a>exact?<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_252"></a>inexact?<i> <em>z</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These numerical predicates provide tests for the exactness of a
 | |
| quantity.  For any Scheme number, precisely one of these predicates
 | |
| is true.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_254"></a>=<i> <em>z</em><sub>1</sub> <em>z</em><sub>2</sub> <em>z</em><sub>3</sub> <tt>...</tt></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_256"></a><<i> <em>x</em><sub>1</sub> <em>x</em><sub>2</sub> <em>x</em><sub>3</sub> <tt>...</tt></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_258"></a>><i> <em>x</em><sub>1</sub> <em>x</em><sub>2</sub> <em>x</em><sub>3</sub> <tt>...</tt></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_260"></a><=<i> <em>x</em><sub>1</sub> <em>x</em><sub>2</sub> <em>x</em><sub>3</sub> <tt>...</tt></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_262"></a>>=<i> <em>x</em><sub>1</sub> <em>x</em><sub>2</sub> <em>x</em><sub>3</sub> <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures return <tt>#t</tt> if their arguments are (respectively):
 | |
| equal, monotonically increasing, monotonically decreasing,
 | |
| monotonically nondecreasing, or monotonically nonincreasing.<p>
 | |
| 
 | |
| These predicates are required to be transitive.<p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| The traditional implementations of these predicates in Lisp-like
 | |
| languages are not transitive.
 | |
| </blockquote><p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| While it is not an error to compare inexact numbers using these
 | |
| predicates, the results may be unreliable because a small inaccuracy
 | |
| may affect the result; this is especially true of <tt>=</tt> and <tt>zero?</tt>.
 | |
| When in doubt, consult a numerical analyst.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_264"></a>zero?<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_266"></a>positive?<i> <em>x</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_268"></a>negative?<i> <em>x</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_270"></a>odd?<i> <em>n</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_272"></a>even?<i> <em>n</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These numerical predicates test a number for a particular property,
 | |
| returning <tt>#t</tt> or <tt>#f</tt>.  See note above.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_274"></a>max<i> <em>x</em><sub>1</sub> <em>x</em><sub>2</sub> <tt>...</tt></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_276"></a>min<i> <em>x</em><sub>1</sub> <em>x</em><sub>2</sub> <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures return the maximum or minimum of their arguments.<p>
 | |
| 
 | |
| <tt><p>(max 3 4)                      ===>  4    ; exact<br>
 | |
| (max 3.9 4)                    ===>  4.0  ; inexact<p></tt><p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| If any argument is inexact, then the result will also be inexact (unless
 | |
| the procedure can prove that the inaccuracy is not large enough to affect the
 | |
| result, which is possible only in unusual implementations).  If <tt>min</tt> or
 | |
| <tt>max</tt> is used to compare numbers of mixed exactness, and the numerical
 | |
| value of the result cannot be represented as an inexact number without loss of
 | |
| accuracy, then the procedure may report a violation of an implementation
 | |
| restriction.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_278"></a>+<i> <em>z</em><sub>1</sub> <tt>...</tt></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_280"></a>*<i> <em>z</em><sub>1</sub> <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures return the sum or product of their arguments.
 | |
| 
 | |
| <tt><p>(+ 3 4)                         ===>  7<br>
 | |
| (+ 3)                           ===>  3<br>
 | |
| (+)                             ===>  0<br>
 | |
| (* 4)                           ===>  4<br>
 | |
| (*)                             ===>  1<p></tt> <p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_282"></a>-<i> <em>z</em><sub>1</sub> <em>z</em><sub>2</sub></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(-<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>optional procedure:</u>  <tt>(-<i> <em>z</em><sub>1</sub> <em>z</em><sub>2</sub> <tt>...</tt></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_284"></a>/<i> <em>z</em><sub>1</sub> <em>z</em><sub>2</sub></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(/<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>optional procedure:</u>  <tt>(/<i> <em>z</em><sub>1</sub> <em>z</em><sub>2</sub> <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| With two or more arguments, these procedures return the difference or
 | |
| quotient of their arguments, associating to the left.  With one argument,
 | |
| however, they return the additive or multiplicative inverse of their argument.
 | |
| 
 | |
| <tt><p>(- 3 4)                         ===>  -1<br>
 | |
| (- 3 4 5)                       ===>  -6<br>
 | |
| (- 3)                           ===>  -3<br>
 | |
| (/ 3 4 5)                       ===>  3/20<br>
 | |
| (/ 3)                           ===>  1/3<p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_286"></a>abs<i> x</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Abs</tt> returns the absolute value of its argument.  
 | |
| <tt><p>(abs -7)                        ===>  7<br>
 | |
| <p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_288"></a>quotient<i> <em>n</em><sub>1</sub> <em>n</em><sub>2</sub></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_290"></a>remainder<i> <em>n</em><sub>1</sub> <em>n</em><sub>2</sub></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_292"></a>modulo<i> <em>n</em><sub>1</sub> <em>n</em><sub>2</sub></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures implement number-theoretic (integer)
 | |
| division.  <em>n</em><sub>2</sub> should be non-zero.  All three procedures
 | |
| return integers.  If <em>n</em><sub>1</sub>/<em>n</em><sub>2</sub> is an integer:
 | |
| <tt><p>    (quotient <em>n</em><sub>1</sub> <em>n</em><sub>2</sub>)           ===> <em>n</em><sub>1</sub>/<em>n</em><sub>2</sub><br>
 | |
|     (remainder <em>n</em><sub>1</sub> <em>n</em><sub>2</sub>)          ===> 0<br>
 | |
|     (modulo <em>n</em><sub>1</sub> <em>n</em><sub>2</sub>)             ===> 0<br>
 | |
| <p></tt>
 | |
| If <em>n</em><sub>1</sub>/<em>n</em><sub>2</sub> is not an integer:
 | |
| <tt><p>    (quotient <em>n</em><sub>1</sub> <em>n</em><sub>2</sub>)           ===> <em>n</em><sub><em>q</em></sub><br>
 | |
|     (remainder <em>n</em><sub>1</sub> <em>n</em><sub>2</sub>)          ===> <em>n</em><sub><em>r</em></sub><br>
 | |
|     (modulo <em>n</em><sub>1</sub> <em>n</em><sub>2</sub>)             ===> <em>n</em><sub><em>m</em></sub><br>
 | |
| <p></tt>
 | |
| where <em>n</em><sub><em>q</em></sub> is <em>n</em><sub>1</sub>/<em>n</em><sub>2</sub> rounded towards zero,
 | |
| 0 < |<em>n</em><sub><em>r</em></sub>| < |<em>n</em><sub>2</sub>|, 0 < |<em>n</em><sub><em>m</em></sub>| < |<em>n</em><sub>2</sub>|,
 | |
| <em>n</em><sub><em>r</em></sub> and <em>n</em><sub><em>m</em></sub> differ from <em>n</em><sub>1</sub> by a multiple of <em>n</em><sub>2</sub>,
 | |
| <em>n</em><sub><em>r</em></sub> has the same sign as <em>n</em><sub>1</sub>, and
 | |
| <em>n</em><sub><em>m</em></sub> has the same sign as <em>n</em><sub>2</sub>.<p>
 | |
| 
 | |
| From this we can conclude that for integers <em>n</em><sub>1</sub> and <em>n</em><sub>2</sub> with
 | |
| <em>n</em><sub>2</sub> not equal to 0,
 | |
| <tt><p>     (= <em>n</em><sub>1</sub> (+ (* <em>n</em><sub>2</sub> (quotient <em>n</em><sub>1</sub> <em>n</em><sub>2</sub>))<br>
 | |
|            (remainder <em>n</em><sub>1</sub> <em>n</em><sub>2</sub>)))<br>
 | |
|                                          ===>  <tt>#t</tt><p></tt>
 | |
| provided all numbers involved in that computation are exact.<p>
 | |
| 
 | |
| <tt><p>(modulo 13 4)                   ===>  1<br>
 | |
| (remainder 13 4)                ===>  1<br>
 | |
| <br>
 | |
| (modulo -13 4)                  ===>  3<br>
 | |
| (remainder -13 4)               ===>  -1<br>
 | |
| <br>
 | |
| (modulo 13 -4)                  ===>  -3<br>
 | |
| (remainder 13 -4)               ===>  1<br>
 | |
| <br>
 | |
| (modulo -13 -4)                 ===>  -1<br>
 | |
| (remainder -13 -4)              ===>  -1<br>
 | |
| <br>
 | |
| (remainder -13 -4.0)            ===>  -1.0  ; inexact<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_294"></a>gcd<i> <em>n</em><sub>1</sub> <tt>...</tt></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_296"></a>lcm<i> <em>n</em><sub>1</sub> <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures return the greatest common divisor or least common
 | |
| multiple of their arguments.  The result is always non-negative.
 | |
| 
 | |
| <tt><p>(gcd 32 -36)                    ===>  4<br>
 | |
| (gcd)                           ===>  0<br>
 | |
| (lcm 32 -36)                    ===>  288<br>
 | |
| (lcm 32.0 -36)                  ===>  288.0  ; inexact<br>
 | |
| (lcm)                           ===>  1<p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_298"></a>numerator<i> <em>q</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_300"></a>denominator<i> <em>q</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures return the numerator or denominator of their
 | |
| argument; the result is computed as if the argument was represented as
 | |
| a fraction in lowest terms.  The denominator is always positive.  The
 | |
| denominator of 0 is defined to be 1.
 | |
| 
 | |
| <tt><p>(numerator (/ 6 4))          ===>  3<br>
 | |
| (denominator (/ 6 4))          ===>  2<br>
 | |
| (denominator<br>
 | |
|   (exact->inexact (/ 6 4)))         ===> 2.0<p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_302"></a>floor<i> x</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_304"></a>ceiling<i> x</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_306"></a>truncate<i> x</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_308"></a>round<i> x</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures return integers.
 | |
| <tt>Floor</tt> returns the largest integer not larger than <em>x</em>.
 | |
| <tt>Ceiling</tt> returns the smallest integer not smaller than <em>x</em>.
 | |
| <tt>Truncate</tt> returns the integer closest to <em>x</em> whose absolute
 | |
| value is not larger than the absolute value of <em>x</em>.  <tt>Round</tt> returns the
 | |
| closest integer to <em>x</em>, rounding to even when <em>x</em> is halfway between two
 | |
| integers.<p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em>
 | |
| <tt>Round</tt> rounds to even for consistency with the default rounding
 | |
| mode specified by the IEEE floating point standard.
 | |
| </blockquote><p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| If the argument to one of these procedures is inexact, then the result
 | |
| will also be inexact.  If an exact value is needed, the
 | |
| result should be passed to the <tt>inexact->exact</tt> procedure.
 | |
| </blockquote><p>
 | |
| 
 | |
| <tt><p>(floor -4.3)                  ===>  -5.0<br>
 | |
| (ceiling -4.3)                ===>  -4.0<br>
 | |
| (truncate -4.3)               ===>  -4.0<br>
 | |
| (round -4.3)                  ===>  -4.0<br>
 | |
| <br>
 | |
| (floor 3.5)                   ===>  3.0<br>
 | |
| (ceiling 3.5)                 ===>  4.0<br>
 | |
| (truncate 3.5)                ===>  3.0<br>
 | |
| (round 3.5)                   ===>  4.0  ; inexact<br>
 | |
| <br>
 | |
| (round 7/2)                   ===>  4    ; exact<br>
 | |
| (round 7)                     ===>  7<p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_310"></a>rationalize<i> x y</i>)</tt> </div>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <tt>Rationalize</tt> returns the <em>simplest</em> rational number
 | |
| differing from <em>x</em> by no more than <em>y</em>.  A rational number <em>r</em><sub>1</sub> is
 | |
| <em>simpler</em> <a name="%_idx_312"></a> than another rational number
 | |
| <em>r</em><sub>2</sub> if <em>r</em><sub>1</sub>  =  <em>p</em><sub>1</sub>/<em>q</em><sub>1</sub> and <em>r</em><sub>2</sub>  =  <em>p</em><sub>2</sub>/<em>q</em><sub>2</sub> (in lowest terms) and |<em>p</em><sub>1</sub>|
 | |
| <u><</u> |<em>p</em><sub>2</sub>| and |<em>q</em><sub>1</sub>| <u><</u> |<em>q</em><sub>2</sub>|.  Thus 3/5 is simpler than 4/7.
 | |
| Although not all rationals are comparable in this ordering (consider 2/7
 | |
| and 3/5) any interval contains a rational number that is simpler than
 | |
| every other rational number in that interval (the simpler 2/5 lies
 | |
| between 2/7 and 3/5).  Note that 0  =  0/1 is the simplest rational of
 | |
| all.<p>
 | |
| 
 | |
| <tt><p>(rationalize<br>
 | |
|   (inexact->exact .3) 1/10)          ===> 1/3    ; exact<br>
 | |
| (rationalize .3 1/10)                ===> #i1/3  ; inexact<p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_314"></a>exp<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_316"></a>log<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_318"></a>sin<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_320"></a>cos<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_322"></a>tan<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_324"></a>asin<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_326"></a>acos<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_328"></a>atan<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(atan<i> <em>y</em> <em>x</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures are part of every implementation that supports
 | |
| general
 | |
| real numbers; they compute the usual transcendental functions.  <tt>Log</tt>
 | |
| computes the natural logarithm of <em>z</em> (not the base ten logarithm).
 | |
| <tt>Asin</tt>, <tt>acos</tt>, and <tt>atan</tt> compute arcsine (<tt>sin</tt><sup>-1</sup>),
 | |
| arccosine (<tt>cos</tt><sup>-1</sup>), and arctangent (<tt>tan</tt><sup>-1</sup>), respectively.
 | |
| The two-argument variant of <tt>atan</tt> computes <tt>(angle
 | |
| (make-rectangular <em>x</em> <em>y</em>))</tt> (see below), even in implementations
 | |
| that don't support general complex numbers.<p>
 | |
| 
 | |
| In general, the mathematical functions log, arcsine, arccosine, and
 | |
| arctangent are multiply defined.
 | |
| The value of <tt>log</tt> <em>z</em> is defined to be the one whose imaginary
 | |
| part lies in the range from  - <img src="r5rs-Z-G-D-3.gif" border="0"> (exclusive) to <img src="r5rs-Z-G-D-3.gif" border="0"> (inclusive).
 | |
| <tt>log</tt> 0 is undefined.
 | |
| With <tt>log</tt> defined this way, the values of <tt>sin</tt><sup>-1</sup> <em>z</em>, <tt>cos</tt><sup>-1</sup> <em>z</em>,
 | |
| and <tt>tan</tt><sup>-1</sup> <em>z</em> are according to the following formulæ:
 | |
| <p><div align=left><table><tr><td><tt>sin</tt><sup>-1</sup> <em>z</em>  =   - <em>i</em> <tt>log</tt> (<em>i</em> <em>z</em>  +  (1  -  <em>z</em><sup>2</sup>)<sup>1/2</sup>)</td></tr></table></div><p>
 | |
| <p><div align=left><table><tr><td><tt>cos</tt><sup>-1</sup> <em>z</em>  =  <img src="r5rs-Z-G-D-3.gif" border="0"> / 2  -  <tt>sin</tt><sup>-1</sup> <em>z</em></td></tr></table></div><p>
 | |
| <p><div align=left><table><tr><td><tt>tan</tt><sup>-1</sup> <em>z</em>  =  (<tt>log</tt> (1  +  <em>i</em> <em>z</em>)  -  <tt>log</tt> (1  -  <em>i</em> <em>z</em>)) / (2 <em>i</em>)</td></tr></table></div><p><p>
 | |
| 
 | |
| The above specification follows [<a href="r5rs-Z-H-14.html#%_sec_7.3">27</a>], which in turn
 | |
| cites [<a href="r5rs-Z-H-14.html#%_sec_7.3">19</a>]; refer to these sources for more detailed
 | |
| discussion of branch cuts, boundary conditions, and implementation of
 | |
| these functions.  When it is possible these procedures produce a real
 | |
| result from a real argument.<p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_330"></a>sqrt<i> <em>z</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the principal square root of <em>z</em>.  The result will have
 | |
| either positive real part, or zero real part and non-negative imaginary
 | |
| part.
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_332"></a>expt<i> <em>z</em><sub>1</sub> <em>z</em><sub>2</sub></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <em>z</em><sub>1</sub> raised to the power <em>z</em><sub>2</sub>.  For <em>z</em><sub>1</sub> <img src="r5rs-Z-G-D-8.gif" border="0"> 0
 | |
| <p><div align=left><table><tr><td><em>z</em><sub>1</sub><sup><em>z</em><sub>2</sub></sup>  =  <em>e</em><sup><em>z</em><sub>2</sub> <tt>log</tt> <em>z</em><sub>1</sub></sup></td></tr></table></div><p>
 | |
| 0<sup><em>z</em></sup> is 1 if <em>z</em>  =  0 and 0 otherwise.
 | |
| <p><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_334"></a>make-rectangular<i> <em>x</em><sub>1</sub> <em>x</em><sub>2</sub></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_336"></a>make-polar<i> <em>x</em><sub>3</sub> <em>x</em><sub>4</sub></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_338"></a>real-part<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_340"></a>imag-part<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_342"></a>magnitude<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_344"></a>angle<i> <em>z</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures are part of every implementation that supports
 | |
| general
 | |
| complex numbers.  Suppose <em>x</em><sub>1</sub>, <em>x</em><sub>2</sub>, <em>x</em><sub>3</sub>, and <em>x</em><sub>4</sub> are
 | |
| real numbers and <em>z</em> is a complex number such that
 | |
| <p><div align=left><table><tr><td> <em>z</em>  =  <em>x</em><sub>1</sub>  +  <em>x</em><sub>2</sub><em>i</em>
 | |
|  =  <em>x</em><sub>3</sub>  ·  <em>e</em><sup><em>i</em> <em>x</em><sub>4</sub></sup></td></tr></table></div><p>
 | |
| Then
 | |
| <tt><p>(make-rectangular <em>x</em><sub>1</sub> <em>x</em><sub>2</sub>)         ===> <em>z</em><br>
 | |
| (make-polar <em>x</em><sub>3</sub> <em>x</em><sub>4</sub>)             ===> <em>z</em><br>
 | |
| (real-part <em>z</em>)                          ===> <em>x</em><sub>1</sub><br>
 | |
| (imag-part <em>z</em>)                          ===> <em>x</em><sub>2</sub><br>
 | |
| (magnitude <em>z</em>)                          ===> |<em>x</em><sub>3</sub>|<br>
 | |
| (angle <em>z</em>)                              ===> <em>x</em><sub><em>a</em><em>n</em><em>g</em><em>l</em><em>e</em></sub><br>
 | |
| <p></tt>
 | |
| where  - <img src="r5rs-Z-G-D-3.gif" border="0"> < <em>x</em><sub><em>a</em><em>n</em><em>g</em><em>l</em><em>e</em></sub> <u><</u> <img src="r5rs-Z-G-D-3.gif" border="0"> with <em>x</em><sub><em>a</em><em>n</em><em>g</em><em>l</em><em>e</em></sub>  =  <em>x</em><sub>4</sub>  +  2<img src="r5rs-Z-G-D-3.gif" border="0"> <em>n</em>
 | |
| for some integer <em>n</em>.<p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em>
 | |
| <tt>Magnitude</tt> is the same as <tt>abs</tt> for a real argument,
 | |
| but <tt>abs</tt> must be present in all implementations, whereas
 | |
| <tt>magnitude</tt> need only be present in implementations that support
 | |
| general complex numbers.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_346"></a>exact->inexact<i> <em>z</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_348"></a>inexact->exact<i> <em>z</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Exact->inexact</tt> returns an inexact representation of <em>z</em>.
 | |
| The value returned is the
 | |
| inexact number that is numerically closest to the argument.  
 | |
| If an exact argument has no reasonably close inexact equivalent,
 | |
| then a violation of an implementation restriction may be reported.<p>
 | |
| 
 | |
| <tt>Inexact->exact</tt> returns an exact representation of
 | |
| <em>z</em>.  The value returned is the exact number that is numerically
 | |
| closest to the argument.
 | |
| If an inexact argument has no reasonably close exact equivalent,
 | |
| then a violation of an implementation restriction may be reported.<p>
 | |
| 
 | |
| 
 | |
| These procedures implement the natural one-to-one correspondence between
 | |
| exact and inexact integers throughout an
 | |
| implementation-dependent range.  See section <a href="#%_sec_6.2.3">6.2.3</a>.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><p><p>
 | |
| 
 | |
| <a name="%_sec_6.2.6"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.2.6">6.2.6  Numerical input and output</a></h3><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_350"></a>number->string<i> z</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(number->string<i> z radix</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <em>R</em><em>a</em><em>d</em><em>i</em><em>x</em> must be an exact integer, either 2, 8, 10, or 16.  If omitted,
 | |
| <em>r</em><em>a</em><em>d</em><em>i</em><em>x</em> defaults to 10.
 | |
| The procedure <tt>number->string</tt> takes a
 | |
| number and a radix and returns as a string an external representation of
 | |
| the given number in the given radix such that
 | |
| <tt><p>(let ((number <em>n</em><em>u</em><em>m</em><em>b</em><em>e</em><em>r</em>)<br>
 | |
|       (radix <em>r</em><em>a</em><em>d</em><em>i</em><em>x</em>))<br>
 | |
|   (eqv? number<br>
 | |
|         (string->number (number->string number<br>
 | |
|                                         radix)<br>
 | |
|                         radix)))<br>
 | |
| <p></tt>
 | |
| is true.  It is an error if no possible result makes this expression true.<p>
 | |
| 
 | |
| If <em>z</em> is inexact, the radix is 10, and the above expression
 | |
| can be satisfied by a result that contains a decimal point,
 | |
| then the result contains a decimal point and is expressed using the
 | |
| minimum number of digits (exclusive of exponent and trailing
 | |
| zeroes) needed to make the above expression
 | |
| true [<a href="r5rs-Z-H-14.html#%_sec_7.3">3</a>, <a href="r5rs-Z-H-14.html#%_sec_7.3">5</a>];
 | |
| otherwise the format of the result is unspecified.<p>
 | |
| 
 | |
| The result returned by <tt>number->string</tt>
 | |
| never contains an explicit radix prefix.<p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| The error case can occur only when <em>z</em> is not a complex number
 | |
| or is a complex number with a non-rational real or imaginary part.
 | |
| </blockquote><p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em>
 | |
| If <em>z</em> is an inexact number represented using flonums, and
 | |
| the radix is 10, then the above expression is normally satisfied by
 | |
| a result containing a decimal point.  The unspecified case
 | |
| allows for infinities, NaNs, and non-flonum representations.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_352"></a>string->number<i> string</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(string->number<i> string radix</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| Returns a number of the maximally precise representation expressed by the
 | |
| given <em>s</em><em>t</em><em>r</em><em>i</em><em>n</em><em>g</em>.  <em>R</em><em>a</em><em>d</em><em>i</em><em>x</em> must be an exact integer, either 2, 8, 10,
 | |
| or 16.  If supplied, <em>r</em><em>a</em><em>d</em><em>i</em><em>x</em> is a default radix that may be overridden
 | |
| by an explicit radix prefix in <em>s</em><em>t</em><em>r</em><em>i</em><em>n</em><em>g</em> (e.g. <tt>"#o177"</tt>).  If <em>r</em><em>a</em><em>d</em><em>i</em><em>x</em>
 | |
| is not supplied, then the default radix is 10.  If <em>s</em><em>t</em><em>r</em><em>i</em><em>n</em><em>g</em> is not
 | |
| a syntactically valid notation for a number, then <tt>string->number</tt>
 | |
| returns <tt>#f</tt>.<p>
 | |
| 
 | |
| <tt><p>(string->number "100")                ===>  100<br>
 | |
| (string->number "100" 16)             ===>  256<br>
 | |
| (string->number "1e2")                ===>  100.0<br>
 | |
| (string->number "15##")               ===>  1500.0<p></tt><p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| The domain of <tt>string->number</tt> may be restricted by implementations
 | |
| in the following ways.  <tt>String->number</tt> is permitted to return
 | |
| <tt>#f</tt> whenever <em>s</em><em>t</em><em>r</em><em>i</em><em>n</em><em>g</em> contains an explicit radix prefix.
 | |
| If all numbers supported by an implementation are real, then
 | |
| <tt>string->number</tt> is permitted to return <tt>#f</tt> whenever
 | |
| <em>s</em><em>t</em><em>r</em><em>i</em><em>n</em><em>g</em> uses the polar or rectangular notations for complex
 | |
| numbers.  If all numbers are integers, then
 | |
| <tt>string->number</tt> may return <tt>#f</tt> whenever
 | |
| the fractional notation is used.  If all numbers are exact, then
 | |
| <tt>string->number</tt> may return <tt>#f</tt> whenever
 | |
| an exponent marker or explicit exactness prefix is used, or if
 | |
| a <tt>#</tt> appears in place of a digit.  If all inexact
 | |
| numbers are integers, then
 | |
| <tt>string->number</tt> may return <tt>#f</tt> whenever
 | |
| a decimal point is used.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.3"></a>
 | |
| <h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.3">6.3  Other data types</a></h2><p>
 | |
| 
 | |
| This section describes operations on some of Scheme's non-numeric data types:
 | |
| booleans, pairs, lists, symbols, characters, strings and vectors.<p>
 | |
| 
 | |
| <a name="%_sec_6.3.1"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.3.1">6.3.1  Booleans</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| The standard boolean objects for true and false are written as
 | |
| <tt>#t</tt> and <tt>#f</tt>.<a name="%_idx_354"></a><a name="%_idx_356"></a>  What really
 | |
| matters, though, are the objects that the Scheme conditional expressions
 | |
| (<tt>if</tt>, <tt>cond</tt>, <tt>and</tt>, <tt>or</tt>, <tt>do</tt>) treat as
 | |
| true<a name="%_idx_358"></a> or false<a name="%_idx_360"></a>.  The phrase ``a true value''<a name="%_idx_362"></a>
 | |
| (or sometimes just ``true'') means any object treated as true by the
 | |
| conditional expressions, and the phrase ``a false value''<a name="%_idx_364"></a> (or
 | |
| ``false'') means any object treated as false by the conditional expressions.<p>
 | |
| 
 | |
| Of all the standard Scheme values, only <tt>#f</tt>
 | |
| counts as false in conditional expressions.
 | |
| Except for <tt>#f</tt>,
 | |
| all standard Scheme values, including <tt>#t</tt>,
 | |
| pairs, the empty list, symbols, numbers, strings, vectors, and procedures,
 | |
| count as true.<p>
 | |
| 
 | |
| 
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| Programmers accustomed to other dialects of Lisp should be aware that
 | |
| Scheme distinguishes both <tt>#f</tt> and the empty list <a name="%_idx_366"></a>
 | |
| from the symbol <tt>nil</tt>.
 | |
| </blockquote><p>
 | |
| 
 | |
| Boolean constants evaluate to themselves, so they do not need to be quoted
 | |
| in programs.<p>
 | |
| 
 | |
| <tt><p><tt>#t</tt>                 ===>  <tt>#t</tt><br>
 | |
| <tt>#f</tt>                ===>  <tt>#f</tt><br>
 | |
| '<tt>#f</tt>               ===>  <tt>#f</tt><p></tt><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_368"></a>not<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Not</tt> returns <tt>#t</tt> if <i>obj</i> is false, and returns
 | |
| <tt>#f</tt> otherwise.<p>
 | |
| 
 | |
| <tt><p>(not <tt>#t</tt>)           ===>  <tt>#f</tt><br>
 | |
| (not 3)                  ===>  <tt>#f</tt><br>
 | |
| (not (list 3))           ===>  <tt>#f</tt><br>
 | |
| (not <tt>#f</tt>)          ===>  <tt>#t</tt><br>
 | |
| (not '())                ===>  <tt>#f</tt><br>
 | |
| (not (list))             ===>  <tt>#f</tt><br>
 | |
| (not 'nil)               ===>  <tt>#f</tt><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_370"></a>boolean?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Boolean?</tt> returns <tt>#t</tt> if <i>obj</i> is either <tt>#t</tt> or
 | |
| <tt>#f</tt> and returns <tt>#f</tt> otherwise.<p>
 | |
| 
 | |
| <tt><p>(boolean? <tt>#f</tt>)          ===>  <tt>#t</tt><br>
 | |
| (boolean? 0)                  ===>  <tt>#f</tt><br>
 | |
| (boolean? '())                ===>  <tt>#f</tt><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.3.2"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.3.2">6.3.2  Pairs and lists</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| A <a name="%_idx_372"></a><em>pair</em> (sometimes called a <a name="%_idx_374"></a><em>dotted pair</em>) is a
 | |
| record structure with two fields called the car and cdr fields (for
 | |
| historical reasons).  Pairs are created by the procedure <tt>cons</tt>.
 | |
| The car and cdr fields are accessed by the procedures <tt>car</tt> and
 | |
| <tt>cdr</tt>.  The car and cdr fields are assigned by the procedures
 | |
| <tt>set-car!</tt> and <tt>set-cdr!</tt>.<p>
 | |
| 
 | |
| Pairs are used primarily to represent lists.  A list can
 | |
| be defined recursively as either the empty list<a name="%_idx_376"></a> or a pair whose
 | |
| cdr is a list.  More precisely, the set of lists is defined as the smallest
 | |
| set <i>X</i> such that<p>
 | |
| 
 | |
| <p><ul>
 | |
| <li>The empty list is in <i>X</i>.
 | |
| <li>If <i>list</i> is in <i>X</i>, then any pair whose cdr field contains
 | |
| <i>list</i> is also in <i>X</i>.
 | |
| </ul><p><p>
 | |
| 
 | |
| The objects in the car fields of successive pairs of a list are the
 | |
| elements of the list.  For example, a two-element list is a pair whose car
 | |
| is the first element and whose cdr is a pair whose car is the second element
 | |
| and whose cdr is the empty list.  The length of a list is the number of
 | |
| elements, which is the same as the number of pairs.<p>
 | |
| 
 | |
| The empty list<a name="%_idx_378"></a> is a special object of its own type
 | |
| (it is not a pair); it has no elements and its length is zero.<p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| The above definitions imply that all lists have finite length and are
 | |
| terminated by the empty list.
 | |
| </blockquote><p>
 | |
| 
 | |
| The most general notation (external representation) for Scheme pairs is
 | |
| the ``dotted'' notation <tt>(<i>c<sub>1</sub></i> . <i>c<sub>2</sub></i>)</tt> where
 | |
| <i>c<sub>1</sub></i> is the value of the car field and <i>c<sub>2</sub></i> is the value of the
 | |
| cdr field.  For example <tt>(4 . 5)</tt> is a pair whose car is 4 and whose
 | |
| cdr is 5.  Note that <tt>(4 . 5)</tt> is the external representation of a
 | |
| pair, not an expression that evaluates to a pair.<p>
 | |
| 
 | |
| A more streamlined notation can be used for lists: the elements of the
 | |
| list are simply enclosed in parentheses and separated by spaces.  The
 | |
| empty list<a name="%_idx_380"></a> is written <tt>()</tt> .  For example,<p>
 | |
| 
 | |
| <tt><p>(a b c d e)<p></tt><p>
 | |
| 
 | |
| and<p>
 | |
| 
 | |
| <tt><p>(a . (b . (c . (d . (e . ())))))<p></tt><p>
 | |
| 
 | |
| are equivalent notations for a list of symbols.<p>
 | |
| 
 | |
| A chain of pairs not ending in the empty list is called an
 | |
| <a name="%_idx_382"></a><em>improper list</em>.  Note that an improper list is not a list.
 | |
| The list and dotted notations can be combined to represent
 | |
| improper lists:<p>
 | |
| 
 | |
| <tt><p>(a b c . d)<p></tt><p>
 | |
| 
 | |
| is equivalent to<p>
 | |
| 
 | |
| <tt><p>(a . (b . (c . d)))<p></tt><p>
 | |
| 
 | |
| Whether a given pair is a list depends upon what is stored in the cdr
 | |
| field.  When the <tt>set-cdr!</tt> procedure is used, an object can be a
 | |
| list one moment and not the next:<p>
 | |
| 
 | |
| <tt><p>(define x (list 'a 'b 'c))<br>
 | |
| (define y x)<br>
 | |
| y                               ===>  (a b c)<br>
 | |
| (list? y)                       ===>  <tt>#t</tt><br>
 | |
| (set-cdr! x 4)                  ===>  <i>unspecified</i><br>
 | |
| x                               ===>  (a . 4)<br>
 | |
| (eqv? x y)                      ===>  <tt>#t</tt><br>
 | |
| y                               ===>  (a . 4)<br>
 | |
| (list? y)                       ===>  <tt>#f</tt><br>
 | |
| (set-cdr! x x)                  ===>  <i>unspecified</i><br>
 | |
| (list? x)                       ===>  <tt>#f</tt><p></tt><p>
 | |
| 
 | |
| 
 | |
| Within literal expressions and representations of objects read by the
 | |
| <tt>read</tt> procedure, the forms <tt>'</tt><datum><a name="%_idx_384"></a>,
 | |
| <tt>`</tt><datum>, <tt>,</tt><datum><a name="%_idx_386"></a>, and
 | |
| <tt>,@</tt><datum> denote two-element lists whose first elements are
 | |
| the symbols <tt>quote</tt>, <tt>quasiquote</tt>, <tt>unquote</tt>, and
 | |
| <tt>unquote-splicing</tt>, respectively.  The second element in each case
 | |
| is <datum>.  This convention is supported so that arbitrary Scheme
 | |
| programs may be represented as lists.   That is, according to Scheme's grammar, every
 | |
| <expression> is also a <datum> (see section <a href="r5rs-Z-H-10.html#%_sec_7.1.2">7.1.2</a>).
 | |
| Among other things, this permits the use of the <tt>read</tt> procedure to
 | |
| parse Scheme programs.  See section <a href="r5rs-Z-H-6.html#%_sec_3.3">3.3</a>. <p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_388"></a>pair?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Pair?</tt> returns <tt>#t</tt> if <i>obj</i> is a pair, and otherwise
 | |
| returns <tt>#f</tt>.<p>
 | |
| 
 | |
| <tt><p>(pair? '(a . b))                ===>  <tt>#t</tt><br>
 | |
| (pair? '(a b c))                ===>  <tt>#t</tt><br>
 | |
| (pair? '())                     ===>  <tt>#f</tt><br>
 | |
| (pair? '#(a b))                 ===>  <tt>#f</tt><p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_390"></a>cons<i> <i>obj<sub>1</sub></i> <i>obj<sub>2</sub></i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns a newly allocated pair whose car is <i>obj<sub>1</sub></i> and whose cdr is
 | |
| <i>obj<sub>2</sub></i>.  The pair is guaranteed to be different (in the sense of
 | |
| <tt>eqv?</tt>) from every existing object.<p>
 | |
| 
 | |
| <tt><p>(cons 'a '())                   ===>  (a)<br>
 | |
| (cons '(a) '(b c d))            ===>  ((a) b c d)<br>
 | |
| (cons "a" '(b c))               ===>  ("a" b c)<br>
 | |
| (cons 'a 3)                     ===>  (a . 3)<br>
 | |
| (cons '(a b) 'c)                ===>  ((a b) . c)<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_392"></a>car<i> pair</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| Returns the contents of the car field of <i>pair</i>.  Note that it is an
 | |
| error to take the car of the empty list<a name="%_idx_394"></a>.<p>
 | |
| 
 | |
| <tt><p>(car '(a b c))                  ===>  a<br>
 | |
| (car '((a) b c d))              ===>  (a)<br>
 | |
| (car '(1 . 2))                  ===>  1<br>
 | |
| (car '())                       ===>  <i>error</i><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_396"></a>cdr<i> pair</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| Returns the contents of the cdr field of <i>pair</i>.
 | |
| Note that it is an error to take the cdr of the empty list.<p>
 | |
| 
 | |
| <tt><p>(cdr '((a) b c d))              ===>  (b c d)<br>
 | |
| (cdr '(1 . 2))                  ===>  2<br>
 | |
| (cdr '())                       ===>  <i>error</i><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_398"></a>set-car!<i> pair obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
|   
 | |
| Stores <i>obj</i> in the car field of <i>pair</i>.
 | |
| The value returned by <tt>set-car!</tt> is unspecified.  
 | |
| <tt><p>(define (f) (list 'not-a-constant-list))<br>
 | |
| (define (g) '(constant-list))<br>
 | |
| (set-car! (f) 3)                     ===>  <i>unspecified</i><br>
 | |
| (set-car! (g) 3)                     ===>  <i>error</i><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_400"></a>set-cdr!<i> pair obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| Stores <i>obj</i> in the cdr field of <i>pair</i>.
 | |
| The value returned by <tt>set-cdr!</tt> is unspecified.  
 | |
| <p><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_402"></a>caar<i> pair</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_404"></a>cadr<i> pair</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>                         <img src="r5rs-Z-G-D-1.gif" border="0">                        :</u>  <tt>                         <img src="r5rs-Z-G-D-1.gif" border="0">                        </tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_406"></a>cdddar<i> pair</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_408"></a>cddddr<i> pair</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures are compositions of <tt>car</tt> and <tt>cdr</tt>, where
 | |
| for example <tt>caddr</tt> could be defined by<p>
 | |
| 
 | |
| <tt><p>(define caddr (lambda (x) (car (cdr (cdr x))))).<p></tt><p>
 | |
| 
 | |
| Arbitrary compositions, up to four deep, are provided.  There are
 | |
| twenty-eight of these procedures in all.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_410"></a>null?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if <i>obj</i> is the empty list<a name="%_idx_412"></a>,
 | |
| otherwise returns <tt>#f</tt>.<p>
 | |
| 
 | |
|  
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_414"></a>list?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if <i>obj</i> is a list, otherwise returns <tt>#f</tt>.
 | |
| By definition, all lists have finite length and are terminated by
 | |
| the empty list.<p>
 | |
| 
 | |
| <tt><p>        (list? '(a b c))             ===>  <tt>#t</tt><br>
 | |
|         (list? '())                  ===>  <tt>#t</tt><br>
 | |
|         (list? '(a . b))             ===>  <tt>#f</tt><br>
 | |
|         (let ((x (list 'a)))<br>
 | |
|           (set-cdr! x x)<br>
 | |
|           (list? x))                 ===>  <tt>#f</tt><p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_416"></a>list<i> <i>obj</i> <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns a newly allocated list of its arguments.<p>
 | |
| 
 | |
| <tt><p>(list 'a (+ 3 4) 'c)                    ===>  (a 7 c)<br>
 | |
| (list)                                  ===>  ()<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_418"></a>length<i> list</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| Returns the length of <i>list</i>.<p>
 | |
| 
 | |
| <tt><p>(length '(a b c))                       ===>  3<br>
 | |
| (length '(a (b) (c d e)))               ===>  3<br>
 | |
| (length '())                            ===>  0<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_420"></a>append<i> list <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| Returns a list consisting of the elements of the first <i>list</i>
 | |
| followed by the elements of the other <i>list</i>s.<p>
 | |
| 
 | |
| <tt><p>(append '(x) '(y))                      ===>  (x y)<br>
 | |
| (append '(a) '(b c d))                  ===>  (a b c d)<br>
 | |
| (append '(a (b)) '((c)))                ===>  (a (b) (c))<p></tt><p>
 | |
| 
 | |
| The resulting list is always newly allocated, except that it shares
 | |
| structure with the last <i>list</i> argument.  The last argument may
 | |
| actually be any object; an improper list results if the last argument is not a
 | |
| proper list.  <p>
 | |
| 
 | |
| <tt><p>(append '(a b) '(c . d))                ===>  (a b c . d)<br>
 | |
| (append '() 'a)                         ===>  a<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_422"></a>reverse<i> list</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| Returns a newly allocated list consisting of the elements of <i>list</i>
 | |
| in reverse order.<p>
 | |
| 
 | |
| <tt><p>(reverse '(a b c))                      ===>  (c b a)<br>
 | |
| (reverse '(a (b c) d (e (f))))  <br>                ===>  ((e (f)) d (b c) a)<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_424"></a>list-tail<i> list <em>k</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the sublist of <i>list</i> obtained by omitting the first <em>k</em>
 | |
| elements.  It is an error if <i>list</i> has fewer than <em>k</em> elements.
 | |
| <tt>List-tail</tt> could be defined by<p>
 | |
| 
 | |
| <tt><p>(define list-tail<br>
 | |
|   (lambda (x k)<br>
 | |
|     (if (zero? k)<br>
 | |
|         x<br>
 | |
|         (list-tail (cdr x) (- k 1)))))<p></tt> 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_426"></a>list-ref<i> list <em>k</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the <em>k</em>th element of <i>list</i>.  (This is the same
 | |
| as the car of <tt>(list-tail <i>list</i> <em>k</em>)</tt>.)
 | |
| It is an error if <i>list</i> has fewer than <em>k</em> elements.<p>
 | |
| 
 | |
| <tt><p>(list-ref '(a b c d) 2)                         ===>  c<br>
 | |
| (list-ref '(a b c d)<br>
 | |
|           (inexact->exact (round 1.8))) <br>                ===>  c<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_428"></a>memq<i> obj list</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_430"></a>memv<i> obj list</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_432"></a>member<i> obj list</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures return the first sublist of <i>list</i> whose car is
 | |
| <i>obj</i>, where the sublists of <i>list</i> are the non-empty lists
 | |
| returned by <tt>(list-tail <i>list</i> <i>k</i>)</tt> for <i>k</i> less
 | |
| than the length of <i>list</i>.  If
 | |
| <i>obj</i> does not occur in <i>list</i>, then <tt>#f</tt> (not the empty list) is
 | |
| returned.  <tt>Memq</tt> uses <tt>eq?</tt> to compare <i>obj</i> with the elements of
 | |
| <i>list</i>, while <tt>memv</tt> uses <tt>eqv?</tt> and <tt>member</tt> uses <tt>equal?</tt>.<p>
 | |
| 
 | |
| <tt><p>(memq 'a '(a b c))                      ===>  (a b c)<br>
 | |
| (memq 'b '(a b c))                      ===>  (b c)<br>
 | |
| (memq 'a '(b c d))                      ===>  <tt>#f</tt><br>
 | |
| (memq (list 'a) '(b (a) c))             ===>  <tt>#f</tt><br>
 | |
| (member (list 'a)<br>
 | |
|         '(b (a) c))                     ===>  ((a) c)<br>
 | |
| (memq 101 '(100 101 102))               ===>  <i>unspecified</i><br>
 | |
| (memv 101 '(100 101 102))               ===>  (101 102)<p></tt> <p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_434"></a>assq<i> obj alist</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_436"></a>assv<i> obj alist</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_438"></a>assoc<i> obj alist</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <i>Alist</i> (for ``association list'') must be a list of
 | |
| pairs.  These procedures find the first pair in <i>alist</i> whose car field is <i>obj</i>,
 | |
| and returns that pair.  If no pair in <i>alist</i> has <i>obj</i> as its
 | |
| car, then <tt>#f</tt> (not the empty list) is returned.  <tt>Assq</tt> uses
 | |
| <tt>eq?</tt> to compare <i>obj</i> with the car fields of the pairs in <i>alist</i>,
 | |
| while <tt>assv</tt> uses <tt>eqv?</tt> and <tt>assoc</tt> uses <tt>equal?</tt>.<p>
 | |
| 
 | |
| <tt><p>(define e '((a 1) (b 2) (c 3)))<br>
 | |
| (assq 'a e)             ===>  (a 1)<br>
 | |
| (assq 'b e)             ===>  (b 2)<br>
 | |
| (assq 'd e)             ===>  <tt>#f</tt><br>
 | |
| (assq (list 'a) '(((a)) ((b)) ((c))))<br>
 | |
|                         ===>  <tt>#f</tt><br>
 | |
| (assoc (list 'a) '(((a)) ((b)) ((c))))   <br>
 | |
|                                    ===>  ((a))<br>
 | |
| (assq 5 '((2 3) (5 7) (11 13)))    <br>
 | |
|                                    ===>  <i>unspecified</i><br>
 | |
| (assv 5 '((2 3) (5 7) (11 13)))    <br>
 | |
|                                    ===>  (5 7)<p></tt><p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em>
 | |
| Although they are ordinarily used as predicates,
 | |
| <tt>memq</tt>, <tt>memv</tt>, <tt>member</tt>, <tt>assq</tt>, <tt>assv</tt>, and <tt>assoc</tt> do not
 | |
| have question marks in their names because they return useful values rather
 | |
| than just <tt>#t</tt> or <tt>#f</tt>.
 | |
| </blockquote>
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.3.3"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.3.3">6.3.3  Symbols</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| Symbols are objects whose usefulness rests on the fact that two
 | |
| symbols are identical (in the sense of <tt>eqv?</tt>) if and only if their
 | |
| names are spelled the same way.  This is exactly the property needed to
 | |
| represent identifiers<a name="%_idx_440"></a> in programs, and so most
 | |
| implementations of Scheme use them internally for that purpose.  Symbols
 | |
| are useful for many other applications; for instance, they may be used
 | |
| the way enumerated values are used in Pascal.<p>
 | |
| 
 | |
| The rules for writing a symbol are exactly the same as the rules for
 | |
| writing an identifier; see sections <a href="r5rs-Z-H-5.html#%_sec_2.1">2.1</a>
 | |
| and <a href="r5rs-Z-H-10.html#%_sec_7.1.1">7.1.1</a>.<p>
 | |
| 
 | |
| It is guaranteed that any symbol that has been returned as part of
 | |
| a literal expression, or read using the <tt>read</tt> procedure, and
 | |
| subsequently written out using the <tt>write</tt> procedure, will read back
 | |
| in as the identical symbol (in the sense of <tt>eqv?</tt>).  The
 | |
| <tt>string->symbol</tt> procedure, however, can create symbols for
 | |
| which this write/read invariance may not hold because their names
 | |
| contain special characters or letters in the non-standard case.<p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| Some implementations of Scheme have a feature known as ``slashification''
 | |
| in order to guarantee write/read invariance for all symbols, but
 | |
| historically the most important use of this feature has been to
 | |
| compensate for the lack of a string data type.<p>
 | |
| 
 | |
| Some implementations also have ``uninterned symbols'', which
 | |
| defeat write/read invariance even in implementations with slashification,
 | |
| and also generate exceptions to the rule that two symbols are the same
 | |
| if and only if their names are spelled the same.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_442"></a>symbol?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if <i>obj</i> is a symbol, otherwise returns <tt>#f</tt>.<p>
 | |
| 
 | |
| <tt><p>(symbol? 'foo)                  ===>  <tt>#t</tt><br>
 | |
| (symbol? (car '(a b)))          ===>  <tt>#t</tt><br>
 | |
| (symbol? "bar")                 ===>  <tt>#f</tt><br>
 | |
| (symbol? 'nil)                  ===>  <tt>#t</tt><br>
 | |
| (symbol? '())                   ===>  <tt>#f</tt><br>
 | |
| (symbol? <tt>#f</tt>)             ===>  <tt>#f</tt><p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_444"></a>symbol->string<i> symbol</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the name of <i>symbol</i> as a string.  If the symbol was part of
 | |
| an object returned as the value of a literal expression
 | |
| (section <a href="r5rs-Z-H-7.html#%_sec_4.1.2">4.1.2</a>) or by a call to the <tt>read</tt> procedure,
 | |
| and its name contains alphabetic characters, then the string returned
 | |
| will contain characters in the implementation's preferred standard
 | |
| case -- some implementations will prefer upper case, others lower case.
 | |
| If the symbol was returned by <tt>string->symbol</tt>, the case of
 | |
| characters in the string returned will be the same as the case in the
 | |
| string that was passed to <tt>string->symbol</tt>.  It is an error
 | |
| to apply mutation procedures like <tt>string-set!</tt> to strings returned
 | |
| by this procedure.<p>
 | |
| 
 | |
| The following examples assume that the implementation's standard case is
 | |
| lower case:<p>
 | |
| 
 | |
| <tt><p>(symbol->string 'flying-fish)     <br>
 | |
|                                           ===>  "flying-fish"<br>
 | |
| (symbol->string 'Martin)                  ===>  "martin"<br>
 | |
| (symbol->string<br>
 | |
|    (string->symbol "Malvina"))     <br>
 | |
|                                           ===>  "Malvina"<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_446"></a>string->symbol<i> string</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the symbol whose name is <i>string</i>.  This procedure can
 | |
| create symbols with names containing special characters or letters in
 | |
| the non-standard case, but it is usually a bad idea to create such
 | |
| symbols because in some implementations of Scheme they cannot be read as
 | |
| themselves.  See <tt>symbol->string</tt>.<p>
 | |
| 
 | |
| The following examples assume that the implementation's standard case is
 | |
| lower case:<p>
 | |
| 
 | |
| <tt><p>(eq? 'mISSISSIppi 'mississippi)  <br>                ===>  <tt>#t</tt><br>
 | |
| (string->symbol "mISSISSIppi")  <br>                ===>  the symbol with name "mISSISSIppi"<br>
 | |
| (eq? 'bitBlt (string->symbol "bitBlt"))     <br>                ===>  <tt>#f</tt><br>
 | |
| (eq? 'JollyWog<br>
 | |
|      (string->symbol<br>
 | |
|        (symbol->string 'JollyWog)))  <br>                ===>  <tt>#t</tt><br>
 | |
| (string=? "K. Harper, M.D."<br>
 | |
|           (symbol->string<br>
 | |
|             (string->symbol "K. Harper, M.D.")))  <br>                ===>  <tt>#t</tt><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.3.4"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.3.4">6.3.4  Characters</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| Characters are objects that represent printed characters such as
 | |
| letters and digits.  
 | |
| Characters are written using the notation <tt>#</tt><tt>\</tt><character>
 | |
| or <tt>#</tt><tt>\</tt><character name>.
 | |
| For example:<p>
 | |
| 
 | |
| <p><div align=left><table><tr><td>
 | |
| 
 | |
| 
 | |
| <table border=0><tr><td valign=top ><tt>#<tt>\</tt>a</tt></td><td valign=top >; lower case letter</td></tr>
 | |
| <tr><td valign=top ><tt>#<tt>\</tt>A</tt></td><td valign=top >; upper case letter</td></tr>
 | |
| <tr><td valign=top ><tt>#<tt>\</tt>(</tt></td><td valign=top >; left parenthesis</td></tr>
 | |
| <tr><td valign=top ><tt>#<tt>\</tt> </tt></td><td valign=top >; the space character</td></tr>
 | |
| <tr><td valign=top ><tt>#<tt>\</tt>space</tt></td><td valign=top >; the preferred way to write a space</td></tr>
 | |
| <tr><td valign=top ><tt>#<tt>\</tt>newline</tt></td><td valign=top >; the newline character</td></tr>
 | |
| <tr><td valign=top ></td></tr></table>
 | |
| </td></tr></table></div><p><p>
 | |
| 
 | |
| Case is significant in <tt>#</tt><tt>\</tt><character>, but not in
 | |
| <tt>#</tt><tt>\</tt><character name>.                                                              If <character> in
 | |
| <tt>#</tt><tt>\</tt><character> is alphabetic, then the character
 | |
| following <character> must be a delimiter character such as a
 | |
| space or parenthesis.  This rule resolves the ambiguous case where, for
 | |
| example, the sequence of characters ``<tt><tt>#</tt><tt>\</tt>space</tt>''
 | |
| could be taken to be either a representation of the space character or a
 | |
| representation of the character ``<tt><tt>#</tt><tt>\</tt>s</tt>'' followed
 | |
| by a representation of the symbol ``<tt>pace</tt>.''<p>
 | |
| 
 | |
| 
 | |
| Characters written in the <tt>#</tt><tt>\</tt> notation are self-evaluating.
 | |
| That is, they do not have to be quoted in programs.  
 | |
| 
 | |
| Some of the procedures that operate on characters ignore the
 | |
| difference between upper case and lower case.  The procedures that
 | |
| ignore case have ``<tt>-ci</tt>'' (for ``case
 | |
| insensitive'') embedded in their names.<p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_448"></a>char?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if <i>obj</i> is a character, otherwise returns <tt>#f</tt>.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_450"></a>char=?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_452"></a>char<?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_454"></a>char>?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_456"></a>char<=?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_458"></a>char>=?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| 
 | |
| These procedures impose a total ordering on the set of characters.  It
 | |
| is guaranteed that under this ordering:<p>
 | |
| 
 | |
| <p><ul>
 | |
| <li>The upper case characters are in order.  For example, <tt>(char<? #<tt>\</tt>A #<tt>\</tt>B)</tt> returns <tt>#t</tt>.
 | |
| <li>The lower case characters are in order.  For example, <tt>(char<? #<tt>\</tt>a #<tt>\</tt>b)</tt> returns <tt>#t</tt>.
 | |
| <li>The digits are in order.  For example, <tt>(char<? #<tt>\</tt>0 #<tt>\</tt>9)</tt> returns <tt>#t</tt>.
 | |
| <li>Either all the digits precede all the upper case letters, or vice versa.
 | |
| <li>Either all the digits precede all the lower case letters, or vice versa.
 | |
| </ul><p><p>
 | |
| 
 | |
| Some implementations may generalize these procedures to take more than
 | |
| two arguments, as with the corresponding numerical predicates.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_460"></a>char-ci=?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_462"></a>char-ci<?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_464"></a>char-ci>?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_466"></a>char-ci<=?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_468"></a>char-ci>=?<i> <i>char<sub>1</sub></i> <i>char<sub>2</sub></i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| These procedures are similar to <tt>char=?</tt> et cetera, but they treat
 | |
| upper case and lower case letters as the same.  For example, <tt>(char-ci=? #<tt>\</tt>A #<tt>\</tt>a)</tt> returns <tt>#t</tt>.  Some
 | |
| implementations may generalize these procedures to take more than two
 | |
| arguments, as with the corresponding numerical predicates.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_470"></a>char-alphabetic?<i> char</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_472"></a>char-numeric?<i> char</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_474"></a>char-whitespace?<i> char</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_476"></a>char-upper-case?<i> letter</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_478"></a>char-lower-case?<i> letter</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures return <tt>#t</tt> if their arguments are alphabetic,
 | |
| numeric, whitespace, upper case, or lower case characters, respectively,
 | |
| otherwise they return <tt>#f</tt>.  The following remarks, which are specific to
 | |
| the ASCII character set, are intended only as a guide:  The alphabetic characters
 | |
| are the 52 upper and lower case letters.  The numeric characters are the
 | |
| ten decimal digits.  The whitespace characters are space, tab, line
 | |
| feed, form feed, and carriage return.
 | |
| <p><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_480"></a>char->integer<i> char</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_482"></a>integer->char<i> <em>n</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Given a character, <tt>char->integer</tt> returns an exact integer
 | |
| representation of the character.  Given an exact integer that is the image of
 | |
| a character under <tt>char->integer</tt>, <tt>integer->char</tt>
 | |
| returns that character.  These procedures implement order-preserving isomorphisms
 | |
| between the set of characters under the <tt>char<=?</tt> ordering and some
 | |
| subset of the integers under the <tt><=</tt> ordering.  That is, if<p>
 | |
| 
 | |
| <tt><p>(char<=? <em>a</em> <em>b</em>) ===> <tt>#t</tt>  and  (<= <em>x</em> <em>y</em>) ===> <tt>#t</tt><p></tt><p>
 | |
| 
 | |
| and <em>x</em> and <em>y</em> are in the domain of
 | |
| <tt>integer->char</tt>, then<p>
 | |
| 
 | |
| <tt><p>(<= (char->integer <em>a</em>)<br>
 | |
|     (char->integer <em>b</em>))                 ===>  <tt>#t</tt><br>
 | |
| <br>
 | |
| (char<=? (integer->char <em>x</em>)<br>
 | |
|          (integer->char <em>y</em>))             ===>  <tt>#t</tt><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_484"></a>char-upcase<i> char</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_486"></a>char-downcase<i> char</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| 
 | |
| These procedures return a character <i>char<sub>2</sub></i> such that <tt>(char-ci=? <i>char</i> <i>char<sub>2</sub></i>)</tt>.  In addition, if <i>char</i> is
 | |
| alphabetic, then the result of <tt>char-upcase</tt> is upper case and the
 | |
| result of <tt>char-downcase</tt> is lower case.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.3.5"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.3.5">6.3.5  Strings</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| Strings are sequences of characters.  
 | |
| Strings are written as sequences of characters enclosed within doublequotes
 | |
| (<tt>"</tt>).  A doublequote can be written inside a string only by escaping
 | |
| it with a backslash (<tt>\</tt>), as in<p>
 | |
| 
 | |
| <tt><p>"The word <tt>\</tt>"recursion<tt>\</tt>" has many meanings."<p></tt><p>
 | |
| 
 | |
| A backslash can be written inside a string only by escaping it with another
 | |
| backslash.  Scheme does not specify the effect of a backslash within a
 | |
| string that is not followed by a doublequote or backslash.<p>
 | |
| 
 | |
| A string constant may continue from one line to the next, but
 | |
| the exact contents of such a string are unspecified.
 | |
| 
 | |
| The <em>length</em> of a string is the number of characters that it
 | |
| contains.  This number is an exact, non-negative integer that is fixed when the
 | |
| string is created.  The <a name="%_idx_488"></a><em>valid indexes</em> of a string are the
 | |
| exact non-negative integers less than the length of the string.  The first
 | |
| character of a string has index 0, the second has index 1, and so on.<p>
 | |
| 
 | |
| In phrases such as ``the characters of <i>string</i> beginning with
 | |
| index <i>start</i> and ending with index <i>end</i>,'' it is understood
 | |
| that the index <i>start</i> is inclusive and the index <i>end</i> is
 | |
| exclusive.  Thus if <i>start</i> and <i>end</i> are the same index, a null
 | |
| substring is referred to, and if <i>start</i> is zero and <i>end</i> is
 | |
| the length of <i>string</i>, then the entire string is referred to.<p>
 | |
| 
 | |
| Some of the procedures that operate on strings ignore the
 | |
| difference between upper and lower case.  The versions that ignore case
 | |
| have ``<tt>-ci</tt>'' (for ``case insensitive'') embedded in their
 | |
| names.<p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_490"></a>string?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if <i>obj</i> is a string, otherwise returns <tt>#f</tt>.
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_492"></a>make-string<i> <em>k</em></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(make-string<i> <em>k</em> char</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Make-string</tt> returns a newly allocated string of
 | |
| length <em>k</em>.  If <i>char</i> is given, then all elements of the string
 | |
| are initialized to <i>char</i>, otherwise the contents of the
 | |
| <i>string</i> are unspecified.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_494"></a>string<i> char <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns a newly allocated string composed of the arguments.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_496"></a>string-length<i> string</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the number of characters in the given <i>string</i>.
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_498"></a>string-ref<i> string <em>k</em></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <em>k</em> must be a valid index of <i>string</i>.
 | |
| <tt>String-ref</tt> returns character <em>k</em> of <i>string</i> using zero-origin indexing.
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_500"></a>string-set!<i> string k char</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <em>k</em> must be a valid index of <i>string</i>.
 | |
| <tt>String-set!</tt> stores <i>char</i> in element <em>k</em> of <i>string</i>
 | |
| and returns an unspecified value.  
 | |
| <tt><p>(define (f) (make-string 3 <tt>#</tt><tt>\</tt>*))<br>
 | |
| (define (g) "***")<br>
 | |
| (string-set! (f) 0 <tt>#</tt><tt>\</tt>?)          ===>  <i>unspecified</i><br>
 | |
| (string-set! (g) 0 <tt>#</tt><tt>\</tt>?)          ===>  <i>error</i><br>
 | |
| (string-set! (symbol->string 'immutable)<br>
 | |
|              0<br>
 | |
|              <tt>#</tt><tt>\</tt>?)          ===>  <i>error</i><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_502"></a>string=?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_504"></a>string-ci=?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if the two strings are the same length and contain the same
 | |
| characters in the same positions, otherwise returns <tt>#f</tt>.
 | |
| <tt>String-ci=?</tt> treats
 | |
| upper and lower case letters as though they were the same character, but
 | |
| <tt>string=?</tt> treats upper and lower case as distinct characters.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_506"></a>string<?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_508"></a>string>?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_510"></a>string<=?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_512"></a>string>=?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_514"></a>string-ci<?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_516"></a>string-ci>?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_518"></a>string-ci<=?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_520"></a>string-ci>=?<i> <i>string<sub>1</sub></i> <i>string<sub>2</sub></i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| These procedures are the lexicographic extensions to strings of the
 | |
| corresponding orderings on characters.  For example, <tt>string<?</tt> is
 | |
| the lexicographic ordering on strings induced by the ordering
 | |
| <tt>char<?</tt> on characters.  If two strings differ in length but
 | |
| are the same up to the length of the shorter string, the shorter string
 | |
| is considered to be lexicographically less than the longer string.<p>
 | |
| 
 | |
| Implementations may generalize these and the <tt>string=?</tt> and
 | |
| <tt>string-ci=?</tt> procedures to take more than two arguments, as with
 | |
| the corresponding numerical predicates.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_522"></a>substring<i> string start end</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <i>String</i> must be a string, and <i>start</i> and <i>end</i>
 | |
| must be exact integers satisfying
 | |
| <p><div align=left><table><tr><td>0 <u><</u> <i>start</i> <u><</u> <i>end</i> <u><</u> <tt>(string-length <i>string</i>).</tt></td></tr></table></div><p>
 | |
| <tt>Substring</tt> returns a newly allocated string formed from the characters of
 | |
| <i>string</i> beginning with index <i>start</i> (inclusive) and ending with index
 | |
| <i>end</i> (exclusive).
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_524"></a>string-append<i> <i>string</i> <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns a newly allocated string whose characters form the concatenation of the
 | |
| given strings.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_526"></a>string->list<i> string</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_528"></a>list->string<i> list</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>String->list</tt> returns a newly allocated list of the
 | |
| characters that make up the given string.  <tt>List->string</tt>
 | |
| returns a newly allocated string formed from the characters in the list
 | |
| <i>list</i>, which must be a list of characters. <tt>String->list</tt>
 | |
| and <tt>list->string</tt> are
 | |
| inverses so far as <tt>equal?</tt> is concerned.  
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_530"></a>string-copy<i> string</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns a newly allocated copy of the given <i>string</i>.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_532"></a>string-fill!<i> string char</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Stores <i>char</i> in every element of the given <i>string</i> and returns an
 | |
| unspecified value.  
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.3.6"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.3.6">6.3.6  Vectors</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| Vectors are heterogenous structures whose elements are indexed
 | |
| by integers.  A vector typically occupies less space than a list
 | |
| of the same length, and the average time required to access a randomly
 | |
| chosen element is typically less for the vector than for the list.<p>
 | |
| 
 | |
| The <em>length</em> of a vector is the number of elements that it
 | |
| contains.  This number is a non-negative integer that is fixed when the
 | |
| vector is created.  The <em>valid indexes</em><a name="%_idx_534"></a> of a
 | |
| vector are the exact non-negative integers less than the length of the
 | |
| vector.  The first element in a vector is indexed by zero, and the last
 | |
| element is indexed by one less than the length of the vector.<p>
 | |
| 
 | |
| Vectors are written using the notation <tt>#(<i>obj</i> <tt>...</tt>)</tt>.
 | |
| For example, a vector of length 3 containing the number zero in element
 | |
| 0, the list <tt>(2 2 2 2)</tt> in element 1, and the string <tt>"Anna"</tt> in
 | |
| element 2 can be written as following:<p>
 | |
| 
 | |
| <tt><p>#(0 (2 2 2 2) "Anna")<p></tt><p>
 | |
| 
 | |
| Note that this is the external representation of a vector, not an
 | |
| expression evaluating to a vector.  Like list constants, vector
 | |
| constants must be quoted:<p>
 | |
| 
 | |
| <tt><p>'#(0 (2 2 2 2) "Anna")  <br>                ===>  #(0 (2 2 2 2) "Anna")<p></tt><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_536"></a>vector?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if <i>obj</i> is a vector, otherwise returns <tt>#f</tt>.
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_538"></a>make-vector<i> k</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(make-vector<i> k fill</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns a newly allocated vector of <i>k</i> elements.  If a second
 | |
| argument is given, then each element is initialized to <i>fill</i>.
 | |
| Otherwise the initial contents of each element is unspecified.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_540"></a>vector<i> obj <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns a newly allocated vector whose elements contain the given
 | |
| arguments.  Analogous to <tt>list</tt>.<p>
 | |
| 
 | |
| <tt><p>(vector 'a 'b 'c)                       ===>  #(a b c)<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_542"></a>vector-length<i> vector</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the number of elements in <i>vector</i> as an exact integer.
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_544"></a>vector-ref<i> vector k</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <em>k</em> must be a valid index of <i>vector</i>.
 | |
| <tt>Vector-ref</tt> returns the contents of element <em>k</em> of
 | |
| <i>vector</i>.<p>
 | |
| 
 | |
| <tt><p>(vector-ref '#(1 1 2 3 5 8 13 21)<br>
 | |
|             5)  <br>                ===>  8<br>
 | |
| (vector-ref '#(1 1 2 3 5 8 13 21)<br>
 | |
|             (let ((i (round (* 2 (acos -1)))))<br>
 | |
|               (if (inexact? i)<br>
 | |
|                   (inexact->exact i)<br>
 | |
|                   i))) <br>                ===> 13<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_546"></a>vector-set!<i> vector k obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <em>k</em> must be a valid index of <i>vector</i>.
 | |
| <tt>Vector-set!</tt> stores <i>obj</i> in element <em>k</em> of <i>vector</i>.
 | |
| The value returned by <tt>vector-set!</tt> is unspecified.  
 | |
| <tt><p>(let ((vec (vector 0 '(2 2 2 2) "Anna")))<br>
 | |
|   (vector-set! vec 1 '("Sue" "Sue"))<br>
 | |
|   vec)      <br>                ===>  #(0 ("Sue" "Sue") "Anna")<br>
 | |
| <br>
 | |
| (vector-set! '#(0 1 2) 1 "doe")  <br>                ===>  <i>error</i>  ; constant vector<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_548"></a>vector->list<i> vector</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_550"></a>list->vector<i> list</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Vector->list</tt> returns a newly allocated list of the objects contained
 | |
| in the elements of <i>vector</i>.  <tt>List->vector</tt> returns a newly
 | |
| created vector initialized to the elements of the list <i>list</i>.<p>
 | |
| 
 | |
| <tt><p>(vector->list '#(dah dah didah))  <br>                ===>  (dah dah didah)<br>
 | |
| (list->vector '(dididit dah))   <br>                ===>  #(dididit dah)<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_552"></a>vector-fill!<i> vector fill</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Stores <i>fill</i> in every element of <i>vector</i>.
 | |
| The value returned by <tt>vector-fill!</tt> is unspecified.  
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.4"></a>
 | |
| <h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.4">6.4  Control features</a></h2><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| 
 | |
| This chapter describes various primitive procedures which control the
 | |
| flow of program execution in special ways.
 | |
| The <tt>procedure?</tt> predicate is also described here.<p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_554"></a>procedure?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if <i>obj</i> is a procedure, otherwise returns <tt>#f</tt>.<p>
 | |
| 
 | |
| <tt><p>(procedure? car)                    ===>  <tt>#t</tt><br>
 | |
| (procedure? 'car)                   ===>  <tt>#f</tt><br>
 | |
| (procedure? (lambda (x) (* x x)))   <br>
 | |
|                                     ===>  <tt>#t</tt><br>
 | |
| (procedure? '(lambda (x) (* x x)))  <br>
 | |
|                                     ===>  <tt>#f</tt><br>
 | |
| (call-with-current-continuation procedure?)<br>
 | |
|                                     ===>  <tt>#t</tt><p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_556"></a>apply<i> proc <i>arg<sub>1</sub></i> <tt>...</tt> args</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <i>Proc</i> must be a procedure and <i>args</i> must be a list.
 | |
| Calls <i>proc</i> with the elements of the list
 | |
| <tt>(append (list <i>arg<sub>1</sub></i> <tt>...</tt>) <i>args</i>)</tt> as the actual
 | |
| arguments.<p>
 | |
| 
 | |
| <tt><p>(apply + (list 3 4))                      ===>  7<br>
 | |
| <br>
 | |
| (define compose<br>
 | |
|   (lambda (f g)<br>
 | |
|     (lambda args<br>
 | |
|       (f (apply g args)))))<br>
 | |
| <br>
 | |
| ((compose sqrt *) 12 75)                      ===>  30<p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_558"></a>map<i> proc <i>list<sub>1</sub></i> <i>list<sub>2</sub></i> <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| The <i>list</i>s must be lists, and <i>proc</i> must be a
 | |
| procedure taking as many arguments as there are <i>list</i>s
 | |
| and returning a single value.  If more
 | |
| than one <i>list</i> is given, then they must all be the same length.
 | |
| <tt>Map</tt> applies <i>proc</i> element-wise to the elements of the
 | |
| <i>list</i>s and returns a list of the results, in order.
 | |
| The dynamic order in which <i>proc</i> is applied to the elements of the
 | |
| <i>list</i>s is unspecified.<p>
 | |
| 
 | |
| <tt><p>(map cadr '((a b) (d e) (g h)))   <br>                ===>  (b e h)<br>
 | |
| <br>
 | |
| (map (lambda (n) (expt n n))<br>
 | |
|      '(1 2 3 4 5))                <br>                ===>  (1 4 27 256 3125)<br>
 | |
| <br>
 | |
| (map + '(1 2 3) '(4 5 6))                 ===>  (5 7 9)<br>
 | |
| <br>
 | |
| (let ((count 0))<br>
 | |
|   (map (lambda (ignored)<br>
 | |
|          (set! count (+ count 1))<br>
 | |
|          count)<br>
 | |
|        '(a b)))                         ===>  (1 2) <i>or</i> (2 1)<br>
 | |
| <p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_560"></a>for-each<i> proc <i>list<sub>1</sub></i> <i>list<sub>2</sub></i> <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| The arguments to <tt>for-each</tt> are like the arguments to <tt>map</tt>, but
 | |
| <tt>for-each</tt> calls <i>proc</i> for its side effects rather than for its
 | |
| values.  Unlike <tt>map</tt>, <tt>for-each</tt> is guaranteed to call <i>proc</i> on
 | |
| the elements of the <i>list</i>s in order from the first element(s) to the
 | |
| last, and the value returned by <tt>for-each</tt> is unspecified.<p>
 | |
| 
 | |
| <tt><p>(let ((v (make-vector 5)))<br>
 | |
|   (for-each (lambda (i)<br>
 | |
|               (vector-set! v i (* i i)))<br>
 | |
|             '(0 1 2 3 4))<br>
 | |
|   v)                                        ===>  #(0 1 4 9 16)<p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_562"></a>force<i> promise</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Forces the value of <i>promise</i> (see <tt>delay</tt>,
 | |
| section <a href="r5rs-Z-H-7.html#%_sec_4.2.5">4.2.5</a>).<a name="%_idx_564"></a>  If no value has been computed for
 | |
| the promise, then a value is computed and returned.  The value of the
 | |
| promise is cached (or ``memoized'') so that if it is forced a second
 | |
| time, the previously computed value is returned.
 | |
| 
 | |
| <tt><p>(force (delay (+ 1 2)))           ===>  3<br>
 | |
| (let ((p (delay (+ 1 2))))<br>
 | |
|   (list (force p) (force p)))  <br>
 | |
|                                        ===>  (3 3)<br>
 | |
| <br>
 | |
| (define a-stream<br>
 | |
|   (letrec ((next<br>
 | |
|             (lambda (n)<br>
 | |
|               (cons n (delay (next (+ n 1)))))))<br>
 | |
|     (next 0)))<br>
 | |
| (define head car)<br>
 | |
| (define tail<br>
 | |
|   (lambda (stream) (force (cdr stream))))<br>
 | |
| <br>
 | |
| (head (tail (tail a-stream)))  <br>
 | |
|                                        ===>  2<p></tt><p>
 | |
| 
 | |
| <tt>Force</tt> and <tt>delay</tt> are mainly intended for programs written in
 | |
| functional style.  The following examples should not be considered to
 | |
| illustrate good programming style, but they illustrate the property that
 | |
| only one value is computed for a promise, no matter how many times it is
 | |
| forced.
 | |
| 
 | |
| <tt><p>(define count 0)<br>
 | |
| (define p<br>
 | |
|   (delay (begin (set! count (+ count 1))<br>
 | |
|                 (if (> count x)<br>
 | |
|                     count<br>
 | |
|                     (force p)))))<br>
 | |
| (define x 5)<br>
 | |
| p                             ===>  <i>a promise</i><br>
 | |
| (force p)                     ===>  6<br>
 | |
| p                             ===>  <i>a promise, still</i><br>
 | |
| (begin (set! x 10)<br>
 | |
|        (force p))             ===>  6<p></tt><p>
 | |
| 
 | |
| Here is a possible implementation of <tt>delay</tt> and <tt>force</tt>.
 | |
| Promises are implemented here as procedures of no arguments,
 | |
| and <tt>force</tt> simply calls its argument:<p>
 | |
| 
 | |
| <tt><p>(define force<br>
 | |
|   (lambda (object)<br>
 | |
|     (object)))<p></tt><p>
 | |
| 
 | |
| We define the expression<p>
 | |
| 
 | |
| <tt><p>(delay <expression>)<p></tt><p>
 | |
| 
 | |
| to have the same meaning as the procedure call<p>
 | |
| 
 | |
| <tt><p>(make-promise (lambda () <expression>))<br>
 | |
| <p></tt><p>
 | |
| 
 | |
| as follows<p>
 | |
| 
 | |
| <tt><p>(define-syntax delay<br>
 | |
|   (syntax-rules ()<br>
 | |
|     ((delay expression)<br>
 | |
|      (make-promise (lambda () expression))))),<p></tt><p>
 | |
| 
 | |
| where <tt>make-promise</tt> is defined as follows:<p>
 | |
| 
 | |
| 
 | |
| <tt><p>(define make-promise<br>
 | |
|   (lambda (proc)<br>
 | |
|     (let ((result-ready? <tt>#f</tt>)<br>
 | |
|           (result <tt>#f</tt>))<br>
 | |
|       (lambda ()<br>
 | |
|         (if result-ready?<br>
 | |
|             result<br>
 | |
|             (let ((x (proc)))<br>
 | |
|               (if result-ready?<br>
 | |
|                   result<br>
 | |
|                   (begin (set! result-ready? <tt>#t</tt>)<br>
 | |
|                          (set! result x)<br>
 | |
|                          result))))))))<p></tt><p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em>
 | |
| A promise may refer to its own value, as in the last example above.
 | |
| Forcing such a promise may cause the promise to be forced a second time
 | |
| before the value of the first force has been computed.
 | |
| This complicates the definition of <tt>make-promise</tt>.
 | |
| </blockquote><p>
 | |
| 
 | |
| Various extensions to this semantics of <tt>delay</tt> and <tt>force</tt>
 | |
| are supported in some implementations:<p>
 | |
| 
 | |
| <p><ul>
 | |
| <li>Calling <tt>force</tt> on an object that is not a promise may simply
 | |
| return the object.<p>
 | |
| 
 | |
| <li>It may be the case that there is no means by which a promise can be
 | |
| operationally distinguished from its forced value.  That is, expressions
 | |
| like the following may evaluate to either <tt>#t</tt> or to <tt>#f</tt>,
 | |
| depending on the implementation:<p>
 | |
| 
 | |
| <tt><p>(eqv? (delay 1) 1)                  ===>  <i>unspecified</i><br>
 | |
| (pair? (delay (cons 1 2)))          ===>  <i>unspecified</i><p></tt><p>
 | |
| 
 | |
| <li>Some implementations may implement ``implicit forcing,'' where
 | |
| the value of a promise is forced by primitive procedures like <tt>cdr
 | |
| and <tt>+:<p>
 | |
| 
 | |
| <tt><p>(+ (delay (* 3 7)) 13)          ===>  34<p></tt>
 | |
| </ul><p></tt></tt>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_566"></a>call-with-current-continuation<i> proc</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
|  <i>Proc</i> must be a procedure of one
 | |
| argument. The procedure <tt>call-with-current-continuation</tt> packages
 | |
| up the current continuation (see the rationale below) as an ``escape
 | |
| procedure''<a name="%_idx_568"></a> and passes it as an argument to
 | |
| <i>proc</i>.  The escape procedure is a Scheme procedure that, if it is
 | |
| later called, will abandon whatever continuation is in effect at that later
 | |
| time and will instead use the continuation that was in effect
 | |
| when the escape procedure was created.  Calling the escape procedure
 | |
| may cause the invocation of <i>before</i> and <i>after</i> thunks installed using
 | |
| <tt>dynamic-wind</tt>.<p>
 | |
| 
 | |
| The escape procedure accepts the same number of arguments as the continuation to
 | |
| the original call to <tt>call-with-current-continuation</tt>.
 | |
| Except for continuations created by the <tt>call-with-values</tt>
 | |
| procedure, all continuations take exactly one value.  The
 | |
| effect of passing no value or more than one value to continuations
 | |
| that were not created by <tt>call-with-values</tt> is unspecified.<p>
 | |
| 
 | |
| The escape procedure that is passed to <i>proc</i> has
 | |
| unlimited extent just like any other procedure in Scheme.  It may be stored
 | |
| in variables or data structures and may be called as many times as desired.<p>
 | |
| 
 | |
| The following examples show only the most common ways in which
 | |
| <tt>call-with-current-continuation</tt> is used.  If all real uses were as
 | |
| simple as these examples, there would be no need for a procedure with
 | |
| the power of <tt>call-with-current-continuation</tt>.<p>
 | |
| 
 | |
| <tt><p>(call-with-current-continuation<br>
 | |
|   (lambda (exit)<br>
 | |
|     (for-each (lambda (x)<br>
 | |
|                 (if (negative? x)<br>
 | |
|                     (exit x)))<br>
 | |
|               '(54 0 37 -3 245 19))<br>
 | |
|     <tt>#t</tt>))                                ===>  -3<br>
 | |
| <br>
 | |
| (define list-length<br>
 | |
|   (lambda (obj)<br>
 | |
|     (call-with-current-continuation<br>
 | |
|       (lambda (return)<br>
 | |
|         (letrec ((r<br>
 | |
|                   (lambda (obj)<br>
 | |
|                     (cond ((null? obj) 0)<br>
 | |
|                           ((pair? obj)<br>
 | |
|                            (+ (r (cdr obj)) 1))<br>
 | |
|                           (else (return <tt>#f</tt>))))))<br>
 | |
|           (r obj))))))<br>
 | |
| <br>
 | |
| (list-length '(1 2 3 4))                    ===>  4<br>
 | |
| <br>
 | |
| (list-length '(a b . c))                    ===>  <tt>#f</tt><p></tt><p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em><p>
 | |
| 
 | |
| A common use of <tt>call-with-current-continuation</tt> is for
 | |
| structured, non-local exits from loops or procedure bodies, but in fact
 | |
| <tt>call-with-current-continuation</tt> is extremely useful for implementing a
 | |
| wide variety of advanced control structures.<p>
 | |
| 
 | |
| Whenever a Scheme expression is evaluated there is a
 | |
| <a name="%_idx_570"></a><em>continuation</em> wanting the result of the expression.  The continuation
 | |
| represents an entire (default) future for the computation.  If the expression is
 | |
| evaluated at top level, for example, then the continuation might take the
 | |
| result, print it on the screen, prompt for the next input, evaluate it, and
 | |
| so on forever.  Most of the time the continuation includes actions
 | |
| specified by user code, as in a continuation that will take the result,
 | |
| multiply it by the value stored in a local variable, add seven, and give
 | |
| the answer to the top level continuation to be printed.  Normally these
 | |
| ubiquitous continuations are hidden behind the scenes and programmers do not
 | |
| think much about them.  On rare occasions, however, a programmer may
 | |
| need to deal with continuations explicitly.
 | |
| <tt>Call-with-current-continuation</tt> allows Scheme programmers to do
 | |
| that by creating a procedure that acts just like the current
 | |
| continuation.<p>
 | |
| 
 | |
| Most programming languages incorporate one or more special-purpose
 | |
| escape constructs with names like <tt>exit</tt>, <tt>return</tt>, or
 | |
| even <tt>goto</tt>.  In 1965, however, Peter Landin [<a href="r5rs-Z-H-14.html#%_sec_7.3">16</a>]
 | |
| invented a general purpose escape operator called the J-operator.  John
 | |
| Reynolds [<a href="r5rs-Z-H-14.html#%_sec_7.3">24</a>] described a simpler but equally powerful
 | |
| construct in 1972.  The <tt>catch</tt> special form described by Sussman
 | |
| and Steele in the 1975 report on Scheme is exactly the same as
 | |
| Reynolds's construct, though its name came from a less general construct
 | |
| in MacLisp.  Several Scheme implementors noticed that the full power of the
 | |
| <tt>catch</tt> construct could be provided by a procedure instead of by a
 | |
| special syntactic construct, and the name
 | |
| <tt>call-with-current-continuation</tt> was coined in 1982.  This name is
 | |
| descriptive, but opinions differ on the merits of such a long name, and
 | |
| some people use the name <tt>call/cc</tt> instead.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_572"></a>values<i> obj <tt>...</tt></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Delivers all of its arguments to its continuation.
 | |
| Except for continuations created by the <tt>call-with-values</tt>
 | |
| procedure, all continuations take exactly one value.
 | |
| <tt>Values</tt> might be defined as follows:
 | |
| <tt><p>(define (values . things)<br>
 | |
|   (call-with-current-continuation <br>
 | |
|     (lambda (cont) (apply cont things))))<br>
 | |
| <p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_574"></a>call-with-values<i> producer consumer</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Calls its <i>producer</i> argument with no values and
 | |
| a continuation that, when passed some values, calls the
 | |
| <i>consumer</i> procedure with those values as arguments.
 | |
| The continuation for the call to <i>consumer</i> is the
 | |
| continuation of the call to <tt>call-with-values</tt>.<p>
 | |
| 
 | |
| <tt><p>(call-with-values (lambda () (values 4 5))<br>
 | |
|                   (lambda (a b) b))<br>
 | |
|                                                            ===>  5<br>
 | |
| <br>
 | |
| (call-with-values * -)                                     ===>  -1<br>
 | |
| <p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_576"></a>dynamic-wind<i> before thunk after</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Calls <i>thunk</i> without arguments, returning the result(s) of this call.
 | |
| <i>Before</i> and <i>after</i> are called, also without arguments, as required
 | |
| by the following rules (note that in the absence of calls to continuations
 | |
| captured using <tt>call-with-current-continuation</tt> the three arguments are
 | |
| called once each, in order).  <i>Before</i> is called whenever execution
 | |
| enters the dynamic extent of the call to <i>thunk</i> and <i>after</i> is called
 | |
| whenever it exits that dynamic extent.  The dynamic extent of a procedure
 | |
| call is the period between when the call is initiated and when it
 | |
| returns.  In Scheme, because of <tt>call-with-current-continuation</tt>, the
 | |
| dynamic extent of a call may not be a single, connected time period.
 | |
| It is defined as follows:
 | |
| <p><ul>
 | |
| <li>The dynamic extent is entered when execution of the body of the
 | |
| called procedure begins.<p>
 | |
| 
 | |
| <li>The dynamic extent is also entered when execution is not within
 | |
| the dynamic extent and a continuation is invoked that was captured
 | |
| (using <tt>call-with-current-continuation</tt>) during the dynamic extent.<p>
 | |
| 
 | |
| <li>It is exited when the called procedure returns.<p>
 | |
| 
 | |
| <li>It is also exited when execution is within the dynamic extent and
 | |
| a continuation is invoked that was captured while not within the
 | |
| dynamic extent.
 | |
| </ul><p><p>
 | |
| 
 | |
| If a second call to <tt>dynamic-wind</tt> occurs within the dynamic extent of the
 | |
| call to <i>thunk</i> and then a continuation is invoked in such a way that the
 | |
| <i>after</i>s from these two invocations of <tt>dynamic-wind</tt> are both to be
 | |
| called, then the <i>after</i> associated with the second (inner) call to
 | |
| <tt>dynamic-wind</tt> is called first.<p>
 | |
| 
 | |
| If a second call to <tt>dynamic-wind</tt> occurs within the dynamic extent of the
 | |
| call to <i>thunk</i> and then a continuation is invoked in such a way that the
 | |
| <i>before</i>s from these two invocations of <tt>dynamic-wind</tt> are both to be
 | |
| called, then the <i>before</i> associated with the first (outer) call to
 | |
| <tt>dynamic-wind</tt> is called first.<p>
 | |
| 
 | |
| If invoking a continuation requires calling the <i>before</i> from one call
 | |
| to <tt>dynamic-wind</tt> and the <i>after</i> from another, then the <i>after</i>
 | |
| is called first.<p>
 | |
| 
 | |
| The effect of using a captured continuation to enter or exit the dynamic
 | |
| extent of a call to <i>before</i> or <i>after</i> is undefined.<p>
 | |
| 
 | |
| <tt><p>(let ((path '())<br>
 | |
|       (c #f))<br>
 | |
|   (let ((add (lambda (s)<br>
 | |
|                (set! path (cons s path)))))<br>
 | |
|     (dynamic-wind<br>
 | |
|       (lambda () (add 'connect))<br>
 | |
|       (lambda ()<br>
 | |
|         (add (call-with-current-continuation<br>
 | |
|                (lambda (c0)<br>
 | |
|                  (set! c c0)<br>
 | |
|                  'talk1))))<br>
 | |
|       (lambda () (add 'disconnect)))<br>
 | |
|     (if (< (length path) 4)<br>
 | |
|         (c 'talk2)<br>
 | |
|         (reverse path))))<br>
 | |
|     <br>                ===> (connect talk1 disconnect<br>
 | |
|                connect talk2 disconnect)<br>
 | |
| <p></tt>
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.5"></a>
 | |
| <h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.5">6.5  <tt>Eval</tt></a></h2><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_578"></a>eval<i> expression environment-specifier</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Evaluates <i>expression</i> in the specified environment and returns its value.
 | |
| <i>Expression</i> must be a valid Scheme expression represented as data,
 | |
| and <i>environment-specifier</i> must be a value returned by one of the
 | |
| three procedures described below.
 | |
| Implementations may extend <tt>eval</tt> to allow non-expression programs
 | |
| (definitions) as the first argument and to allow other
 | |
| values as environments, with the restriction that <tt>eval</tt> is not
 | |
| allowed to create new bindings in the environments associated with
 | |
| <tt>null-environment</tt> or <tt>scheme-report-environment</tt>.<p>
 | |
| 
 | |
| <tt><p>(eval '(* 7 3) (scheme-report-environment 5))<br>
 | |
|                                                            ===>  21<br>
 | |
| <br>
 | |
| (let ((f (eval '(lambda (f x) (f x x))<br>
 | |
|                (null-environment 5))))<br>
 | |
|   (f + 10))<br>
 | |
|                                                            ===>  20<br>
 | |
| <p></tt><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_580"></a>scheme-report-environment<i> version</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_582"></a>null-environment<i> version</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <i>Version</i> must be the exact integer <tt>5</tt>,
 | |
| corresponding to this revision of the Scheme report (the
 | |
| Revised<sup>5</sup> Report on Scheme).
 | |
| <tt>Scheme-report-environment</tt> returns a specifier for an
 | |
| environment that is empty except for all bindings defined in
 | |
| this report that are either required or both optional and
 | |
| supported by the implementation. <tt>Null-environment</tt> returns
 | |
| a specifier for an environment that is empty except for the
 | |
| (syntactic) bindings for all syntactic keywords defined in
 | |
| this report that are either required or both optional and
 | |
| supported by the implementation.<p>
 | |
| 
 | |
| Other values of <i>version</i> can be used to specify environments
 | |
| matching past revisions of this report, but their support is not
 | |
| required.  An implementation will signal an error if <i>version</i>
 | |
| is neither <tt>5</tt> nor another value supported by
 | |
| the implementation.<p>
 | |
| 
 | |
| The effect of assigning (through the use of <tt>eval</tt>) a variable
 | |
| bound in a <tt>scheme-report-environment</tt>
 | |
| (for example <tt>car</tt>) is unspecified.  Thus the environments specified
 | |
| by <tt>scheme-report-environment</tt> may be immutable.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>optional procedure:</u>  <tt>(<a name="%_idx_584"></a>interaction-environment<i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| This procedure returns a specifier for the environment that
 | |
| contains implementation-defined bindings, typically a superset of
 | |
| those listed in the report.  The intent is that this procedure
 | |
| will return the environment in which the implementation would evaluate
 | |
| expressions dynamically typed by the user.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.6"></a>
 | |
| <h2><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.6">6.6  Input and output</a></h2><p>
 | |
| 
 | |
| <a name="%_sec_6.6.1"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.6.1">6.6.1  Ports</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| Ports represent input and output devices.  To Scheme, an input port is a
 | |
| Scheme object that can deliver characters upon command, while an output port
 | |
| is a Scheme object that can accept characters. <a name="%_idx_586"></a><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_588"></a>call-with-input-file<i> string proc</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_590"></a>call-with-output-file<i> string proc</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <i>String</i> should be a string naming a file, and
 | |
| <i>proc</i> should be a procedure that accepts one argument.
 | |
| For <tt>call-with-input-file</tt>,
 | |
| the file should already exist; for
 | |
| <tt>call-with-output-file</tt>,
 | |
| the effect is unspecified if the file
 | |
| already exists. These procedures call <i>proc</i> with one argument: the
 | |
| port obtained by opening the named file for input or output.  If the
 | |
| file cannot be opened, an error is signalled.  If <i>proc</i> returns,
 | |
| then the port is closed automatically and the value(s) yielded by the
 | |
| <i>proc</i> is(are) returned.  If <i>proc</i> does not return, then 
 | |
| the port will not be closed automatically unless it is possible to
 | |
| prove that the port will never again be used for a read or write
 | |
| operation.
 | |
| 
 | |
| <blockquote><em>Rationale:  </em>
 | |
| Because Scheme's escape procedures have unlimited extent, it  is
 | |
| possible to escape from the current continuation but later to escape back in. 
 | |
| If implementations were permitted to close the port on any escape from the
 | |
| current continuation, then it would be impossible to write portable code using
 | |
| both <tt>call-with-current-continuation</tt> and <tt>call-with-input-file</tt> or
 | |
| <tt>call-with-output-file</tt>.
 | |
| 
 | |
| </blockquote> 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_592"></a>input-port?<i> obj</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_594"></a>output-port?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if <i>obj</i> is an input port or output port
 | |
| respectively, otherwise returns <tt>#f</tt>.<p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_596"></a>current-input-port<i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_598"></a>current-output-port<i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the current default input or output port.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>optional procedure:</u>  <tt>(<a name="%_idx_600"></a>with-input-from-file<i> string thunk</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>optional procedure:</u>  <tt>(<a name="%_idx_602"></a>with-output-to-file<i> string thunk</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <i>String</i> should be a string naming a file, and
 | |
| <i>proc</i> should be a procedure of no arguments.
 | |
| For <tt>with-input-from-file</tt>,
 | |
| the file should already exist; for
 | |
| <tt>with-output-to-file</tt>,
 | |
| the effect is unspecified if the file
 | |
| already exists.
 | |
| The file is opened for input or output, an input or output port
 | |
| connected to it is made the default value returned by
 | |
| <tt>current-input-port</tt> or <tt>current-output-port</tt>
 | |
| (and is used by <tt>(read)</tt>, <tt>(write <i>obj</i>)</tt>, and so forth),
 | |
| and the
 | |
| <i>thunk</i> is called with no arguments.  When the <i>thunk</i> returns,
 | |
| the port is closed and the previous default is restored.
 | |
| <tt>With-input-from-file</tt> and <tt>with-output-to-file</tt> return(s) the
 | |
| value(s) yielded by <i>thunk</i>.
 | |
| If an escape procedure
 | |
| is used to escape from the continuation of these procedures, their
 | |
| behavior is implementation dependent.<p>
 | |
| 
 | |
| 
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_604"></a>open-input-file<i> filename</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Takes a string naming an existing file and returns an input port capable of
 | |
| delivering characters from the file.  If the file cannot be opened, an error is
 | |
| signalled.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_606"></a>open-output-file<i> filename</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Takes a string naming an output file to be created and returns an output
 | |
| port capable of writing characters to a new file by that name.  If the file
 | |
| cannot be opened, an error is signalled.  If a file with the given name
 | |
| already exists, the effect is unspecified.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_608"></a>close-input-port<i> port</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(<a name="%_idx_610"></a>close-output-port<i> port</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Closes the file associated with <i>port</i>, rendering the <i>port</i>
 | |
| incapable of delivering or accepting characters.  
 | |
| These routines have no effect if the file has already been closed.
 | |
| The value returned is unspecified.<p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.6.2"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.6.2">6.6.2  Input</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
|    <p><p>
 | |
| <p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_612"></a>read<i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(read<i> port</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <tt>Read</tt> converts external representations of Scheme objects into the
 | |
| objects themselves.  That is, it is a parser for the nonterminal
 | |
| <datum> (see sections <a href="r5rs-Z-H-10.html#%_sec_7.1.2">7.1.2</a> and
 | |
| <a href="#%_sec_6.3.2">6.3.2</a>).  <tt>Read</tt> returns the next
 | |
| object parsable from the given input <i>port</i>, updating <i>port</i> to point to
 | |
| the first character past the end of the external representation of the object.<p>
 | |
| 
 | |
| If an end of file is encountered in the input before any
 | |
| characters are found that can begin an object, then an end of file
 | |
| object is returned.   The port remains open, and further attempts
 | |
| to read will also return an end of file object.  If an end of file is
 | |
| encountered after the beginning of an object's external representation,
 | |
| but the external representation is incomplete and therefore not parsable,
 | |
| an error is signalled.<p>
 | |
| 
 | |
| The <i>port</i> argument may be omitted, in which case it defaults to the
 | |
| value returned by <tt>current-input-port</tt>.  It is an error to read from
 | |
| a closed port.
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_614"></a>read-char<i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(read-char<i> port</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the next character available from the input <i>port</i>, updating
 | |
| the <i>port</i> to point to the following character.  If no more characters
 | |
| are available, an end of file object is returned.  <i>Port</i> may be
 | |
| omitted, in which case it defaults to the value returned by <tt>current-input-port</tt>.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_616"></a>peek-char<i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(peek-char<i> port</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns the next character available from the input <i>port</i>,
 | |
| <em>without</em> updating
 | |
| the <i>port</i> to point to the following character.  If no more characters
 | |
| are available, an end of file object is returned.  <i>Port</i> may be
 | |
| omitted, in which case it defaults to the value returned by <tt>current-input-port</tt>.<p>
 | |
| 
 | |
| <blockquote><em>Note:  </em>
 | |
| The value returned by a call to <tt>peek-char</tt> is the same as the
 | |
| value that would have been returned by a call to <tt>read-char</tt> with the
 | |
| same <i>port</i>.  The only difference is that the very next call to
 | |
| <tt>read-char</tt> or <tt>peek-char</tt> on that <i>port</i> will return the
 | |
| value returned by the preceding call to <tt>peek-char</tt>.  In particular, a call
 | |
| to <tt>peek-char</tt> on an interactive port will hang waiting for input
 | |
| whenever a call to <tt>read-char</tt> would have hung.
 | |
| </blockquote><p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_618"></a>eof-object?<i> obj</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if <i>obj</i> is an end of file object, otherwise returns
 | |
| <tt>#f</tt>.  The precise set of end of file objects will vary among
 | |
| implementations, but in any case no end of file object will ever be an object
 | |
| that can be read in using <tt>read</tt>.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_620"></a>char-ready?<i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(char-ready?<i> port</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Returns <tt>#t</tt> if a character is ready on the input <i>port</i> and
 | |
| returns <tt>#f</tt> otherwise.  If <tt>char-ready</tt> returns <tt>#t</tt> then
 | |
| the next <tt>read-char</tt> operation on the given <i>port</i> is guaranteed
 | |
| not to hang.  If the <i>port</i> is at end of file then <tt>char-ready?</tt>
 | |
| returns <tt>#t</tt>.  <i>Port</i> may be omitted, in which case it defaults to
 | |
| the value returned by <tt>current-input-port</tt>.<p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em>
 | |
| <tt>Char-ready?</tt> exists to make it possible for a program to
 | |
| accept characters from interactive ports without getting stuck waiting for
 | |
| input.  Any input editors associated with such ports must ensure that
 | |
| characters whose existence has been asserted by <tt>char-ready?</tt> cannot
 | |
| be rubbed out.  If <tt>char-ready?</tt> were to return <tt>#f</tt> at end of
 | |
| file, a port at end of file would be indistinguishable from an interactive
 | |
| port that has no ready characters.
 | |
| </blockquote>
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.6.3"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.6.3">6.6.3  Output</a></h3><p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| 
 | |
| <p><p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_622"></a>write<i> obj</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(write<i> obj port</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Writes a written representation of <i>obj</i> to the given <i>port</i>.  Strings
 | |
| that appear in the written representation are enclosed in doublequotes, and
 | |
| within those strings backslash and doublequote characters are
 | |
| escaped by backslashes.
 | |
| Character objects are written using the <tt>#<tt>\</tt></tt> notation.
 | |
| <tt>Write</tt> returns an unspecified value.  The
 | |
| <i>port</i> argument may be omitted, in which case it defaults to the value
 | |
| returned by <tt>current-output-port</tt>.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_624"></a>display<i> obj</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(display<i> obj port</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Writes a representation of <i>obj</i> to the given <i>port</i>.  Strings
 | |
| that appear in the written representation are not enclosed in
 | |
| doublequotes, and no characters are escaped within those strings.  Character
 | |
| objects appear in the representation as if written by <tt>write-char</tt>
 | |
| instead of by <tt>write</tt>.  <tt>Display</tt> returns an unspecified value.
 | |
| The <i>port</i> argument may be omitted, in which case it defaults to the
 | |
| value returned by <tt>current-output-port</tt>.<p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em>
 | |
| <tt>Write</tt> is intended
 | |
| for producing machine-readable output and <tt>display</tt> is for producing
 | |
| human-readable output.  Implementations that allow ``slashification''
 | |
| within symbols will probably want <tt>write</tt> but not <tt>display</tt> to
 | |
| slashify funny characters in symbols.
 | |
| </blockquote>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>library procedure:</u>  <tt>(<a name="%_idx_626"></a>newline<i></i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>library procedure:</u>  <tt>(newline<i> port</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Writes an end of line to <i>port</i>.  Exactly how this is done differs
 | |
| from one operating system to another.  Returns an unspecified value.
 | |
| The <i>port</i> argument may be omitted, in which case it defaults to the
 | |
| value returned by <tt>current-output-port</tt>.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>procedure:</u>  <tt>(<a name="%_idx_628"></a>write-char<i> char</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>procedure:</u>  <tt>(write-char<i> char port</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| Writes the character <i>char</i> (not an external representation of the
 | |
| character) to the given <i>port</i> and returns an unspecified value.  The
 | |
| <i>port</i> argument may be omitted, in which case it defaults to the value
 | |
| returned by <tt>current-output-port</tt>.<p>
 | |
| 
 | |
| <p><p>
 | |
| 
 | |
| <a name="%_sec_6.6.4"></a>
 | |
| <h3><a href="r5rs-Z-H-2.html#%_toc_%_sec_6.6.4">6.6.4  System interface</a></h3><p>
 | |
| 
 | |
| Questions of system interface generally fall outside of the domain of this
 | |
| report.  However, the following operations are important enough to
 | |
| deserve description here.<p>
 | |
| 
 | |
| <p><div align=left><u>optional procedure:</u>  <tt>(<a name="%_idx_630"></a>load<i> filename</i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <p>
 | |
| 
 | |
| <i>Filename</i> should be a string naming an existing file
 | |
| containing Scheme source code.  The <tt>load</tt> procedure reads
 | |
| expressions and definitions from the file and evaluates them
 | |
| sequentially.  It is unspecified whether the results of the expressions
 | |
| are printed.  The <tt>load</tt> procedure does not affect the values
 | |
| returned by <tt>current-input-port</tt> and <tt>current-output-port</tt>.
 | |
| <tt>Load</tt> returns an unspecified value.<p>
 | |
| 
 | |
| <blockquote><em>Rationale:  </em>
 | |
| For portability, <tt>load</tt> must operate on source files.
 | |
| Its operation on other kinds of files necessarily varies among
 | |
| implementations.
 | |
| </blockquote>
 | |
| <p><p>
 | |
| 
 | |
| <p><div align=left><u>optional procedure:</u>  <tt>(<a name="%_idx_632"></a>transcript-on<i> filename</i>)</tt> </div>
 | |
| 
 | |
| <div align=left><u>optional procedure:</u>  <tt>(<a name="%_idx_634"></a>transcript-off<i></i>)</tt> </div>
 | |
| <p>
 | |
| 
 | |
| <i>Filename</i> must be a string naming an output file to be
 | |
| created. The effect of <tt>transcript-on</tt> is to open the named file
 | |
| for output, and to cause a transcript of subsequent interaction between
 | |
| the user and the Scheme system to be written to the file.  The
 | |
| transcript is ended by a call to <tt>transcript-off</tt>, which closes the
 | |
| transcript file.  Only one transcript may be in progress at any time,
 | |
| though some implementations may relax this restriction.  The values
 | |
| returned by these procedures are unspecified.<p>
 | |
| 
 | |
| <p>
 | |
|         <p>
 | |
| <p><div class=navigation>[Go to <span><a href="r5rs.html">first</a>, <a href="r5rs-Z-H-8.html">previous</a></span><span>, <a href="r5rs-Z-H-10.html">next</a></span> page<span>;   </span><span><a href="r5rs-Z-H-2.html#%_toc_start">contents</a></span><span><span>;   </span><a href="r5rs-Z-H-15.html#%_index_start">index</a></span>]</div><p>
 | |
| 
 | |
| </body>
 | |
| </html>
 |