mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-09 13:30:26 +02:00
Documentation for the R6RS library' and
import' forms.
* doc/ref/api-modules.texi (R6RS Libraries): New section, documents `library' and `import'.
This commit is contained in:
parent
520caaeba4
commit
71194485d6
1 changed files with 139 additions and 0 deletions
|
@ -47,6 +47,7 @@ be used for interacting with the module system.
|
||||||
* Module System Reflection:: Accessing module objects at run-time.
|
* Module System Reflection:: Accessing module objects at run-time.
|
||||||
* Included Guile Modules:: Which modules come with Guile?
|
* Included Guile Modules:: Which modules come with Guile?
|
||||||
* R6RS Version References:: Using version numbers with modules.
|
* R6RS Version References:: Using version numbers with modules.
|
||||||
|
* R6RS Libraries:: The library and import forms.
|
||||||
* Accessing Modules from C:: How to work with modules with C code.
|
* Accessing Modules from C:: How to work with modules with C code.
|
||||||
* Variables:: First-class variables.
|
* Variables:: First-class variables.
|
||||||
* provide and require:: The SLIB feature mechanism.
|
* provide and require:: The SLIB feature mechanism.
|
||||||
|
@ -778,6 +779,144 @@ expressions:
|
||||||
@end lisp
|
@end lisp
|
||||||
|
|
||||||
|
|
||||||
|
@node R6RS Libraries
|
||||||
|
@subsection R6RS Libraries
|
||||||
|
|
||||||
|
In addition to the API described in the previous sections, you also
|
||||||
|
have the option to create modules using the portable ``library'' form
|
||||||
|
described in R6RS (@pxref{Library form, R6RS Library Form,, r6rs, The
|
||||||
|
Revised^6 Report on the Algorithmic Language Scheme}), and to import
|
||||||
|
libraries created in this format by other programmers. Guile's R6RS
|
||||||
|
libraries implementation takes advantage of the flexibility built
|
||||||
|
into the module system by expanding the R6RS library form into a
|
||||||
|
corresponding Guile ``define-module'' form that specifies equivalent
|
||||||
|
import and export requirements and includes the same body
|
||||||
|
expressions. The library expression:
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
(library (mylib (1 2))
|
||||||
|
(import (otherlib (3)))
|
||||||
|
(export mybinding))
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
is equivalent to the module definition:
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
(define-module (mylib)
|
||||||
|
#:version (1 2)
|
||||||
|
#:use-module ((otherlib) #:version (3))
|
||||||
|
#:export (mybinding))
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
Central to the mechanics of R6RS libraries is the concept of import
|
||||||
|
and export ``levels,'' which control the visibility of bindings at
|
||||||
|
various phases of a library's lifecycle --- macros necessary to
|
||||||
|
expand forms in the library's body need to be available at expand
|
||||||
|
time; variables used in the body of a procedure exported by the
|
||||||
|
library must be available at runtime. R6RS specifies the optional
|
||||||
|
@code{for} sub-form of an @emph{import set} specification (see below)
|
||||||
|
as a mechanism by which a library author can indicate that a
|
||||||
|
particular library import should take place at a particular phase
|
||||||
|
with respect to the lifecycle of the importing library.
|
||||||
|
|
||||||
|
Guile's libraries implementation uses a technique called ``implicit
|
||||||
|
phasing'' (see @cite{Implicit Phasing for R6RS Libraries} by
|
||||||
|
Abdulaziz Ghuloum and R. Kent Dybvig), which allows the expander and
|
||||||
|
compiler to automatically determine the necessary visibility of a
|
||||||
|
binding imported from another library. As such, the @code{for}
|
||||||
|
sub-form described below is ignored by Guile (but may be required by
|
||||||
|
Schemes in which phasing is explicit).
|
||||||
|
|
||||||
|
@deffn syntax library name (export export-spec ...) (import import-spec ...) body ...
|
||||||
|
Defines a new library with the specified name, exports, and imports,
|
||||||
|
and evaluates the specified body expressions in this library's
|
||||||
|
environment.
|
||||||
|
|
||||||
|
The library @var{name} is a non-empty list of identifiers, optionally
|
||||||
|
ending with a version specification of the form described above
|
||||||
|
(@pxref{Creating Guile Modules}).
|
||||||
|
|
||||||
|
Each @var{export-spec} is the name of a variable defined or imported
|
||||||
|
by the library, or must take the form
|
||||||
|
@code{(rename (internal-name external-name) ...)}, where the
|
||||||
|
identifier @var{internal-name} names a variable defined or imported
|
||||||
|
by the library and @var{external-name} is the name by which the
|
||||||
|
variable is seen by importing libraries.
|
||||||
|
|
||||||
|
Each @var{import-spec} must be either an ``import set'' (see below)
|
||||||
|
or must be of the form @code{(for import-set import-level ...)},
|
||||||
|
where each @var{import-level} is one of:
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
run
|
||||||
|
expand
|
||||||
|
(meta @var{level})
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
where @var{level} is an integer. Note that since Guile does not
|
||||||
|
require explicit phase specification, any @var{import-set}s found
|
||||||
|
inside of @code{for} sub-forms will be ``unwrapped'' during
|
||||||
|
expansion and processed as if they had been specified directly.
|
||||||
|
|
||||||
|
Import sets in turn take one of the following forms:
|
||||||
|
|
||||||
|
@lisp
|
||||||
|
@var{library-reference}
|
||||||
|
(library @var{library-reference})
|
||||||
|
(only @var{import-set} @var{identifier} ...)
|
||||||
|
(except @var{import-set} @var{identifier} ...)
|
||||||
|
(prefix @var{import-set} @var{identifier})
|
||||||
|
(rename @var{import-set} (@var{internal-identifier} @var{external-identifier}) ...)
|
||||||
|
@end lisp
|
||||||
|
|
||||||
|
where @var{library-reference} is a non-empty list of identifiers
|
||||||
|
ending with an optional version reference (@pxref{R6RS Version
|
||||||
|
References}), and the other sub-forms have the following semantics,
|
||||||
|
defined recursively on nested @var{import-set}s:
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
|
||||||
|
@item
|
||||||
|
The @code{library} sub-form is used to specify libraries for import
|
||||||
|
whose names begin with the identifier ``library.''
|
||||||
|
|
||||||
|
@item
|
||||||
|
The @code{only} sub-form imports only the specified @var{identifier}s
|
||||||
|
from the given @var{import-set}.
|
||||||
|
|
||||||
|
@item
|
||||||
|
The @code{except} sub-form imports all of the bindings exported by
|
||||||
|
@var{import-set} except for those that appear in the specified list
|
||||||
|
of @var{identifier}s.
|
||||||
|
|
||||||
|
@item
|
||||||
|
The @code{prefix} sub-form imports all of the bindings exported
|
||||||
|
by @var{import-set}, first prefixing them with the specified
|
||||||
|
@var{identifier}.
|
||||||
|
|
||||||
|
@item
|
||||||
|
The @code{rename} sub-form imports all of the identifiers exported
|
||||||
|
by @var{import-set}. The binding for each @var{internal-identifier}
|
||||||
|
among these identifiers is made visible to the importing library as
|
||||||
|
the corresponding @var{external-identifier}; all other bindings are
|
||||||
|
imported using the names provided by @var{import-set}.
|
||||||
|
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
Note that because Guile translates R6RS libraries into module
|
||||||
|
definitions, an import specification may be used to declare a
|
||||||
|
dependency on a native Guile module --- although doing so may make
|
||||||
|
your libraries less portable to other Schemes.
|
||||||
|
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
@deffn syntax import import-spec ...
|
||||||
|
Import into the current environment the libraries specified by the
|
||||||
|
given import specifications, where each @var{import-spec} takes the
|
||||||
|
same form as in the ``library'' form described above.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
|
|
||||||
@node Accessing Modules from C
|
@node Accessing Modules from C
|
||||||
@subsection Accessing Modules from C
|
@subsection Accessing Modules from C
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue