~ chicken-core (chicken-5) 2a5bd0ab7f1e9d0c795eab6cc1cddc71e5d636a7
commit 2a5bd0ab7f1e9d0c795eab6cc1cddc71e5d636a7
Author: felix <felix@z.(none)>
AuthorDate: Fri Mar 25 12:24:21 2011 +0100
Commit: felix <felix@z.(none)>
CommitDate: Fri Mar 25 12:24:21 2011 +0100
documented alternative functor syntax
diff --git a/manual/Modules b/manual/Modules
index 4c434c2f..6b91f329 100644
--- a/manual/Modules
+++ b/manual/Modules
@@ -44,7 +44,7 @@ CHICKEN's module system has the following features and shortcomings:
<macro>(module NAME (EXPORT ...) BODY ...)</macro><br>
<macro>(module NAME (EXPORT ...) FILENAME)</macro>
<macro>(module NAME * BODY ...)</macro>
-<macro>(module NAME1 = NAME2)</macro>
+<macro>(module NAME1 = NAME2 [BODY ...])</macro>
<macro>(module NAME = (FUNCTORNAME MODULENAME1 ...))</macro>
Defines a module with the name {{NAME}}, a set of exported bindings
@@ -77,14 +77,15 @@ be a symbol naming an interface.
When the {{BODY}} consists of a single string, it is treated
like {{(include FILENAME)}}.
-The syntax {{(module NAME1 = NAME2)}} defines an alias {{NAME1}}
-for the module {{NAME2}}, so {{NAME1}} can be used in place of
-{{NAME2}} in all forms that accept module names. Module aliases
-defined inside a module are local to that module.
-
{{(module NAME = (FUNCTORNAME MODULENAME1 ...))}} instantiates
a ''functor'' (see below for information about functors).
+The syntax {{(module NAME1 = NAME2)}} defines an alias {{NAME1}} for
+the module {{NAME2}}, so {{NAME1}} can be used in place of {{NAME2}}
+in all forms that accept module names. Module aliases defined inside a
+module are local to that module. If followed by a module body, then
+this is a special form of ''functor instantiation''.
+
Nested modules, modules not at toplevel (i.e. local modules) or
mutually recursive modules are not supported. As an exception
module alias definitions are allowed inside a module definition.
@@ -431,6 +432,21 @@ requirement that a specific export of an argument-module must be
syntax or non-syntax - it can be syntax in one instantiation and a
procedure definition in another.
+The common case of using a functor with a single argument module
+that is not used elsewhere can be expressed in the following way:
+
+<enscript highlight=scheme>
+(module NAME = FUNCTORNAME BODY ...)
+</enscript>
+
+which is the same as
+
+<enscript highlight=scheme>
+(begin
+ (module _NAME * BODY ...)
+ (module NAME = (FUNCTORNAME _NAME)))
+</enscript>
+
Since functors exist at compile time, they can be stored in
import-libraries via {{-emit-import-library FUNCTORNAME}} or
{{-emit-all-import-libraries}} (see [[Using the compiler]] for more
@@ -441,6 +457,9 @@ has no runtime code, so it is sufficient to merely {{import}} it (as
opposed to using {{require-extension}} or one of its variants, which
also loads the run-time part of a module).
+Note that functor-instantiation creates a complete copy of the
+functor body.
+
---
Previous: [[Macros]]
Trap