1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-01 12:20:26 +02:00
guile/doc/srfi-modules.texi
Martin Grabmüller fc8529c766 * srfi-13-14.texi: Added @bullet to various @itemize lists.
* srfi-modules.texi (SRFI Support): New file and chapter.

	* Makefile.am (guile_TEXINFOS): Added repl-modules.texi and
	srfi-modules.texi.

	* guile.texi (Top): New menu entries for the new chapters.
	(Top): @includes for the new chapters.
	(Top): New menu entry for `SRFI Support', @include for
	`srfi-modules.texi'.

	* repl-modules.texi: New file.
	(Readline Support): New chapter for (ice-9 readline).
	(Value History): New chapter for (ice-9 history).
2001-05-02 21:50:15 +00:00

183 lines
5.8 KiB
Text

@node SRFI Support
@chapter Various SRFI Support Modules
In addition to the string and character--set libraries --- documented in
the next chapter --- Guile has support for a number of SRFIs. This
chapter gives an overview over the available SRFIs and some usage hints.
For complete documentation, we advise you to get the relevant SRFI
documents from the SRFI home page @url{http://srfi.schemers.org}.
@menu
* SRFI-2:: and-let*.
* SRFI-6:: Basic String Ports.
* SRFI-8:: receive.
* SRFI-9:: define-record-type.
* SRFI-10:: Hash--Comma Reader Extension.
* SRFI-11:: let-values and let-values*.
* SRFI-17:: Generalized set!
@end menu
@node SRFI-2
@section SRFI-2 -- and-let*
The syntactic form @code{and-let*} combines the conditional evaluation
form @code{and} with the binding form @var{let*}. Each argument
expression will be evaluated sequentially, bound to a variable (if a
variable name is given), but only as long as no expression returns
the false value @code{#f}.
Use @code{(use-modules (srfi srfi-2)} to access this syntax form.
@node SRFI-6
@section SRFI-6 -- Basic String Ports
SRFI-6 defines the procedures @code{open-input-string},
@code{open-output-string} and @code{get-output-string}. These
procedures are included in the Guile core, so using this module does not
make any difference at the moment. But it is possible that support for
SRFI-6 will be factored out of the core library in the future, so using
this module does not hurt, after all.
@node SRFI-8
@section SRFI-8 -- receive
@code{receive} is a syntax for making the handling of multiple--value
procedures easier. It is documented in @xref{Multiple Values}.
@node SRFI-9
@section SRFI-9 -- define-record-type
This is the SRFI way for defining record types. The Guile
implementation is a layer above Guile's normal record construction
procedures (REFFIXME). The nice thing about this kind of record
definition method is that no new names are implicitly created, all
constructor, accessor and predicates are explicitly given. This reduces
the risk of variable capture.
The syntax of a record type definition is:
@example
<record type definition>
-> (define-record-type <type name>
(<constructor name> <field tag> ...)
<predicate name>
<field spec> ...)
<field spec> -> (<field tag> <accessor name>)
-> (<field tag> <accessor name> <modifier name>)
<field tag> -> <identifier>
<... name> -> <identifier>
@end example
Usage example:
@example
guile> (use-modules (srfi srfi-9))
guile> (define-record-type :foo (make-foo x) foo?
(x get-x) (y get-y set-y!))
guile> (define f (make-foo 1))
guile> f
#<:foo x: 1 y: #f>
guile> (get-x f)
1
guile> (set-y! f 2)
2
guile> (get-y f)
2
guile> f
#<:foo x: 1 y: 2>
guile> (foo? f)
#t
guile> (foo? 1)
#f
@end example
@node SRFI-10
@section SRFI-10 -- Hash--Comma Reader Extension
@cindex hash--comma
@cindex #,()
The module @code{(srfi srfi-10)} implements the syntax extension
@code{#,()}, also called hash-comma, which is defined in SRFI-10.
The support for SRFI-10 consists of the procedure
@code{define-reader-ctor} for defining new reader constructors and the
read syntax form
@example
#,(@var{ctor} @var{datum} ...)
@end example
where @var{ctor} must be a symbol for which a read constructor was
defined previouly, using @code{define-reader-ctor}.
Example:
@lisp
(define-reader-ctor 'file open-input-file)
(define f '#,(file "/etc/passwd"))
(read-line f)
@result{}
"root:x:0:0:root:/root:/bin/bash"
@end lisp
Please note the quote before the @code{#,(file ...)} expression. This
is necessary because ports are not self-evaluating in Guile.
@deffn procedure define-reader-ctor symbol proc
Define @var{proc} as the reader constructor for hash--comma forms with a
tag @var{symbol}. @var{proc} will be applied to the datum(s) following
the tag in the hash--comma expression after the complete form has been
read in. The result of @var{proc} is returned by the Scheme reader.
@end deffn
@node SRFI-11
@section SRFI-11 -- let-values
This module implements the binding forms for multiple values
@code{let-values} and @code{let-values*}. These forms are similar to
@code{let} and @code{let*} (REFFIXME), but they support binding of the
values returned by multiple--valued expressions.
Write @code{(use-modules (srfi srfi-11))} to make the bindings
available.
@lisp
(let-values (((x y) (values 1 2))
((z f) (values 3 4)))
(+ x y z f))
@result{}
10
@end lisp
@code{let-values} performs all bindings simultaneously, which means that
no expression in the binding clauses may refer to variables bound in the
same clause list. @code{let-values*}, on the other hand, performs the
bindings sequentially, just like @code{let*} does for single--valued
expressions.
@node SRFI-17
@section SRFI-17 -- Generalized set!
This is an implementation of SRFI-17: Generalized set!
It exports the Guile procedure @code{make-procedure-with-setter} under
the SRFI name @code{getter-with-setter} and exports the standard
procedures @code{car}, @code{cdr}, @dots{}, @code{cdddr},
@code{string-ref} and @code{vector-ref} as procedures with setters, as
required by the SRFI.
SRFI-17 was heavily criticized during its discussion period but it was
finalized anyway. One issue was its concept of globally associating
setter @dfn{properties} with (procedure) values, which is non-Schemy.
For this reason, this implementation chooses not to provide a way to set
the setter of a procedure. In fact, @code{(set! (setter @var{proc})
@var{setter})} signals an error. The only way to attach a setter to a
procedure is to create a new object (a @dfn{procedure with setter}) via
the @code{getter-with-setter} procedure. This procedure is also
specified in the SRFI. Using it avoids the described problems.