~ chicken-core (chicken-5) 0efffa77b0b29d1807552d29fff74d56709356fd


commit 0efffa77b0b29d1807552d29fff74d56709356fd
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sun Mar 20 22:38:12 2011 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sun Mar 20 22:38:12 2011 +0100

    export validates export list; started functor docs

diff --git a/expand.scm b/expand.scm
index dde1c707..4e45422f 100644
--- a/expand.scm
+++ b/expand.scm
@@ -1360,25 +1360,17 @@
  '()
  (##sys#er-transformer
   (lambda (x r c)
-    (let ((exps (cdr x))
+    (let ((exps 
+	   (##sys#validate-exports 
+	    (##sys#strip-syntax (cdr x))
+	    'export))
 	  (mod (##sys#current-module)))
       (when mod
-	(for-each
-	 (lambda (exp)
-	   (when (and (not (symbol? exp)) 
-		      (let loop ((iexp exp))
-			(cond ((null? iexp) #f)
-			      ((not (pair? iexp)) #t)
-			      ((not (symbol? (car iexp))) #t)
-			      (else (loop (cdr iexp))))))
-	     (##sys#syntax-error-hook 'export "invalid export syntax" exp (module-name mod))))
-	 exps)
 	(set-module-export-list! 
 	 mod
 	 (let ((xl (module-export-list mod)))
-	   (if (eq? xl #t) 
-	       #t
-	       (append xl (map ##sys#strip-syntax exps))))))
+	   (or (eq? xl #t) 		; ==> #t
+	       (append xl exps)))))
       '(##core#undefined)))))
 
 
diff --git a/manual/Modules b/manual/Modules
index 510e548c..e0b3f0c7 100644
--- a/manual/Modules
+++ b/manual/Modules
@@ -46,19 +46,32 @@ CHICKEN's module system has the following features and shortcomings:
 
 Defines a module with the name {{NAME}}, a set of exported bindings
 and a contained sequence of toplevel expressions that are evaluated in
-an empty syntactical environment. {{EXPORT}} may be a symbol or a list
-of the form {{(IDENTIFIER1 IDENTIFIER2 ...)}}. In the former case the
-identifier given is exported from the module and can be imported at
-the toplevel or in other modules. The latter case exports
+an empty syntactical environment. 
+
+{{(EXPORT ...)}} should be an export-specification which holds a list
+of identifiers to be exported from the module and which should be
+visible when imported into another module or the toplevel
+environment. {{EXPORT}} may have any of the following forms:
+
+{{IDENTIFIER}} names a value- or syntax binding to be exported.
+
+{{(IDENTIFIER1 ...)}} or {{(syntax: IDENTIFIER1 ...)}} exports
 {{IDENTIFIER1}} (which should name a macro) and also arranges for the
 remaining identifiers in the list to be visible in the expansion of
 the macro (this is a hint to the module expander to export bindings
 referenced by syntax-definitions which make use of them, but which
 would normally be internal to the module - which gives more
-opportunities for optimization).
+opportunities for optimization). 
+
+{{(interface: INTERFACENAME)}} adds all exports defined for the given
+interface to be added to the list of exported identifiers of this
+module.
+
+As a special case, specifying {{*}} instead of an export-list
+will export all definitions.
 
-When the {{BODY}} consists of a single string, it is handled
-as {{(include FILENAME)}}.
+When the {{BODY}} consists of a single string, it is treated
+like {{(include FILENAME)}}.
 
 Nested modules, modules not at toplevel (i.e. local modules) or
 mutually recursive modules are not supported.
@@ -69,9 +82,6 @@ it into interpreted or compiled code. Note that this is different
 to normal macros (outside of module declarations), which are normally
 not exported from compiled code.
 
-As a special case, specifying {{*}} instead of an export-list
-will export all definitions.
-
 Note that the module system is only a device for controlling the
 mapping of identifiers to value or syntax bindings. Modules do not
 instantiate separate environments that contain their own bindings, as
@@ -177,6 +187,16 @@ other modules:
 </enscript>
 
 
+=== define-interface
+
+<macro>(define-interface INTERFACENAME (EXPORT ...))</macro>
+
+Defines an ''interface'', a group of exports that can be used in
+module-definitions using the {{(interface: INTERFACE)}} syntax.
+See the definition of {{module}} above for an explanation of
+{{EXPORT}} specifications.
+
+
 === import libraries
 
 ''import libraries'' allow the syntactical (compile-time) 
@@ -319,16 +339,17 @@ the binding information and exported syntax of the former
 must be available separately.
 
 
-=== Caveats
+=== Functors
 
-The macro- and module system has been implemented relatively
-recently and is likely to contain bugs. Please contact the
-maintainers if you encounter behavior that you think is
-not correct or that triggers an error where there shouldn't
-be one.
+A ''functor'' is a higher-order module that expands can be
+parameterized with other modules. A functor defines the body of a
+module for a set or argument modules and can be instantiated with
+concrete module names specializing the code contained in the
+functor. This is best explained with an example:
 
-* In evaluated code, loading a file containing module information and importing from a module contained in that file will not work when the loading and import is performed in the same toplevel expression (this does not apply, when import libraries are used) 
-* Currently value bindings imported by {{import}} and {{import-for-syntax}} share the same import-environment.
+<enscript highlight=scheme>
+XXX need example here...
+</enscript>
 
 
 ---
diff --git a/modules.scm b/modules.scm
index 09e277c1..2203ab20 100644
--- a/modules.scm
+++ b/modules.scm
@@ -772,4 +772,3 @@
 	    "argument module `" (symbol->string mname) "' does not match required signature "
 	    "in instantiation `" (symbol->string name) "' of functor `"
 	    (symbol->string fname) "'")))))))
-
Trap