~ chicken-core (chicken-5) 4f55a2120ec36d9ae3ef3ae48f4ddb0448ce8024


commit 4f55a2120ec36d9ae3ef3ae48f4ddb0448ce8024
Author:     felix <bunny351@gmail.com>
AuthorDate: Wed May 5 14:06:51 2010 +0200
Commit:     felix <bunny351@gmail.com>
CommitDate: Wed May 5 14:06:51 2010 +0200

    better messagess for syntax-errors with context

diff --git a/compiler.scm b/compiler.scm
index a03a3781..2c890733 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -1192,11 +1192,8 @@
 			       (walk `(##sys#make-locative ,sym 0 #f 'location) e se #f) ) ) )
 				 
 			(else
-			 (let* ((msyntax (unimported-syntax name))
-				(x2 (if msyntax
-					(fluid-let ((##sys#unimported-syntax-context name))
-					  (mapwalk x e se))
-					(mapwalk x e se)))
+			 (let* ((x2 (fluid-let ((##sys#syntax-context (cons name ##sys#syntax-context)))
+				      (mapwalk x e se)))
 				(head2 (car x2))
 				(old (##sys#hash-table-ref line-number-database-2 head2)) )
 			   (when ln
@@ -1223,14 +1220,6 @@
 		(,tmp ,@(cdr x)))
 	      e se dest)))))
   
-  (define (unimported-syntax sym)
-    (let ((defs (##sys#get (##sys#strip-syntax sym) '##core#db)))
-      (and defs
-	   (let loop ((defs defs))
-	     (and (pair? defs)
-		  (or (eq? 'syntax (caar defs))
-		      (loop (cdr defs))))))))
-
   (define (mapwalk xs e se)
     (map (lambda (x) (walk x e se #f)) xs) )
 
diff --git a/eval.scm b/eval.scm
index f1e1ebc3..53a6df99 100644
--- a/eval.scm
+++ b/eval.scm
@@ -747,24 +747,13 @@
 			  (compile-call (cdr x) e tf cntr se) ]
 
 			 (else
-			  (let ((msyntax (unimported-syntax head)))
-			    (if msyntax
-				(fluid-let ((##sys#unimported-syntax-context head))
-				  (compile-call x e tf cntr se))
-				(compile-call x e tf cntr se)) ) ) ) ) ) ) ]
+			  (fluid-let ((##sys#syntax-context (cons head ##sys#syntax-context)))
+			    (compile-call x e tf cntr se)))))))]
 	      
 	      [else
 	       (emit-syntax-trace-info tf x cntr)
 	       (compile-call x e tf cntr se)] ) )
 
-      (define (unimported-syntax sym)
-	(let ((defs (##sys#get (##sys#strip-syntax sym) '##core#db)))
-	  (and defs
-	       (let loop ((defs defs))
-		 (and (pair? defs)
-		      (or (eq? 'syntax (caar defs))
-			  (loop (cdr defs))))))))
-
       (define (fudge-argument-list n alst)
 	(if (null? alst) 
 	    (list alst)
diff --git a/expand.scm b/expand.scm
index 07e07b25..1dc1e934 100644
--- a/expand.scm
+++ b/expand.scm
@@ -613,7 +613,7 @@
 
 (define ##sys#line-number-database #f)
 (define ##sys#syntax-error-culprit #f)
-(define ##sys#unimported-syntax-context #f)
+(define ##sys#syntax-context '())
 
 (define (##sys#syntax-error-hook . args)
   (apply ##sys#signal-hook #:syntax-error
@@ -623,37 +623,52 @@
   (let ((open-output-string open-output-string)
 	(get-output-string get-output-string))
     (lambda (msg arg)
-      (cond (##sys#unimported-syntax-context 
-	     =>
-	     (lambda (cx)
-	       (let* ((cx (##sys#strip-syntax cx))
-		      (a (##sys#get cx '##core#db))
-		      (out (open-output-string)))
-		 (##sys#print msg #f out)
-		 (##sys#print ": " #f out)
-		 (##sys#print arg #t out)
-		 (##sys#print "\n\nPerhaps you intended to use the syntax `" #f out)
-		 (##sys#print cx #f out)
-		 (##sys#print "' without importing it first.\n" #f out)
-		 (if (= 1 (length a))
-		     (##sys#print 
-		      (string-append
-		       "Suggesting: `(import "
-		       (symbol->string (cadar a))
-		       ")'")
-		      #f out)
-		     (##sys#print
-		      (string-append
-		       "Suggesting one of:\n"
-		       (let loop ((lst a))
-			 (if (null? lst)
-			     ""
-			     (string-append
-			      "\n    (import " (symbol->string (cadar lst)) ")"
-			      (loop (cdr lst))))))
-		      #f out))
-		 (##sys#syntax-error-hook (get-output-string out)))))
-	    (else (##sys#syntax-error-hook msg arg))))))
+      (define (syntax-imports sym)
+	(let loop ((defs (or (##sys#get (##sys#strip-syntax sym) '##core#db) '())))
+	  (cond ((null? defs) '())
+		((eq? 'syntax (caar defs))
+		 (cons (cadar defs) (loop (cdr defs))))
+		(else (loop (cdr defs))))))		     
+      (if (null? ##sys#syntax-context)
+	  (##sys#syntax-error-hook msg arg)
+	  (let ((out (open-output-string)))
+	    (define (outstr str)
+	      (##sys#print str #f out))
+	    (let loop ((cx ##sys#syntax-context))
+	      (cond ((null? cx)	; no unimported syntax found
+		     (outstr msg)
+		     (outstr ": ")
+		     (##sys#print arg #t out)
+		     (outstr "\ninside expression `(")
+		     (##sys#print (##sys#strip-syntax (car ##sys#syntax-context)) #t out)
+		     (outstr " ...)'"))
+		    (else 
+		     (let* ((sym (##sys#strip-syntax (car cx)))
+			    (us (syntax-imports sym)))
+		       (cond ((pair? us)
+			      (outstr msg)
+			      (outstr ": ")
+			      (##sys#print arg #t out)
+			      (outstr "\n\n  Perhaps you intended to use the syntax `(")
+			      (##sys#print sym #t out)
+			      (outstr " ...)' without importing it first.\n")
+			      (if (fx= 1 (length us))
+				  (outstr
+				   (string-append
+				    "  Suggesting: `(import "
+				    (symbol->string (car us))
+				    ")'"))
+				  (outstr
+				   (string-append
+				    "  Suggesting one of:\n"
+				    (let loop ((lst us))
+				      (if (null? lst)
+					  ""
+					  (string-append
+					   "\n      (import " (symbol->string (car lst)) ")'"
+					   (loop (cdr lst)))))))))
+			     (else (loop (cdr cx))))))))
+	    (##sys#syntax-error-hook (get-output-string out)))))))
 
 (define syntax-error ##sys#syntax-error-hook)
 
Trap