~ chicken-core (chicken-5) 4102bd0057eeab69d53c06d754e286089f8383f3


commit 4102bd0057eeab69d53c06d754e286089f8383f3
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Mar 19 09:16:12 2011 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Mar 19 09:16:12 2011 +0100

    module aliases

diff --git a/compiler.scm b/compiler.scm
index 0ba5b4a0..5ddc5608 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -143,6 +143,7 @@
 ; (##core#define-compiler-syntax <symbol> <expr>)
 ; (##core#let-compiler-syntax ((<symbol> <expr>) ...) <expr> ...)
 ; (##core#module <symbol> #t | (<name> | (<name> ...) ...) <body>)
+; (##core#let-module-alias ((<alias> <name>) ...) <body>)
 ; (<exp> {<exp>})
 
 ; - Core language:
@@ -806,9 +807,18 @@
 			       (##sys#include-forms-from-file (cadr x))))
 			 e se dest ldest h))
 
+		       ((##core#let-module-alias)
+			(fluid-let ((##sys#module-alias-environment
+				     (cons 
+				      (##sys#strip-syntax 
+				       (map (lambda (b) (cons (car b) (cadr b)))
+					    (cadr x)))
+				      ##sys#module-alias-environment)))
+			  (walk `(##core#begin ,@(cddr x)) e se dest ldest h)))
+
 		       ((##core#module)
 			(let* ((x (##sys#strip-syntax x))
-			       (name (##sys#strip-syntax (cadr x)))
+			       (name (cadr x))
 			       (exports 
 				(or (eq? #t (caddr x))
 				    (map (lambda (exp)
@@ -823,7 +833,7 @@
 						  (##sys#syntax-error-hook
 						   'module
 						   "invalid export syntax" exp name))))
-					 (##sys#strip-syntax (caddr x)))))
+					 (caddr x))))
 			       (csyntax compiler-syntax))
 			  (when (##sys#current-module)
 			    (##sys#syntax-error-hook
diff --git a/csi.scm b/csi.scm
index 7552df83..705e6beb 100644
--- a/csi.scm
+++ b/csi.scm
@@ -434,7 +434,7 @@ EOF
 	      (set! name (##sys#string->symbol name)))
 	     ((not (symbol? name))
 	      (printf "invalid module name `~a'~%" name))
-	     ((##sys#find-module name #f) =>
+	     ((##sys#find-module (##sys#resolve-module-name name #f) #f) =>
 	      (lambda (m)
 		(##sys#current-module m)
 		(printf "; switching current module to `~a'~%" name)))
diff --git a/eval.scm b/eval.scm
index d08f3426..d482c12e 100644
--- a/eval.scm
+++ b/eval.scm
@@ -614,9 +614,18 @@
 			     ,@(##sys#include-forms-from-file (cadr x)))
 			   e #f tf cntr se))
 
+			 ((##core#let-module-alias)
+			  (fluid-let ((##sys#module-alias-environment
+				       (cons 
+					(##sys#strip-syntax 
+					 (map (lambda (b) (cons (car b) (cadr b)))
+					      (cadr x)))
+					##sys#module-alias-environment)))
+			    (walk `(##core#begin ,@(cddr x)) e #f tf cntr se)))
+
 			 ((##core#module)
 			  (let* ((x (##sys#strip-syntax x))
-				 (name (##sys#strip-syntax (cadr x)))
+				 (name (cadr x))
 				 (exports 
 				  (or (eq? #t (caddr x))
 				      (map (lambda (exp)
@@ -631,7 +640,7 @@
 						    (##sys#syntax-error-hook
 						     'module
 						     "invalid export syntax" exp name))))
-					   (##sys#strip-syntax (caddr x))))))
+					   (caddr x)))))
 			    (when (##sys#current-module)
 			      (##sys#syntax-error-hook 'module "modules may not be nested" name))
 			    (parameterize ((##sys#current-module 
@@ -646,12 +655,12 @@
 					  (let loop2 ((xs xs))
 					    (if (null? xs)
 						(##sys#void)
-						(let ((n (##sys#slot xs 1)))
+						(let ((n (cdr xs)))
 						  (cond ((pair? n)
-							 ((##sys#slot xs 0) v)
+							 ((car xs) v)
 							 (loop2 n))
 							(else
-							 ((##sys#slot xs 0) v))))))))
+							 ((car xs) v))))))))
 				      (loop 
 				       (cdr body)
 				       (cons (compile 
diff --git a/expand.scm b/expand.scm
index 7e1e3467..e6fc4769 100644
--- a/expand.scm
+++ b/expand.scm
@@ -1312,8 +1312,10 @@
  '()
  (##sys#er-transformer
   (lambda (x r c)
+    ;;XXX module alias + functor application
     (##sys#check-syntax 'module x '(_ symbol _ . #(_ 0)))
-    (let ((exports (##sys#validate-exports (##sys#strip-syntax (caddr x)) (cadr x))))
+    ;;XXX use module name in "loc" argument?
+    (let ((exports (##sys#validate-exports (##sys#strip-syntax (caddr x)) 'module)))
       `(##core#module 
 	,(cadr x)
 	,(if (eq? '* exports)
diff --git a/modules.scm b/modules.scm
index a4db59f9..d9fe5bde 100644
--- a/modules.scm
+++ b/modules.scm
@@ -57,6 +57,7 @@
 
 (define ##sys#meta-macro-environment (make-parameter (##sys#macro-environment)))
 (define ##sys#current-module (make-parameter #f))
+(define ##sys#module-alias-environment '())
 
 (declare 
   (hide make-module module? %make-module
@@ -98,9 +99,19 @@
 (define (make-module name explist vexports sexports)
   (%make-module name explist '() '() '() '() '() '() '() vexports sexports))
 
-(define (##sys#find-module name #!optional (err #t))
+(define (##sys#resolve-module-name name loc)
+  (let loop ((n name) (done '()))
+    (cond ((assq n ##sys#module-alias-environment) =>
+	   (lambda (a)
+	     (let ((n2 (cdr a)))
+	       (if (memq n2 done)
+		   (error loc "module alias refers to itself" name)
+		   (loop n2 (cons n2 done))))))
+	  (else n))))
+
+(define (##sys#find-module name #!optional (err #t) loc)
   (cond ((assq name ##sys#module-table) => cdr)
-	(err (error 'import "module not found" name))
+	(err (error loc "module not found" name))
 	(else #f)))
 
 (define (##sys#toplevel-definition-hook sym mod exp val) #f)
@@ -485,10 +496,10 @@
 	    ((number? x) (number->string x))
 	    (else (##sys#syntax-error-hook loc "invalid prefix" ))))
     (define (import-name spec)
-      (let* ((mname (##sys#strip-syntax spec))
-	     (mod (##sys#find-module mname #f)))
+      (let* ((mname (##sys#resolve-module-name (##sys#strip-syntax spec) 'import))
+	     (mod (##sys#find-module mname #f 'import)))
 	(unless mod
-	  (let ((il (##sys#find-extension
+	  (let* ((il (##sys#find-extension
 		     (string-append (symbol->string mname) ".import")
 		     #t)))
 	    (cond (il (parameterize ((##sys#current-module #f)
@@ -499,7 +510,7 @@
 				      (##sys#meta-macro-environment)))
 			(fluid-let ((##sys#notices-enabled #f)) ; to avoid re-import warnings
 			  (##sys#load il #f #f)))
-		      (set! mod (##sys#find-module mname)))
+		      (set! mod (##sys#find-module mname 'import)))
 		  (else
 		   (##sys#syntax-error-hook
 		    loc "cannot import from undefined module" 
Trap