~ chicken-core (chicken-5) 11fc480e512bc098a46ddd09a7930d62cfd7b96b


commit 11fc480e512bc098a46ddd09a7930d62cfd7b96b
Author:     Evan Hanson <evhan@foldling.org>
AuthorDate: Thu Oct 8 18:01:46 2015 +1300
Commit:     Peter Bex <peter@more-magic.net>
CommitDate: Mon Nov 2 21:29:01 2015 +0100

    Restructure import expansion for nicer errors on missing libraries
    
    This gives a nicer error when a module isn't found, reporting that
    e.g. module "a.b.c" couldn't be found, rather than just "b".

diff --git a/modules.scm b/modules.scm
index 9e662f5a..4e6c4df3 100644
--- a/modules.scm
+++ b/modules.scm
@@ -608,9 +608,9 @@
 	    (else
 	     (let ((head (car spec))
 		   (imports (cddr spec)))
-	       (let-values (((name form impv imps impi) (import-spec (cadr spec))))
-		 (cond ((c %only head)
-			(##sys#check-syntax loc spec '(_ _ . #(symbol 0)))
+	       (cond ((c %only head)
+		      (##sys#check-syntax loc spec '(_ _ . #(symbol 0)))
+		      (let-values (((name form impv imps impi) (import-spec (cadr spec))))
 			(let ((ids (map resolve imports)))
 			  (let loop ((ids ids) (v '()) (s '()) (missing '()))
 			    (cond ((null? ids)
@@ -626,9 +626,10 @@
 				   (lambda (a)
 				     (loop (cdr ids) v (cons a s) missing)))
 				  (else
-				   (loop (cdr ids) v s (cons (car ids) missing)))))))
-		       ((c %except head)
-			(##sys#check-syntax loc spec '(_ _ . #(symbol 0)))
+				   (loop (cdr ids) v s (cons (car ids) missing))))))))
+		     ((c %except head)
+		      (##sys#check-syntax loc spec '(_ _ . #(symbol 0)))
+		      (let-values (((name form impv imps impi) (import-spec (cadr spec))))
 			(let ((ids (map resolve imports)))
 			  (let loop ((impv impv) (v '()) (ids imports))
 			    (cond ((null? impv)
@@ -648,9 +649,10 @@
 				   (lambda (id)
 				     (loop (cdr impv) v (delete (car id) ids eq?))))
 				  (else
-				   (loop (cdr impv) (cons (car impv) v) ids))))))
-		       ((c %rename head)
-			(##sys#check-syntax loc spec '(_ _ . #((symbol symbol) 0)))
+				   (loop (cdr impv) (cons (car impv) v) ids)))))))
+		     ((c %rename head)
+		      (##sys#check-syntax loc spec '(_ _ . #((symbol symbol) 0)))
+		      (let-values (((name form impv imps impi) (import-spec (cadr spec))))
 			(let loop ((impv impv) (v '()) (ids imports))
 			  (cond ((null? impv)
 				 (let loop ((imps imps) (s '()) (ids ids))
@@ -673,18 +675,19 @@
 					 (cons (cons (cadr a) (cdar impv)) v)
 					 (delete a ids eq?))))
 				(else
-				 (loop (cdr impv) (cons (car impv) v) ids)))))
-		       ((c %prefix head)
-			(##sys#check-syntax loc spec '(_ _ _))
+				 (loop (cdr impv) (cons (car impv) v) ids))))))
+		     ((c %prefix head)
+		      (##sys#check-syntax loc spec '(_ _ _))
+		      (let-values (((name form impv imps impi) (import-spec (cadr spec))))
 			(let ((pref (caddr spec)))
 			  (define (ren imp)
 			    (cons 
 			     (##sys#string->symbol 
 			      (##sys#string-append (tostr pref) (##sys#symbol->string (car imp))))
 			     (cdr imp) ) )
-			  (values name `(,head ,form ,pref) (map ren impv) (map ren imps) impi)))
-		       (else
-			(import-name (chicken.core#library-id spec)))))))))
+			  (values name `(,head ,form ,pref) (map ren impv) (map ren imps) impi))))
+		     (else
+		      (import-name (chicken.core#library-id spec))))))))
     (##sys#check-syntax loc x '(_ . #(_ 1)))
     (let ((cm (##sys#current-module)))
       (for-each
Trap