Retrofit for 0.53.
This commit is contained in:
		
							parent
							
								
									cdd7382bf1
								
							
						
					
					
						commit
						52c03b2003
					
				|  | @ -88,9 +88,12 @@ The settings of all other switches are shared by all command levels. | |||
|  This is useful if the \code{auto-levels} switch has been used | ||||
|  to disable the automatic pushing of new levels for errors and interrupts. | ||||
| 
 | ||||
| \item \code{,reset [\cvar{number}]}\\ | ||||
| \item \code{,level [\cvar{number}]}\\ | ||||
|   Pops down to a given level and restarts that level. | ||||
|   \cvar{Number} defaults to zero, \code{,reset} restarts the command | ||||
|   \cvar{Number} defaults to zero. | ||||
| 
 | ||||
| \item \code{,reset}\\ | ||||
|   \code{,reset} restarts the command | ||||
|   processor, discarding all existing levels. | ||||
| 
 | ||||
| \end{description} | ||||
|  | @ -228,25 +231,10 @@ If no \cvar{command} is given, the \code{config} package becomes the | |||
| 
 | ||||
| There are a number of binary switches that control the behavior of the | ||||
|  command processor. | ||||
| They can be set using the \code{,set} and \code{,unset} commands. | ||||
| 
 | ||||
| \begin{description} | ||||
| \item \code{,set \cvar{switch} [on | off | ?]}\\ | ||||
|     This sets the value of mode-switch \cvar{switch}. | ||||
|     The second argument defaults to \code{on}. | ||||
|     If the second argument is \code{?} the value of \cvar{switch} is | ||||
|     is displayed and not changed. | ||||
|     Doing \code{,set ?} will display a list of the switches and | ||||
|     their current values. | ||||
| 
 | ||||
| \item \code{,unset \cvar{switch}}\\ | ||||
|     \code{,unset \cvar{switch}} is the same as | ||||
|     \code{,set \cvar{switch} off}. | ||||
| \end{description} | ||||
| 
 | ||||
| The switches are as follows: | ||||
| \begin{description} | ||||
| \item \code{batch}\\ | ||||
| \item \code{batch [on | off]}\\ | ||||
|     In `batch mode' any error or interrupt that comes up will cause | ||||
|     Scheme~48 to exit immediately with a non-zero exit status.  Also, | ||||
|     the command processor doesn't print prompts.  Batch mode is | ||||
|  | @ -254,7 +242,7 @@ The switches are as follows: | |||
| 
 | ||||
| % JAR says: disable auto-levels by default?? | ||||
| 
 | ||||
| \item \code{auto-levels}\\ | ||||
| \item \code{,levels [on | off]}\\ | ||||
|     Enables or disables the automatic pushing of a new command level when | ||||
|     an error, interrupt, or other breakpoint occurs. | ||||
|     When enabled (the default), breakpoints push a new command level, | ||||
|  | @ -266,70 +254,28 @@ The switches are as follows: | |||
| \item retention of the continuation in effect at the point of errors | ||||
| \item confusion among some newcomers | ||||
| \end{itemize} | ||||
|     With \code{auto-levels} disabled one must issue a | ||||
|     With \code{levels} disabled one must issue a | ||||
|     \code{,push} command immediately | ||||
|     following an error in order to retain the error continuation for | ||||
|     debugging purposes; otherwise the continuation is lost as soon as | ||||
|     the focus object changes.  If you don't know anything about the | ||||
|     available debugging tools, then levels might as well be disabled. | ||||
| 
 | ||||
| \item \code{inspect-focus-value}\\ | ||||
|     Enable or disable `inspection' mode, which is used for inspecting | ||||
|     data structures and continuations. | ||||
|     \link*{Inspection mode is desribed below} | ||||
|     [Inspection mode is described in section~\Ref] | ||||
|     {inspector}. | ||||
| 
 | ||||
| \item \code{break-on-warnings}\\ | ||||
| \item \code{break-on-warnings [on | off]}\\ | ||||
|     Enter a new command level when a warning is produced, just as | ||||
|     when an error occurs.  Normally warnings only result in a displayed | ||||
|     message and the program does not stop executing. | ||||
| 
 | ||||
| \item \code{ask-before-loading} \\ | ||||
|     If on, the system will ask before loading modules that are arguments | ||||
|     to the \code{,open} command.  \code{Ask-before-loading} is off by | ||||
|     default. | ||||
| \begin{example} | ||||
| > ,set ask-before-loading | ||||
| will ask before loading modules | ||||
| > ,open random | ||||
| Load structure random (y/n)? y | ||||
| > | ||||
| \end{example} | ||||
| 
 | ||||
| \item \code{load-noisily}\\ | ||||
|     When on, the system will print out the names of modules and files | ||||
|     as they are loaded.  \code{load-noisily} is off by default. | ||||
| \begin{example} | ||||
| > ,set load-noisily | ||||
| will notify when loading modules and files | ||||
| > ,open random | ||||
| [random /usr/local/lib/scheme48/big/random.scm] | ||||
| >  | ||||
| \end{example} | ||||
| 
 | ||||
| \item \code{inline-values}\\ | ||||
| This controls whether or not the compiler is allowed to substitute | ||||
|  variables' values in-line. | ||||
| When \code{inline-values} mode is on, | ||||
| some Scheme procedures will be substituted in-line; when it is off, | ||||
| none will. | ||||
| \link*{The performance section}[Section~\Ref]{section:performance} | ||||
| has more information. | ||||
| 
 | ||||
| \end{description} | ||||
| 
 | ||||
| \section{Inspection mode} | ||||
| \label{inspector} | ||||
| 
 | ||||
| There is a data inspector available via the \code{,inspect} and | ||||
|  \code{,debug} commands or by setting the \code{inspect-focus-value} switch. | ||||
|  \code{,debug} commands. | ||||
| The inspector is particularly useful with procedures, continuations, | ||||
|  and records. | ||||
| The command processor can be taken out of inspection mode by | ||||
|  using the \code{q} command, by unsetting the \code{inspect-focus-value} switch, | ||||
|  or by going to a command level where the \code{inspect-focus-value} is not | ||||
|  set. | ||||
|  using the \code{q} command. | ||||
| When in inspection mode, input that begins with | ||||
|   a letter or digit is read as a command, not as an expression. | ||||
| To see the value of a variable or number, do \code{(begin \cvar{exp})} | ||||
|  | @ -551,10 +497,6 @@ When a command level is abandoned for a lower level, or when | |||
| 
 | ||||
| The following commands are useful when debugging multithreaded programs: | ||||
| \begin{description} | ||||
| \item \code{,resume [\cvar{number}]}\\ | ||||
|   Pops out to a given level and resumes running all threads at that level. | ||||
|   \cvar{Number} defaults to zero. | ||||
| 
 | ||||
| \item \code{,threads}\\ | ||||
|     Invokes the inspector on a list of the threads running at the | ||||
|     next lower command level. | ||||
|  |  | |||
|  | @ -104,7 +104,6 @@ Thanks also to Deborah Tatar for providing the Yeats quotation. | |||
| \include{module} | ||||
| \include{utilities} | ||||
| \include{external} | ||||
| \include{posix} | ||||
| \include{ascii} | ||||
| \include{bibliography} | ||||
| 
 | ||||
|  |  | |||
|  | @ -132,14 +132,6 @@ The configuration language consists of top-level defining forms for | |||
|         \>\altz{}~ \tt(\syn{name} \syn{type}) \\ | ||||
|         \>\altz{}~ \tt((\arbno{\syn{name}}) \syn{type}) \\ | ||||
|    \syn{structure} \=\goesto{}~ \syn{name} \\ | ||||
|         \>\altz{}~ \tt(modify \syn{structure} \arbno{\syn{modifier}}) \\ | ||||
|         \>\altz{}~ \tt(subset \syn{structure} (\arbno{\syn{name}})) \\ | ||||
|         \>\altz{}~ \tt(with-prefix \syn{structure} \syn{name}) \\ | ||||
|    \syn{modifier} \=\goesto{}~ \tt(expose \arbno{\syn{name}}) \\ | ||||
|         \>\altz{}~ \tt(hide \arbno{\syn{name}}) \\ | ||||
|         \>\altz{}~ \tt(rename \arbno{(\syn{name}$_0$ \syn{name}$_1$)}) \\ | ||||
|         \>\altz{}~ \tt(alias \arbno{(\syn{name}$_0$ \syn{name}$_1$)}) \\ | ||||
|         \>\altz{}~ \tt(prefix \syn{name}) \\ | ||||
| \end{tabbing} | ||||
| \caption{The configuration language.} | ||||
| \end{figure} | ||||
|  | @ -164,58 +156,19 @@ For building structures that export structures, there is a {\tt defpackage} | |||
| Many other structures, such as record and hash table facilities, are also | ||||
|  available in the \hack{} implementation. | ||||
| 
 | ||||
| The \codemainindex{{modify}}, \codemainindex{{subset}}, and | ||||
|  \codemainindex{{prefix}} forms produce new | ||||
|  views on existing structures by renaming or hiding exported names. | ||||
| \code{Subset} returns a new structure that exports only the listed names | ||||
|  from its \syn{structure} argument. | ||||
| \code{With-prefix} returns a new structure that adds \syn{prefix} | ||||
|  to each of the names exported by the \syn{structure} argument. | ||||
| For example, if structure \code{s} exports \code{a} and \code{b}, | ||||
|  then | ||||
| \begin{example} | ||||
| (subset s (a)) | ||||
| \end{example} | ||||
|  exports only \code{a} and | ||||
| \begin{example} | ||||
| (with-prefix s p/) | ||||
| \end{example} | ||||
| exports \code{a} as \code{p/a} and \code{b} as \code{p/b}. | ||||
| 
 | ||||
| Both \code{subset} and \code{with-prefix} are simple macros that | ||||
|  expand into uses of \code{modify}, a more general renaming form. | ||||
| In a \code{modify} structure specification the \syn{command}s are applied to | ||||
|  the names exported | ||||
|  by \syn{structure} to produce a new set of names for the \syn{structure}'s | ||||
|  bindings. | ||||
| \code{Expose} makes only the listed names visible. | ||||
| \code{Hide} makes all but the listed names visible. | ||||
| \code{Rename} makes each \syn{name}$_0$ visible as \syn{name}$_1$  | ||||
|  name and not visible as \syn{name}$_0$ , while | ||||
|  \code{alias} makes each \syn{name}$_0$ visible as both \syn{name}$_0$  | ||||
|  and \syn{name}$_1$. | ||||
| \code{Prefix} adds \syn{name} to the beginning of each exported name. | ||||
| The modifiers are applied from right to left.  Thus | ||||
| \begin{example} | ||||
| (modify scheme (prefix foo/) (rename (car bus)))) | ||||
| \end{example} | ||||
|  makes \code{car} available as \code{foo/bus}.. | ||||
| 
 | ||||
| % Use modify instead of structure-ref. | ||||
| % | ||||
| %An {\tt access} clause specifies which bindings of names to structures | ||||
| %will be visible inside the package body for use in {\tt structure-ref} | ||||
| %forms.  {\tt structure-\ok{}ref} has the following syntax: | ||||
| %\begin{tabbing} | ||||
| %\qquad \syn{expression} \goesto{}~ | ||||
| %   \tt(structure-ref \syn{struct-name} \syn{name}) | ||||
| %\end{tabbing} | ||||
| %The \syn{struct-name} must be the name of an {\tt access}ed structure, | ||||
| %and \syn{name} must be something that the structure exports.  Only | ||||
| %structures listed in an {\tt access} clause are valid in a {\tt | ||||
| %structure-ref}.  If a package accesses any structures, it should | ||||
| %probably open the {\tt structure-refs} structure so that the {\tt | ||||
| %structure-ref} operator itself will be available. | ||||
| An {\tt access} clause specifies which bindings of names to structures | ||||
| will be visible inside the package body for use in {\tt structure-ref} | ||||
| forms.  {\tt structure-\ok{}ref} has the following syntax: | ||||
| \begin{tabbing} | ||||
| \qquad \syn{expression} \goesto{}~ | ||||
|    \tt(structure-ref \syn{struct-name} \syn{name}) | ||||
| \end{tabbing} | ||||
| The \syn{struct-name} must be the name of an {\tt access}ed structure, | ||||
| and \syn{name} must be something that the structure exports.  Only | ||||
| structures listed in an {\tt access} clause are valid in a {\tt | ||||
| structure-ref}.  If a package accesses any structures, it should | ||||
| probably open the {\tt structure-refs} structure so that the {\tt | ||||
| structure-ref} operator itself will be available. | ||||
| 
 | ||||
| The package's body is specified by {\tt begin} and/or {\tt files} | ||||
| clauses.  {\tt begin} and {\tt files} have the same semantics, except | ||||
|  |  | |||
							
								
								
									
										1109
									
								
								doc/src/posix.tex
								
								
								
								
							
							
						
						
									
										1109
									
								
								doc/src/posix.tex
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -725,713 +725,6 @@ Structure \code{c-system-function} provides access to the C \code{system()} | |||
| \evalsto 'foo | ||||
| \end{example} | ||||
| 
 | ||||
| \section{Sockets} | ||||
| % Richard says: add UDP documentation. | ||||
| 
 | ||||
| Structure \code{sockets} provides access to TCP/IP sockets for interprocess | ||||
|  and network communication. | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{open-socket}{}{socket} | ||||
| \proto{open-socket}{ port-number}{socket} | ||||
| \proto{socket-port-number}{ socket}{integer} | ||||
| \protonoresult{close-socket}{ socket} | ||||
| \proto{socket-accept}{ socket}{input-port output-port} | ||||
| \proto{get-host-name}{}{string} | ||||
| \end{protos} | ||||
| \noindent | ||||
| \code{Open-socket} creates a new socket. | ||||
| If no \cvar{port-number} is supplied the system picks one at random. | ||||
| \code{Socket-port-number} returns a socket's port number. | ||||
| \code{Close-socket} closes a socket, preventing any further connections. | ||||
| \code{Socket-accept} accepts a single connection on \cvar{socket}, returning | ||||
|  an input port and an output port for communicating with the client. | ||||
| If no client is waiting \code{socket-accept} blocks until one appears. | ||||
| \code{Get-host-name} returns the network name of the machine. | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{socket-client}{ host-name port-number}{input-port output-port} | ||||
| \end{protos} | ||||
| \noindent | ||||
| \code{Socket-client} connects to the server at \cvar{port-number} on | ||||
|  the machine named \cvar{host-name}. | ||||
| \code{Socket-client} blocks until the server accepts the connection. | ||||
| 
 | ||||
| The following simple example shows a server and client for a centralized UID | ||||
|  service. | ||||
| \begin{example} | ||||
| (define (id-server) | ||||
|   (let ((socket (open-socket))) | ||||
|     (display "Waiting on port ") | ||||
|     (display (socket-port-number socket)) | ||||
|     (newline) | ||||
|     (let loop ((next-id 0)) | ||||
|       (call-with-values | ||||
|         (lambda () | ||||
|           (socket-accept socket)) | ||||
|         (lambda (in out) | ||||
|           (display next-id out) | ||||
|           (close-input-port in) | ||||
|           (close-output-port out) | ||||
|           (loop (+ next-id 1))))))) | ||||
|           | ||||
| (define (get-id machine port-number) | ||||
|   (call-with-values | ||||
|     (lambda () | ||||
|       (socket-client machine port-number)) | ||||
|     (lambda (in out) | ||||
|       (let ((id (read in))) | ||||
|         (close-input-port in) | ||||
|         (close-output-port out) | ||||
|         id)))) | ||||
| \end{example} | ||||
| 
 | ||||
| \section{Macros for writing loops} | ||||
| % JAR says: origin? history? | ||||
| 
 | ||||
| \code{Iterate} and \code{reduce} are extensions of named-\code{let} for | ||||
|  writing loops that walk down one or more sequences, | ||||
|  such as the elements of a list or vector, the | ||||
|  characters read from a port, or an arithmetic series. | ||||
| Additional sequences can be defined by the user. | ||||
| \code{Iterate} and \code{reduce} are in structure \code{reduce}. | ||||
| 
 | ||||
| \subsection{{\tt Iterate}} | ||||
| 
 | ||||
| The syntax of \code{iterate} is: | ||||
| \begin{example} | ||||
|   (iterate \cvar{loop-name} | ||||
|            ((\cvar{sequence-type} \cvar{element-variable} \cvar{sequence-data} \ldots) | ||||
|             \ldots) | ||||
|            ((\cvar{state-variable} \cvar{initial-value}) | ||||
|             \ldots) | ||||
|     \cvar{body-expression} | ||||
|     [\cvar{final-expression}]) | ||||
| \end{example} | ||||
| 
 | ||||
| \code{Iterate} steps the \cvar{element-variable}s in parallel through the | ||||
|  sequences, while each \cvar{state-variable} has the corresponding | ||||
|  \cvar{initial-value} for the first iteration and have later values | ||||
|  supplied by \cvar{body-expression}.  | ||||
| If any sequence has reached its limit the value of the \code{iterate} | ||||
|  expression is | ||||
|  the value of \cvar{final-expression}, if present, or the current values of | ||||
|  the \cvar{state-variable}s, returned as multiple values. | ||||
| If no sequence has reached | ||||
|  its limit, \cvar{body-expression} is evaluated and either calls \cvar{loop-name} with | ||||
|  new values for the \cvar{state-variable}s, or returns some other value(s). | ||||
| 
 | ||||
| The \cvar{loop-name} and the \cvar{state-variable}s and \cvar{initial-value}s behave | ||||
| exactly as in named-\code{let}.  The named-\code{let} expression | ||||
| \begin{example} | ||||
|   (let loop-name ((state-variable initial-value) ...) | ||||
|     body ...) | ||||
| \end{example} | ||||
| is equivalent to an \code{iterate} expression with no sequences | ||||
|  (and with an explicit | ||||
|  \code{let} wrapped around the body expressions to take care of any | ||||
|  internal \code{define}s): | ||||
| \begin{example} | ||||
|   (iterate loop-name | ||||
|            () | ||||
|            ((state-variable initial-value) ...) | ||||
|     (let () body ...)) | ||||
| \end{example} | ||||
| 
 | ||||
| The \cvar{sequence-type}s are keywords (they are actually macros of a particular | ||||
|  form; it is easy to add additional types of sequences). | ||||
| Examples are \code{list*} which walks down the elements of a list and | ||||
|  \code{vector*} which does the same for vectors. | ||||
| For each iteration, each \cvar{element-variable} is bound to the next | ||||
|  element of the sequence. | ||||
| The \cvar{sequence-data} gives the actual list or vector or whatever. | ||||
| 
 | ||||
| If there is a \cvar{final-expression}, it is evaluated when the end of one or more | ||||
|  sequences is reached. | ||||
| If the \cvar{body-expression} does not call \cvar{loop-name} the | ||||
|  \cvar{final-expression} is not evaluated. | ||||
| The \cvar{state-variable}s are visible in | ||||
|  \cvar{final-expression} but the \cvar{sequence-variable}s are not.   | ||||
| 
 | ||||
| The \cvar{body-expression} and the \cvar{final-expression} are in tail-position within | ||||
|  the \code{iterate}. | ||||
| Unlike named-\code{let}, the behavior of a non-tail-recursive call to | ||||
|  \cvar{loop-name} is unspecified (because iterating down a sequence may involve side | ||||
|  effects, such as reading characters from a port). | ||||
| 
 | ||||
| \subsection{{\tt Reduce}} | ||||
| 
 | ||||
| If an \code{iterate} expression is not meant to terminate before a sequence | ||||
|  has reached its end, | ||||
|  \cvar{body-expression} will always end with a tail call to \cvar{loop-name}. | ||||
| \code{Reduce} is a macro that makes this common case explicit. | ||||
| The syntax of \code{reduce} is | ||||
|  the same as that of \code{iterate}, except that there is no \cvar{loop-name}. | ||||
| The \cvar{body-expression} returns new values of the \cvar{state-variable}s | ||||
|  instead of passing them to \cvar{loop-name}. | ||||
| Thus \cvar{body-expression} must return as many values as there are state | ||||
|  variables. | ||||
| By special dispensation, if there are | ||||
|  no state variables then \cvar{body-expression} may return any number of values, | ||||
|  all of which are ignored. | ||||
| 
 | ||||
| The syntax of \code{reduce} is: | ||||
| \begin{example} | ||||
|   (reduce ((\cvar{sequence-type} \cvar{element-variable} \cvar{sequence-data} \ldots) | ||||
|             \ldots) | ||||
|            ((\cvar{state-variable} \cvar{initial-value}) | ||||
|             \ldots) | ||||
|     \cvar{body-expression} | ||||
|     [\cvar{final-expression}]) | ||||
| \end{example} | ||||
| 
 | ||||
| The value(s) returned by an instance of \code{reduce} is the value(s) returned | ||||
|  by the \cvar{final-expression}, if present, or the current value(s) of the state | ||||
| variables when the end of one or more sequences is reached. | ||||
| 
 | ||||
| A \code{reduce} expression can be rewritten as an equivalent \code{iterate} | ||||
|  expression by adding a \cvar{loop-var} and a wrapper for the | ||||
|  \cvar{body-expression} that calls the \cvar{loop-var}. | ||||
| \begin{example} | ||||
| (iterate loop | ||||
|          ((\cvar{sequence-type} \cvar{element-variable} \cvar{sequence-data} \ldots) | ||||
|           \ldots) | ||||
|          ((\cvar{state-variable} \cvar{initial-value}) | ||||
|           \ldots) | ||||
|   (call-with-values (lambda () | ||||
|                       \cvar{body-expression}) | ||||
|                     loop) | ||||
|   [\cvar{final-expression}]) | ||||
| \end{example} | ||||
| 
 | ||||
| \subsection{Sequence types} | ||||
| 
 | ||||
| The predefined sequence types are: | ||||
| \begin{protos} | ||||
| \syntaxprotonoresultnoindex{list*}{ \cvar{elt-var} \cvar{list}} | ||||
| \syntaxprotonoresultnoindex{vector*}{ \cvar{elt-var} \cvar{vector}} | ||||
| \syntaxprotonoresultnoindex{string*}{ \cvar{elt-var} \cvar{string}} | ||||
| \syntaxprotonoresultnoindex{count*} | ||||
|  { \cvar{elt-var} \cvar{start} [\cvar{end} [\cvar{step}]]} | ||||
| \syntaxprotonoresultnoindex{input*} | ||||
|  { \cvar{elt-var} \cvar{input-port} \cvar{read-procedure}} | ||||
| \syntaxprotonoresultnoindex{stream*} | ||||
|  { \cvar{elt-var} \cvar{procedure} \cvar{initial-data}} | ||||
| \end{protos} | ||||
| 
 | ||||
| For lists, vectors, and strings the element variable is bound to the | ||||
|  successive elements of the list or vector, or the characters in the | ||||
|  string. | ||||
| 
 | ||||
| For \code{count*} the element variable is bound to the elements of the sequence | ||||
| \begin{example} | ||||
|  \cvar{start}, \cvar{start} + \cvar{step}, \cvar{start} + 2\cvar{step}, \ldots, \cvar{end} | ||||
| \end{example} | ||||
|  inclusive of \cvar{start} and exclusive of \cvar{end}. | ||||
| The default \cvar{step} is 1. | ||||
| The sequence does not terminate if no \cvar{end} is given or if there | ||||
|  is no $N > 0$ such that \cvar{end} = \cvar{start} + N\cvar{step} | ||||
|  (\code{=} is used to test for termination). | ||||
| For example, \code{(count* i 0 -1)} doesn't terminate | ||||
|  because it begins past the \cvar{end} value and \code{(count* i 0 1 2)} doesn't | ||||
|  terminate because it skips over the \cvar{end} value. | ||||
| 
 | ||||
| For \code{input*} the elements are the results of successive applications | ||||
|  of \cvar{read-procedure} to \cvar{input-port}. | ||||
| The sequence ends when \cvar{read-procedure} returns an end-of-file object. | ||||
| 
 | ||||
| For a stream, the \cvar{procedure} takes the current data value as an argument | ||||
|  and returns two values, the next value of the sequence and a new data value. | ||||
| If the new data is \code{\#f} then the previous element was the last | ||||
|  one.  For example, | ||||
| \begin{example} | ||||
|   (list* elt my-list) | ||||
| \end{example} | ||||
|  is the same as | ||||
| \begin{example} | ||||
|   (stream* elt list->stream my-list) | ||||
| \end{example} | ||||
|  where \code{list->stream} is | ||||
| \begin{example} | ||||
|   (lambda (list) | ||||
|     (if (null? list) | ||||
|         (values 'ignored \#f) | ||||
|         (values (car list) (cdr list)))) | ||||
| \end{example} | ||||
| 
 | ||||
| \subsection{Synchronous sequences} | ||||
| 
 | ||||
| When using the sequence types described above, a loop terminates when any of | ||||
| its sequences reaches its end.  To help detect bugs it is useful to have | ||||
| sequence types that check to see if two or more sequences end on the same | ||||
| iteration.  For this purpose there is second set of sequence types called | ||||
| synchronous sequences.  These are identical to the ones listed above except | ||||
| that they cause an error to be signalled if a loop is terminated by a | ||||
| synchronous sequence and some other synchronous sequence did not reach its | ||||
| end on the same iteration. | ||||
| 
 | ||||
| Sequences are checked for termination in order, from left to right, and | ||||
| if a loop is terminated by a non-synchronous sequence no further checking | ||||
| is done. | ||||
| 
 | ||||
| The synchronous sequences are: | ||||
| 
 | ||||
| \begin{protos} | ||||
| \syntaxprotonoresultnoindex{list\%}{ \cvar{elt-var} \cvar{list}} | ||||
| \syntaxprotonoresultnoindex{vector\%}{ \cvar{elt-var} \cvar{vector}} | ||||
| \syntaxprotonoresultnoindex{string\%}{ \cvar{elt-var} \cvar{string}} | ||||
| \syntaxprotonoresultnoindex{count\%} | ||||
|  { \cvar{elt-var} \cvar{start} \cvar{end} [\cvar{step}]} | ||||
| \syntaxprotonoresultnoindex{input\%} | ||||
|  { \cvar{elt-var} \cvar{input-port} \cvar{read-procedure}} | ||||
| \syntaxprotonoresultnoindex{stream\%} | ||||
|  { \cvar{elt-var} \cvar{procedure} \cvar{initial-data}} | ||||
| \end{protos} | ||||
| 
 | ||||
| Note that the synchronous \code{count\%} must have an \cvar{end}, unlike the | ||||
|  nonsynchronous \code{count\%}. | ||||
| 
 | ||||
| \subsection{Examples} | ||||
| 
 | ||||
| \noindent | ||||
| Gathering the indexes of list elements that answer true to some | ||||
| predicate. | ||||
| \begin{example} | ||||
| (lambda (my-list predicate) | ||||
|   (reduce ((list* elt my-list) | ||||
|            (count* i 0)) | ||||
|           ((hits '())) | ||||
|     (if (predicate elt) | ||||
|         (cons i hits) | ||||
|         hits) | ||||
|     (reverse hits)) | ||||
| \end{example} | ||||
| 
 | ||||
| \noindent | ||||
| Looking for the index of an element of a list. | ||||
| \begin{example} | ||||
| (lambda (my-list predicate) | ||||
|   (iterate loop | ||||
|            ((list* elt my-list) | ||||
|             (count* i 0)) | ||||
|            ()                                ; no state | ||||
|     (if (predicate elt) | ||||
|         i | ||||
|         (loop)))) | ||||
| \end{example} | ||||
| 
 | ||||
| \noindent | ||||
| Reading one line. | ||||
| \begin{example} | ||||
| (define (read-line port) | ||||
|   (iterate loop | ||||
|            ((input* c port read-char)) | ||||
|            ((chars '())) | ||||
|     (if (char=? c \#\verb2\2newline) | ||||
|         (list->string (reverse chars)) | ||||
|         (loop (cons c chars))) | ||||
|     (if (null? chars) | ||||
|         (eof-object) | ||||
|         ; no newline at end of file | ||||
|         (list->string (reverse chars))))) | ||||
| \end{example} | ||||
| 
 | ||||
| \noindent | ||||
| Counting the lines in a file.  We can't use \code{count*} because we | ||||
| need the value of the count after the loop has finished. | ||||
| \begin{example} | ||||
| (define (line-count name) | ||||
|   (call-with-input-file name | ||||
|     (lambda (in) | ||||
|       (reduce ((input* l in read-line)) | ||||
|               ((i 0)) | ||||
|         (+ i 1))))) | ||||
| \end{example} | ||||
| 
 | ||||
| \subsection{Defining sequence types} | ||||
| 
 | ||||
| The sequence types are object-oriented macros similar to enumerations. | ||||
| A non-synchronous sequence macro needs to supply three values: | ||||
|  \code{\#f} to indicate that it isn't synchronous, a list of state variables | ||||
|  and their initializers, and the code for one iteration. | ||||
| The first | ||||
|  two methods are CPS'ed: they take another macro and argument to | ||||
|  which to pass their result. | ||||
| The \code{synchronized?} method gets no additional arguments. | ||||
| The \code{state-vars} method is passed a list of names which | ||||
|  will be bound to the arguments to the sequence. | ||||
| The final method, for the step, is passed the list of names bound to | ||||
|  the arguments and the list of state variables. | ||||
| In addition there is | ||||
|  a variable to be bound to the next element of the sequence, the | ||||
|  body expression for the loop, and an expression for terminating the | ||||
|  loop. | ||||
| 
 | ||||
| The definition of \code{list*} is | ||||
| \begin{example} | ||||
| (define-syntax list* | ||||
|   (syntax-rules (synchronized? state-vars step) | ||||
|     ((list* synchronized? (next more)) | ||||
|      (next \#f more)) | ||||
|     ((list* state-vars (start-list) (next more)) | ||||
|      (next ((list-var start-list)) more)) | ||||
|     ((list* step (start-list) (list-var) | ||||
|             value-var loop-body final-exp) | ||||
|      (if (null? list-var) | ||||
|          final-exp | ||||
|          (let ((value-var (car list-var)) | ||||
|                (list-var (cdr list-var))) | ||||
|            loop-body))))) | ||||
| \end{example} | ||||
| 
 | ||||
| Synchronized sequences are the same, except that they need to | ||||
|  provide a termination test to be used when some other synchronized | ||||
|  method terminates the loop. | ||||
| \begin{example} | ||||
| (define-syntax list\% | ||||
|   (syntax-rules (sync done) | ||||
|     ((list\% sync (next more)) | ||||
|      (next \#t more)) | ||||
|     ((list\% done (start-list) (list-var)) | ||||
|      (null? list-var)) | ||||
|     ((list\% stuff ...) | ||||
|      (list* stuff ...)))) | ||||
| \end{example} | ||||
| 
 | ||||
| \subsection{Expanded code} | ||||
| 
 | ||||
| The expansion of  | ||||
| \begin{example} | ||||
|   (reduce ((list* x '(1 2 3))) | ||||
|           ((r '())) | ||||
|     (cons x r)) | ||||
| \end{example} | ||||
| is | ||||
| \begin{example} | ||||
|   (let ((final (lambda (r) (values r))) | ||||
|         (list '(1 2 3)) | ||||
|         (r '())) | ||||
|     (let loop ((list list) (r r)) | ||||
|       (if (null? list) | ||||
|           (final r) | ||||
|           (let ((x (car list)) | ||||
|                 (list (cdr list))) | ||||
|             (let ((continue (lambda (r) | ||||
|                               (loop list r)))) | ||||
|               (continue (cons x r))))))) | ||||
| \end{example} | ||||
| 
 | ||||
| The only inefficiencies in this code are the \code{final} and \code{continue} | ||||
|  procedures, both of which could be substituted in-line. | ||||
| The macro expander could do the substitution for \code{continue} when there | ||||
|  is no explicit proceed variable, as in this case, but not in general. | ||||
| 
 | ||||
| \section{Regular expressions} | ||||
| \label{regexp-adt} | ||||
| 
 | ||||
| This section describes a functional interface for building regular | ||||
|  expressions and matching them against strings. | ||||
| The matching is done using the POSIX regular expression package. | ||||
| Regular expressions are in the structure \code{regexps}. | ||||
| 
 | ||||
| A regular expression is either a character set, which matches any character | ||||
| in the set, or a composite expression containing one or more subexpressions. | ||||
| A regular expression can be matched against a string to determine success | ||||
| or failure, and to determine the substrings matched by particular subexpressions. | ||||
| 
 | ||||
| \subsection{Character sets} | ||||
| 
 | ||||
| Character sets may be defined using a list of characters and strings, | ||||
| using a range or ranges of characters, or by using set operations on | ||||
| existing character sets. | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{set}{ character-or-string \ldots}{char-set} | ||||
| \proto{range}{ low-char high-char}{char-set} | ||||
| \proto{ranges}{ low-char high-char \ldots}{char-set} | ||||
| \proto{ascii-range}{ low-char high-char}{char-set} | ||||
| \proto{ascii-ranges}{ low-char high-char \ldots}{char-set} | ||||
| \end{protos} | ||||
| \noindent | ||||
| \code{Set} returns a set that contains the character arguments and the | ||||
| characters in any string arguments.  \code{Range} returns a character | ||||
| set that contain all characters between \cvar{low-char} and \cvar{high-char}, | ||||
| inclusive.  \code{Ranges} returns a set that contains all characters in | ||||
| the given ranges.  \code{Range} and \code{ranges} use the ordering induced by | ||||
| \code{char->integer}.  \code{Ascii-range} and \code{ascii-ranges} use the | ||||
|  ASCII ordering. | ||||
| It is an error for a \cvar{high-char} to be less than the preceding | ||||
|  \cvar{low-char} in the appropriate ordering. | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{negate}{ char-set}{char-set} | ||||
| \proto{intersection}{ char-set char-set}{char-set} | ||||
| \proto{union}{ char-set char-set}{char-set} | ||||
| \proto{subtract}{ char-set char-set}{char-set} | ||||
| \end{protos} | ||||
| \noindent | ||||
| These perform the indicated operations on character sets. | ||||
| 
 | ||||
| The following character sets are predefined: | ||||
| \begin{center} | ||||
| \W\begin{tabular}{ll} | ||||
| \T\setlongtables | ||||
| \T\begin{longtable}{ll} | ||||
|  \code{lower-case} &   \code{(set "abcdefghijklmnopqrstuvwxyz")} \\ | ||||
|  \code{upper-case} &   \code{(set "ABCDEFGHIJKLMNOPQRSTUVWXYZ")} \\ | ||||
|  \code{alphabetic} &   \code{(union lower-case upper-case)} \\ | ||||
|  \code{numeric} &      \code{(set "0123456789")} \\ | ||||
|  \code{alphanumeric} & \code{(union alphabetic numeric)} \\ | ||||
|  \code{punctuation} & | ||||
|  \code{(set "}\verb2!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~2\code{")} \\ | ||||
|  \code{graphic} &      \code{(union alphanumeric punctuation)} \\ | ||||
|  \code{printing} &     \code{(union graphic (set \#}\verb2\2\code{space))} \\ | ||||
|  \code{control} &      \code{(negate printing)} \\ | ||||
|  \code{blank} & | ||||
|       \code{(set \#}\verb2\2\code{space (ascii->char 9))} ; 9 is tab \\ | ||||
|  \code{whitespace} & | ||||
|       \code{(union (set \#}\verb2\2\code{space) (ascii-range 9 13))} \\ | ||||
|  \code{hexdigit} &     \code{(set "0123456789abcdefABCDEF")} \\ | ||||
| \W\end{tabular} | ||||
| \T\end{longtable} | ||||
| \end{center} | ||||
| \noindent The above are taken from the default locale in POSIX. | ||||
| The characters in \code{whitespace} are \cvar{space}, \cvar{tab}, | ||||
|  \cvar{newline} (= \cvar{line feed}), \cvar{vertical tab}, \cvar{form feed}, and | ||||
|  \cvar{carriage return}. | ||||
| 
 | ||||
| \subsection{Anchoring} | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{string-start}{}{reg-exp} | ||||
| \proto{string-end}{}{reg-exp} | ||||
| \end{protos} | ||||
| \noindent | ||||
| \code{String-start} returns a regular expression that matches the beginning | ||||
|  of the string being matched against; {string-end} returns one that matches | ||||
|  the end. | ||||
| 
 | ||||
| \subsection{Composite expressions} | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{sequence}{ reg-exp \ldots}{reg-exp} | ||||
| \proto{one-of}{ reg-exp \ldots}{reg-exp} | ||||
| \end{protos} | ||||
| \noindent | ||||
| \code{Sequence} matches the concatenation of its arguments, \code{one-of} matches | ||||
| any one of its arguments. | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{text}{ string}{reg-exp} | ||||
| \end{protos} | ||||
| \noindent | ||||
| \code{Text} returns a regular expression that matches the characters in | ||||
|  \cvar{string}, in order. | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{repeat}{ reg-exp}{reg-exp} | ||||
| \proto{repeat}{ count reg-exp}{reg-exp} | ||||
| \proto{repeat}{ min max reg-exp}{reg-exp} | ||||
| \end{protos} | ||||
| \noindent | ||||
| \code{Repeat} returns a regular expression that matches zero or more | ||||
| occurences of its \cvar{reg-exp} argument.  With no count the result | ||||
| will match any number of times (\cvar{reg-exp}*).  With a single | ||||
| count the returned expression will match | ||||
|  \cvar{reg-exp} exactly that number of times. | ||||
| The final case will match from \cvar{min} to \cvar{max} | ||||
|  repetitions, inclusive. | ||||
| \cvar{Max} may be \code{\#f}, in which case there | ||||
|  is no maximum number of matches. | ||||
| \cvar{Count} and \cvar{min} should be exact, non-negative integers; | ||||
|  \cvar{max} should either be an exact non-negative integer or \code{\#f}. | ||||
| 
 | ||||
| \subsection{Case sensitivity} | ||||
| 
 | ||||
| Regular expressions are normally case-sensitive. | ||||
| \begin{protos} | ||||
| \proto{ignore-case}{ reg-exp}{reg-exp} | ||||
| \proto{use-case}{ reg-exp}{reg-exp} | ||||
| \end{protos} | ||||
| \noindent | ||||
| The value returned by | ||||
|  \code{ignore-case} is identical its argument except that case will be | ||||
|  ignored when matching. | ||||
| The value returned by \code{use-case} is protected | ||||
|  from future applications of \code{ignore-case}. | ||||
| The expressions returned | ||||
|  by \code{use-case} and \code{ignore-case} are unaffected by later uses of the | ||||
|  these procedures. | ||||
| By way of example, the following matches \code{"ab"} but not \code{"aB"}, | ||||
|  \code{"Ab"}, or \code{"AB"}. | ||||
| \begin{example} | ||||
| \code{(text "ab")} | ||||
| \end{example} | ||||
| \noindent | ||||
| while | ||||
| \begin{example} | ||||
| \code{(ignore-case (test "ab"))} | ||||
| \end{example} | ||||
| \noindent | ||||
| matches \code{"ab"}, \code{"aB"}, | ||||
|  \code{"Ab"}, and \code{"AB"} and | ||||
| \begin{example} | ||||
| (ignore-case (sequence (text "a") | ||||
|                        (use-case (text "b")))) | ||||
| \end{example} | ||||
| \noindent | ||||
| matches \code{"ab"} and \code{"Ab"} but not \code{"aB"} or \code{"AB"}. | ||||
| 
 | ||||
| \subsection{Submatches and matching} | ||||
| 
 | ||||
| A subexpression within a larger expression can be marked as a submatch. | ||||
| When an expression is matched against a string, the success or failure | ||||
| of each submatch within that expression is reported, as well as the | ||||
| location of the substring matched be each successful submatch. | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{submatch}{ key reg-exp}{reg-exp} | ||||
| \proto{no-submatches}{ reg-exp}{reg-exp} | ||||
| \end{protos} | ||||
| \noindent | ||||
| \code{Submatch} returns a regular expression that matches its argument and | ||||
|  causes the result of matching its argument to be reported by the \code{match} | ||||
|  procedure. | ||||
| \cvar{Key} is used to indicate the result of this particular submatch  | ||||
|  in the alist of successful submatches returned by \code{match}. | ||||
|  Any value may be used as a \cvar{key}. | ||||
| \code{No-submatches} returns an expression identical to its | ||||
|  argument, except that all submatches have been elided. | ||||
| 
 | ||||
| \begin{protos} | ||||
| \proto{any-match?}{ reg-exp string}{boolean} | ||||
| \proto{exact-match?}{ reg-exp string}{boolean} | ||||
| \proto{match}{ reg-exp string}{match or {\tt \#f}} | ||||
| \proto{match-start}{ match}{index} | ||||
| \proto{match-end}{ match}{index} | ||||
| \proto{match-submatches}{ match}{alist} | ||||
| \end{protos} | ||||
| \noindent | ||||
| \code{Any-match?} returns \code{\#t} if \cvar{string} matches \cvar{reg-exp} or | ||||
|  contains a substring that does, and \code{\#f} otherwise. | ||||
| \code{Exact-match?} returns \code{\#t} if \cvar{string} matches | ||||
|  \cvar{reg-exp} and \code{\#f} otherwise. | ||||
| 
 | ||||
| \code{Match} returns \code{\#f} if \cvar{reg-exp} does not match \cvar{string} | ||||
|  and a match record if it does match. | ||||
| A match record contains three values: the beginning and end of the substring | ||||
|  that matched | ||||
|  the pattern and an a-list of submatch keys and corresponding match records | ||||
|  for any submatches that also matched. | ||||
| \code{Match-start} returns the index of | ||||
|  the first character in the matching substring and \code{match-end} gives index | ||||
|  of the first character after the matching substring. | ||||
| \code{Match-submatches} returns an alist of submatch keys and match records. | ||||
| Only the top match record returned by \code{match} has a submatch alist. | ||||
| 
 | ||||
| Matching occurs according to POSIX. | ||||
| The match returned is the one with the lowest starting index in \cvar{string}. | ||||
| If there is more than one such match, the longest is returned. | ||||
| Within that match the longest possible submatches are returned. | ||||
| 
 | ||||
| All three matching procedures cache a compiled version of \cvar{reg-exp}. | ||||
| Subsequent calls with the same \cvar{reg-exp} will be more efficient. | ||||
| 
 | ||||
| The C interface to the POSIX regular expression code uses ASCII \code{nul} | ||||
|  as an end-of-string marker. | ||||
| The matching procedures will ignore any characters following an | ||||
|  embedded ASCII \code{nul}s in \cvar{string}. | ||||
| 
 | ||||
| \begin{example} | ||||
| (define pattern (text "abc")) | ||||
| (any-match? pattern "abc")         \evalsto #t | ||||
| (any-match? pattern "abx")         \evalsto #f | ||||
| (any-match? pattern "xxabcxx")     \evalsto #t | ||||
| 
 | ||||
| (exact-match? pattern "abc")       \evalsto #t | ||||
| (exact-match? pattern "abx")       \evalsto #f | ||||
| (exact-match? pattern "xxabcxx")   \evalsto #f | ||||
| 
 | ||||
| (match pattern "abc")              \evalsto (#\{match 0 3\}) | ||||
| (match pattern "abx")              \evalsto #f | ||||
| (match pattern "xxabcxx")          \evalsto (#\{match 2 5\}) | ||||
| 
 | ||||
| (let ((x (match (sequence (text "ab") | ||||
|                           (submatch 'foo (text "cd")) | ||||
|                           (text "ef")) | ||||
|                 "xxxabcdefxx"))) | ||||
|   (list x (match-submatches x))) | ||||
|   \evalsto (#\{match 3 9\} ((foo . #\{match 5 7\})) | ||||
| 
 | ||||
| (match-submatches | ||||
|   (match (sequence | ||||
|            (set "a") | ||||
|            (one-of (submatch 'foo (text "bc")) | ||||
|                    (submatch 'bar (text "BC")))) | ||||
|          "xxxaBCd")) | ||||
|   \evalsto ((bar . #\{match 4 6\})) | ||||
| \end{example} | ||||
| 
 | ||||
| \section{SRFIs} | ||||
| 
 | ||||
| `SRFI' stands for `Scheme Request For Implementation'. | ||||
| An SRFI is a description of an extension to standard Scheme. | ||||
| Draft and final SRFI documents, a FAQ, and other information about SRFIs | ||||
|  can be found at the | ||||
| \xlink{SRFI web site}[ at \code{http://srfi.schemers.org}] | ||||
| {http://srfi.schemers.org}. | ||||
| 
 | ||||
| Scheme~48 includes implementations of the following (final) SRFIs: | ||||
| \begin{itemize} | ||||
| \item SRFI 1 -- List Library | ||||
| \item SRFI 2 -- \code{and-let*} | ||||
| \item SRFI 5 -- \code{let} with signatures and rest arguments | ||||
| \item SRFI 6 -- Basic string ports | ||||
| \item SRFI 7 -- Program configuration | ||||
| \item SRFI 8 -- \code{receive} | ||||
| \item SRFI 9 -- Defining record types | ||||
| \item SRFI 11 -- Syntax for receiving multiple values  | ||||
| \item SRFI 13 -- String Library | ||||
| \item SRFI 14 -- Character-Set Library (see note below) | ||||
| \item SRFI 16 -- Syntax for procedures of variable arity | ||||
| \item SRFI 17 -- Generalized \code{set!} | ||||
| \item SRFI 23 -- Error reporting mechanism | ||||
| \end{itemize} | ||||
| Documentation on these can be found at the web site mentioned above. | ||||
| 
 | ||||
| SRFI~14 includes the procedure \code{->char-set} which is not a standard | ||||
|  Scheme identifier (in R$^5$RS the only required identifier starting | ||||
|  with \code{-} is \code{-} itself). | ||||
| In the Scheme~48 version of SRFI~14 we have renamed \code{->char-set} | ||||
|  as \code{x->char-set}. | ||||
| 
 | ||||
| The SRFI bindings can be accessed either by opening the appropriate structure | ||||
|  (the structure \code{srfi-}\cvar{n} contains SRFI \cvar{n}) | ||||
|  or by loading structure \code{srfi-7} and then using | ||||
|  the \code{,load-srfi-7-program} command to load an SRFI 7-style program. | ||||
| The syntax for the command is | ||||
| \begin{example} | ||||
| \code{,load-srfi-7-program \cvar{name} \cvar{filename}} | ||||
| \end{example} | ||||
| This creates a new structure and associated package, binds the structure | ||||
|  to \cvar{name} in the configuration package, and then loads the program | ||||
|  found in \cvar{filename} into the package. | ||||
| 
 | ||||
| As an example, if the file \code{test.scm} contains | ||||
| \begin{example} | ||||
| (program (code (define x 10))) | ||||
| \end{example} | ||||
| this program can be loaded as follows: | ||||
| \begin{example} | ||||
| > ,load-package srfi-7 | ||||
| > ,load-srfi-7-program test test.scm | ||||
| [test] | ||||
| > ,in test | ||||
| test> x | ||||
| 10 | ||||
| test>  | ||||
| \end{example} | ||||
| 
 | ||||
| %\W \chapter*{Index} | ||||
| %\W \htmlprintindex | ||||
| %\T \input{doc.ind} | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| 1.0 | ||||
| 0.53 | ||||
		Loading…
	
		Reference in New Issue
	
	 sperber
						sperber