Fix doc of let*-values
[bpt/guile.git] / doc / ref / api-modules.texi
index 3c8d037..1c9ab23 100644 (file)
@@ -1,6 +1,6 @@
 @c -*-texinfo-*-
 @c This is part of the GNU Guile Reference Manual.
-@c Copyright (C)  1996, 1997, 2000, 2001, 2002, 2003, 2004
+@c Copyright (C)  1996, 1997, 2000, 2001, 2002, 2003, 2004, 2007, 2008
 @c   Free Software Foundation, Inc.
 @c See the file guile.texi for copying conditions.
 
@@ -60,15 +60,15 @@ Library files in SLIB @emph{provide} a feature, and when user programs
 For example, the file @file{random.scm} in the SLIB package contains the
 line
 
-@smalllisp
+@lisp
 (provide 'random)
-@end smalllisp
+@end lisp
 
 so to use its procedures, a user would type
 
-@smalllisp
+@lisp
 (require 'random)
-@end smalllisp
+@end lisp
 
 and they would magically become available, @emph{but still have the same
 names!}  So this method is nice, but not as good as a full-featured
@@ -99,9 +99,9 @@ i.e., passed as the second argument to @code{eval}.
 Note: the following two procedures are available only when the 
 @code{(ice-9 r5rs)} module is loaded:
 
-@smalllisp
+@lisp
 (use-modules (ice-9 r5rs))
-@end smalllisp
+@end lisp
 
 @deffn {Scheme Procedure} scheme-report-environment version
 @deffnx {Scheme Procedure} null-environment version
@@ -133,7 +133,7 @@ sets of bindings.
 
 In 1996 Tom Lord implemented a full-featured module system for Guile which
 allows loading Scheme source files into a private name space.  This system has
-been in available since at least Guile version 1.1.
+been available since at least Guile version 1.1.
 
 For Guile version 1.5.0 and later, the system has been improved to have better
 integration from C code, more fine-grained user control over interfaces, and
@@ -224,9 +224,9 @@ An @dfn{interface specification} has one of two forms.  The first
 variation is simply to name the module, in which case its public
 interface is the one accessed.  For example:
 
-@smalllisp
+@lisp
 (use-modules (ice-9 popen))
-@end smalllisp
+@end lisp
 
 Here, the interface specification is @code{(ice-9 popen)}, and the
 result is that the current module now has access to @code{open-pipe},
@@ -241,11 +241,11 @@ module to be accessed, but also selects bindings from it and renames
 them to suit the current module's needs.  For example:
 
 @cindex binding renamer
-@smalllisp
+@lisp
 (use-modules ((ice-9 popen)
-              :select ((open-pipe . pipe-open) close-pipe)
-              :renamer (symbol-prefix-proc 'unixy:)))
-@end smalllisp
+              #:select ((open-pipe . pipe-open) close-pipe)
+              #:renamer (symbol-prefix-proc 'unixy:)))
+@end lisp
 
 Here, the interface specification is more complex than before, and the
 result is that a custom interface with only two bindings is created and
@@ -270,10 +270,10 @@ You can also directly refer to bindings in a module by using the
 open-pipe)}.  Thus an alternative to the complete @code{use-modules}
 statement would be
 
-@smalllisp
+@lisp
 (define unixy:pipe-open (@@ (ice-9 popen) open-pipe))
 (define unixy:close-pipe (@@ (ice-9 popen) close-pipe))
-@end smalllisp
+@end lisp
 
 There is also @code{@@@@}, which can be used like @code{@@}, but does
 not check whether the variable that is being accessed is actually
@@ -307,9 +307,9 @@ whose public interface is found and used.
 @var{spec} can also be of the form:
 
 @cindex binding renamer
-@smalllisp
+@lisp
  (MODULE-NAME [:select SELECTION] [:renamer RENAMER])
-@end smalllisp
+@end lisp
 
 in which case a custom interface is newly created and used.
 @var{module-name} is a list of symbols, as above; @var{selection} is a
@@ -329,12 +329,12 @@ Signal error if module name is not resolvable.
 
 
 @c FIXME::martin: Is this correct, and is there more to say?
-@c FIXME::martin: Define term and concept `system transformer' somewhere.
+@c FIXME::martin: Define term and concept `syntax transformer' somewhere.
 
 @deffn syntax use-syntax module-name
-Load the module @code{module-name} and use its system
-transformer as the system transformer for the currently defined module,
-as well as installing it as the current system transformer.
+Load the module @code{module-name} and use its syntax
+transformer as the syntax transformer for the currently defined module,
+as well as installing it as the current syntax transformer.
 @end deffn
 
 @deffn syntax @@ module-name binding-name
@@ -373,9 +373,9 @@ by using @code{define-public} or @code{export} (both documented below).
 @var{module-name} is of the form @code{(hierarchy file)}.  One
 example of this is
 
-@smalllisp
+@lisp
 (define-module (ice-9 popen))
-@end smalllisp
+@end lisp
 
 @code{define-module} makes this module available to Guile programs under
 the given @var{module-name}.
@@ -541,9 +541,9 @@ duplication to the next handler in @var{list}.
 The default duplicate binding resolution policy is given by the
 @code{default-duplicate-binding-handler} procedure, and is
 
-@smalllisp
+@lisp
 (replace warn-override-core warn last)
-@end smalllisp
+@end lisp
 
 @item #:no-backtrace
 @cindex no backtrace
@@ -602,6 +602,18 @@ Set the current module to @var{module} and return
 the previous current module.
 @end deffn
 
+@deffn {Scheme Procedure} save-module-excursion thunk
+Call @var{thunk} within a @code{dynamic-wind} such that the module that
+is current at invocation time is restored when @var{thunk}'s dynamic
+extent is left (@pxref{Dynamic Wind}).
+
+More precisely, if @var{thunk} escapes non-locally, the current module
+(at the time of escape) is saved, and the original current module (at
+the time @var{thunk}'s dynamic extent was last entered) is restored.  If
+@var{thunk}'s dynamic extent is re-entered, then the current module is
+saved, and the previously saved inner module is set current again.
+@end deffn
+
 @deffn {Scheme Procedure} resolve-module name
 Find the module named @var{name} and return it.  When it has not already
 been defined, try to auto-load it.  When it can't be found that way
@@ -667,7 +679,7 @@ Guile starts up.
 
 @item (ice-9 debug)
 Mikael Djurfeldt's source-level debugging support for Guile
-(@pxref{Debugging Features}).
+(@pxref{Tracing}).
 
 @item (ice-9 expect)
 Actions based on matching input from a port (@pxref{Expect}).
@@ -746,7 +758,7 @@ Record definition with @code{define-record-type} (@pxref{SRFI-9}).
 Read hash extension @code{#,()} (@pxref{SRFI-10}).
 
 @item (srfi srfi-11)
-Multiple-value handling with @code{let-values} and @code{let-values*}
+Multiple-value handling with @code{let-values} and @code{let*-values}
 (@pxref{SRFI-11}).
 
 @item (srfi srfi-13)
@@ -1126,12 +1138,12 @@ gcc -shared -o libbessel.so -fPIC bessel.c
 
 Now fire up Guile:
 
-@smalllisp
+@lisp
 (define bessel-lib (dynamic-link "./libbessel.so"))
 (dynamic-call "init_math_bessel" bessel-lib)
 (j0 2)
 @result{} 0.223890779141236
-@end smalllisp
+@end lisp
 
 The filename @file{./libbessel.so} should be pointing to the shared
 library produced with the @code{gcc} command above, of course.  The
@@ -1247,48 +1259,51 @@ The simplest way to write a module using compiled C code is
 @end example
 
 When loaded with @code{(use-modules (foo bar))}, the
-@code{load-extension} call looks for the @file{foobar-c-code.so}
+@code{load-extension} call looks for the @file{foobar-c-code.so} (etc)
 object file in the standard system locations, such as @file{/usr/lib}
 or @file{/usr/local/lib}.
 
 If someone installs your module to a non-standard location then the
 object file won't be found.  You can address this by inserting the
 install location in the @file{foo/bar.scm} file.  This is convenient
-for the user and also guarantees the intended object file is read,
-even if stray older or newer versions are in the loader's path.
+for the user and also guarantees the intended object is read, even if
+stray older or newer versions are in the loader's path.
 
 The usual way to specify an install location is with a @code{prefix}
 at the configure stage, for instance @samp{./configure prefix=/opt}
-results in library object code like @file{foobar-c-code.so} going
-under @file{/opt/lib/foobar-c-code.so}.  When using Autoconf
-(@pxref{Top, , Introduction, autoconf, The GNU Autoconf Manual}), the
-library location is in a @code{libdir} variable and it can be inserted
-automatically by writing the scheme code as a @file{bar.scm.in},
+results in library files as say @file{/opt/lib/foobar-c-code.so}.
+When using Autoconf (@pxref{Top, , Introduction, autoconf, The GNU
+Autoconf Manual}), the library location is in a @code{libdir}
+variable.  Its value is intended to be expanded by @command{make}, and
+can by substituted into a source file like @file{foo.scm.in}
 
 @example
 (define-module (foo bar))
-(load-extension "@@libdir@@/foobar-c-code" "foo_bar_init")
+(load-extension "XXlibdirXX/foobar-c-code" "foo_bar_init")
 @end example
 
-The Autoconf manual describes how this is processed to make the actual
-@file{bar.scm} which is installed (@pxref{Configuration Files, ,
-Creating Configuration Files, autoconf, The GNU Autoconf Manual}).  A
-substitution can also be done explicitly in a @file{Makefile} with a
-simple @code{sed} (@pxref{Top, , Introduction, sed, SED, A Stream
-Editor}).
+@noindent
+with the following in a @file{Makefile}, using @command{sed}
+(@pxref{Top, , Introduction, sed, SED, A Stream Editor}),
 
-If several modules need this, it can be easier to create one
-@file{foo/config.scm} with a define of the @code{libdir} location, and
-use that as required.
+@example
+foo.scm: foo.scm.in
+        sed 's|XXlibdirXX|$(libdir)|' <foo.scm.in >foo.scm
+@end example
+
+The actual pattern @code{XXlibdirXX} is arbitrary, it's only something
+which doesn't otherwise occur.  If several modules need the value, it
+can be easier to create one @file{foo/config.scm} with a define of the
+@code{libdir} location, and use that as required.
 
 @example
 (define-module (foo config))
-(define-public foo-config-libdir "@@libdir@@"")
+(define-public foo-config-libdir "XXlibdirXX"")
 @end example
 
-Such a file might have other locations too, for instance a configured
-data directory for auxiliary files, or @code{localedir} if the module
-has its own @code{gettext} message catalogue
+Such a file might have other locations too, for instance a data
+directory for auxiliary files, or @code{localedir} if the module has
+its own @code{gettext} message catalogue
 (@pxref{Internationalization}).
 
 When installing multiple C code objects, it can be convenient to put
@@ -1296,14 +1311,12 @@ them in a subdirectory of @code{libdir}, thus giving for example
 @code{/usr/lib/foo/some-obj.so}.  If the objects are only meant to be
 used through the module, then a subdirectory keeps them out of sight.
 
-It will be noted all of the above requires that the Scheme code
-modules can be found in @code{%load-path} (@pxref{Build Config}).
-Presently it's left up to the system administrator or each user to
-augment that path when installing Guile modules in non-default
-locations.  But having reached the Scheme code, that code should take
-care of hitting any of its own private files etc.
-
-@subsection Other matters
+It will be noted all of the above requires that the Scheme code to be
+found in @code{%load-path} (@pxref{Build Config}).  Presently it's
+left up to the system administrator or each user to augment that path
+when installing Guile modules in non-default locations.  But having
+reached the Scheme code, that code should take care of hitting any of
+its own private files etc.
 
 Presently there's no convention for having a Guile version number in
 module C code filenames or directories.  This is primarily because