~ chicken-core (chicken-5) d9cdb524431da58ec108100d7d0268d11fa49507


commit d9cdb524431da58ec108100d7d0268d11fa49507
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Mar 12 14:33:21 2010 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Mar 24 07:27:04 2010 +0100

    started work on fully consistent syntax

diff --git a/chicken-ffi-syntax.scm b/chicken-ffi-syntax.scm
index 6c27dd18..ad925223 100644
--- a/chicken-ffi-syntax.scm
+++ b/chicken-ffi-syntax.scm
@@ -66,6 +66,14 @@
 
 ;;; External locations:
 
+(##sys#extend-macro-environment
+ 'location
+ '()
+ (##sys#er-transformer
+  (lambda (form r c)
+    (##sys#check-syntax 'location x '(location _))
+    `(##core#location ,(cadr x)))))
+
 (##sys#extend-macro-environment
  'define-location
  '()
diff --git a/compiler.scm b/compiler.scm
index a1109947..0759261a 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -550,8 +550,7 @@
 				'(##core#undefined)
 				(walk (cadddr x) e se #f) ) ) )
 
-			((quote syntax ##core#syntax) ;XXX qualify `quote' + `syntax'
-			 (##sys#check-syntax name x '(_ _) #f se)
+			((##core#syntax)
 			 `(quote ,(##sys#strip-syntax (cadr x))))
 
 			((##core#check)
@@ -611,8 +610,7 @@
 				      `(##core#begin ,exp ,(loop (cdr ids))) ) ) ) )
 			    e se dest) ) )
 
-			((let ##core#let) ;XXX qualify `let'
-			 (##sys#check-syntax 'let x '(_ #((variable _) 0) . #(_ 1)) #f se)
+			((##core#let)
 			 (let* ((bindings (cadr x))
 				(vars (unzip1 bindings))
 				(aliases (map gensym vars))
@@ -626,8 +624,7 @@
 				    (append aliases e)
 				    se2 dest) ) ) )
 
-			((letrec ##core#letrec) ;XXX qualify `letrec'
-			 (##sys#check-syntax 'letrec x '(_ #((symbol _) 0) . #(_ 1)))
+			((##core#letrec)
 			 (let ((bindings (cadr x))
 			       (body (cddr x)) )
 			   (walk
@@ -689,8 +686,7 @@
 					    dest (cadr body) l) 
 					   l))))))))
 			
-			((let-syntax)	;XXX qualify `let-syntax'
-			 (##sys#check-syntax 'let-syntax x '(let-syntax #((variable _) 0) . #(_ 1)) #f se)
+			((##core#let-syntax)
 			 (let ((se2 (append
 				     (map (lambda (b)
 					    (list
@@ -705,8 +701,7 @@
 			    e se2
 			    dest) ) )
 			       
-		       ((letrec-syntax)	;XXX qualify `letrec-syntax'
-			(##sys#check-syntax 'letrec-syntax x '(letrec-syntax #((variable _) 0) . #(_ 1)) #f se)
+		       ((##core#letrec-syntax)
 			(let* ((ms (map (lambda (b)
 					  (list
 					   (car b)
@@ -915,8 +910,7 @@
 			  (set-real-names! aliases vars)
 			  `(##core#lambda ,aliases ,body) ) )
 
-			((set! ##core#set!) ;XXX qualify `set!'
-			 (##sys#check-syntax 'set! x '(_ variable _) #f se)
+			((##core#set!)
 			 (let* ([var0 (cadr x)]
 				[var (lookup var0 se)]
 				[ln (get-line x)]
@@ -1210,37 +1204,32 @@
 					   rtype) ) )
 				      e se #f) ) ) ) )
 
-			(else
-			 (let ([handle-call
-				(lambda ()
-				  (let* ([x2 (mapwalk x e se)]
-					 [head2 (car x2)]
-					 [old (##sys#hash-table-ref line-number-database-2 head2)] )
-				    (when ln
-				      (##sys#hash-table-set!
-				       line-number-database-2
-				       head2
-				       (cons name (alist-cons x2 ln (if old (cdr old) '()))) ) )
-				    x2) ) ] )
-
-			   (cond [(eq? 'location name) ;XXX qualify `location'
-				  (##sys#check-syntax 'location x '(location _) #f se)
-				  (let ([sym (cadr x)])
-				    (if (symbol? sym)
-					(cond [(assq (lookup sym se) location-pointer-map)
-					       => (lambda (a)
-						    (walk
-						     `(##sys#make-locative ,(second a) 0 #f 'location)
-						     e se #f) ) ]
-					      [(assq sym external-to-pointer) 
-					       => (lambda (a) (walk (cdr a) e se #f)) ]
-					      [(memq sym callback-names)
-					       `(##core#inline_ref (,(symbol->string sym) c-pointer)) ]
-					      [else 
-					       (walk `(##sys#make-locative ,sym 0 #f 'location) e se #f) ] )
-					(walk `(##sys#make-locative ,sym 0 #f 'location) e se #f) ) ) ]
+			((##core#location)
+			 (let ([sym (cadr x)])
+			   (if (symbol? sym)
+			       (cond [(assq (lookup sym se) location-pointer-map)
+				      => (lambda (a)
+					   (walk
+					    `(##sys#make-locative ,(second a) 0 #f 'location)
+					    e se #f) ) ]
+				     [(assq sym external-to-pointer) 
+				      => (lambda (a) (walk (cdr a) e se #f)) ]
+				     [(memq sym callback-names)
+				      `(##core#inline_ref (,(symbol->string sym) c-pointer)) ]
+				     [else 
+				      (walk `(##sys#make-locative ,sym 0 #f 'location) e se #f) ] )
+			       (walk `(##sys#make-locative ,sym 0 #f 'location) e se #f) ) ) )
 				 
-				 [else (handle-call)] ) ) ) ) ] ) ) ) )
+			(else
+			 (let* ([x2 (mapwalk x e se)]
+				[head2 (car x2)]
+				[old (##sys#hash-table-ref line-number-database-2 head2)] )
+			   (when ln
+			     (##sys#hash-table-set!
+			      line-number-database-2
+			      head2
+			      (cons name (alist-cons x2 ln (if old (cdr old) '()))) ) )
+			   x2) ) ) ] ) ) ) )
 
 	  ((not (proper-list? x))
 	   (syntax-error "malformed expression" x) )
@@ -1609,16 +1598,17 @@
 	((if) (let* ((t1 (gensym 'k))
 		     (t2 (gensym 'r))
 		     (k1 (lambda (r) (make-node '##core#call '(#t) (list (varnode t1) r)))) )
-		(make-node 'let
-			   (list t1)
-			   (list (make-node '##core#lambda (list (gensym-f-id) #f (list t2) 0) 
-					    (list (k (varnode t2))) )
-				 (walk (car subs)
-				       (lambda (v)
-					 (make-node 'if '()
-						    (list v
-							  (walk (cadr subs) k1)
-							  (walk (caddr subs) k1) ) ) ) ) ) ) ) )
+		(make-node 
+		 'let
+		 (list t1)
+		 (list (make-node '##core#lambda (list (gensym-f-id) #f (list t2) 0) 
+				  (list (k (varnode t2))) )
+		       (walk (car subs)
+			     (lambda (v)
+			       (make-node 'if '()
+					  (list v
+						(walk (cadr subs) k1)
+						(walk (caddr subs) k1) ) ) ) ) ) ) ) )
 	((let)
 	 (let loop ((vars params) (vals subs))
 	   (if (null? vars)
diff --git a/eval.scm b/eval.scm
index 8224c040..0633b20e 100644
--- a/eval.scm
+++ b/eval.scm
@@ -345,8 +345,7 @@
 		       ;; a normal walking of the operator)
 		       (case head
 
-			 [(quote)
-			  (##sys#check-syntax 'quote x '(quote _) #f se)
+			 [(##core#quote)
 			  (let* ((c (##sys#strip-syntax (cadr x))))
 			    (case c
 			      [(-1) (lambda v -1)]
@@ -358,7 +357,7 @@
 			      [(()) (lambda v '())]
 			      [else (lambda v c)] ) ) ]
 
-			 ((syntax ##core#syntax)
+			 ((##core#syntax)
 			  (let ((c (cadr x)))
 			    (lambda v c)))
 
@@ -400,8 +399,7 @@
 				      [x3 (compile `(##core#begin ,@(##sys#slot (##sys#slot body 1) 1)) e #f tf cntr se)] )
 				 (lambda (v) (##core#app x1 v) (##core#app x2 v) (##core#app x3 v)) ) ] ) ) ]
 
-			 [(set! ##core#set!)
-			  (##sys#check-syntax 'set! x '(_ variable _) #f se)
+			 [(##core#set!)
 			  (let ((var (cadr x)))
 			    (receive (i j) (lookup var e se)
 			      (let ((val (compile (caddr x) e var tf cntr se)))
@@ -424,8 +422,7 @@
 					 (##sys#setslot
 					  (##core#inline "C_u_i_list_ref" v i) j (##core#app val v)) ) ] ) ) ) ) ]
 
-			 [(let ##core#let)
-			  (##sys#check-syntax 'let x '(_ #((variable _) 0) . #(_ 1)) #f se)
+			 [(##core#let)
 			  (let* ([bindings (cadr x)]
 				 [n (length bindings)] 
 				 [vars (map (lambda (x) (car x)) bindings)] 
@@ -476,8 +473,7 @@
 				       (##sys#setslot v2 i (##core#app (##sys#slot vlist 0) v)) )
 				     (##core#app body (cons v2 v)) ) ) ) ] ) ) ]
 
-			 ((letrec ##core#letrec)
-			  (##sys#check-syntax 'letrec x '(_ #((symbol _) 0) . #(_ 1)))
+			 ((##core#letrec)
 			  (let ((bindings (cadr x))
 				(body (cddr x)) )
 			    (compile
@@ -491,7 +487,7 @@
 			       (##core#let () ,@body) )
 			     e h tf cntr se)))
 
-			 [(lambda ##core#lambda)
+			 [(lambda ##core#lambda) ;XXX qualified only
 			  (##sys#check-syntax 'lambda x '(_ lambda-list . #(_ 1)) #f se)
 			  (let* ([llist (cadr x)]
 				 [body (cddr x)] 
@@ -586,8 +582,7 @@
 						   (##core#app body (##sys#cons (apply ##sys#vector as) v)))))
 					   info h cntr) ) ) ] ) ) ) ) ) ]
 
-			 ((let-syntax)
-			  (##sys#check-syntax 'let-syntax x '(let-syntax #((variable _) 0) . #(_ 1)) #f se)
+			 ((##core#let-syntax)
 			  (let ((se2 (append
 				      (map (lambda (b)
 					     (list
@@ -601,8 +596,7 @@
 			     (##sys#canonicalize-body (cddr x) se2 #f)
 			     e #f tf cntr se2)))
 			       
-			 ((letrec-syntax)
-			  (##sys#check-syntax 'letrec-syntax x '(letrec-syntax #((variable _) 0) . #(_ 1)) #f se)
+			 ((##core#letrec-syntax)
 			  (let* ((ms (map (lambda (b)
 					    (list
 					     (car b)
@@ -744,18 +738,14 @@
 			 [(##core#primitive ##core#inline ##core#inline_allocate ##core#foreign-lambda 
 					    ##core#define-foreign-variable 
 					    ##core#define-external-variable ##core#let-location
-					    ##core#foreign-primitive
+					    ##core#foreign-primitive ##core#location
 					    ##core#foreign-lambda* ##core#define-foreign-type)
 			  (##sys#syntax-error-hook "cannot evaluate compiler-special-form" x) ]
 
 			 [(##core#app)
 			  (compile-call (cdr x) e tf cntr se) ]
 
-			 [else
-			  (cond [(eq? head 'location)
-				 (##sys#syntax-error-hook "cannot evaluate compiler-special-form" x) ]
-
-				[else (compile-call x e tf cntr se)] ) ] ) ) ) ) ]
+			 [else (compile-call x e tf cntr se)] ) ] ) ) ]
 	      
 	      [else
 	       (emit-syntax-trace-info tf x cntr)
diff --git a/expand.scm b/expand.scm
index 207cd256..fed712c5 100644
--- a/expand.scm
+++ b/expand.scm
@@ -240,7 +240,7 @@
 	    (let ((head2 (or (lookup head dse) head)))
 	      (unless (pair? head2)
 		(set! head2 (or (lookup head2 (##sys#macro-environment)) head2)) )
-	      (cond [(memq head2 '(let ##core#let))
+	      (cond [(eq? head2 '##core#let)
 		     (##sys#check-syntax 'let body '#(_ 2) #f dse)
 		     (let ([bindings (car body)])
 		       (cond [(symbol? bindings) ; expand named let
@@ -254,16 +254,6 @@
 				   ,@(##sys#map cadr bs) )
 				 #t) ) ]
 			     [else (values exp #f)] ) ) ]
-		    [(and (memq head2 '(set! ##core#set!)) ; "setter" syntax
-			  (pair? body)
-			  (pair? (car body)) )
-		     (let ([dest (car body)])
-		       (##sys#check-syntax 'set! body '(#(_ 1) _) #f dse)
-		       (values
-			(append (list (list '##sys#setter (car dest)))
-				(cdr dest)
-				(cdr body) ) 
-			#t) ) ]
 		    ((and cs? (symbol? head2) (##sys#get head2 '##compiler#compiler-syntax)) =>
 		     (lambda (cs)
 		       (let ((result (call-handler head (car cs) exp (cdr cs) #t)))
@@ -465,8 +455,9 @@
 	    (let* ((vars (reverse vars))
 		   (result 
 		    `(##core#let
-		      ,(##sys#map (lambda (v) (##sys#list v (##sys#list '##core#undefined))) 
-				  (apply ##sys#append vars mvars) )
+		      ,(##sys#map
+			(lambda (v) (##sys#list v (##sys#list '##core#undefined))) 
+			(apply ##sys#append vars mvars) )
 		      ,@(map (lambda (v x) `(##core#set! ,v ,x)) vars (reverse vals))
 		      ,@(map (lambda (vs x)
 			       (let ([tmps (##sys#map gensym vs)])
@@ -486,7 +477,7 @@
 	(fini
 	 vars vals mvars mvals
 	 (let loop ((body body) (defs '()) (done #f))
-	   (cond (done `((,(macro-alias 'letrec-syntax se)
+	   (cond (done `((##core#letrec-syntax
 			  ,(map cdr (reverse defs)) ,@body) ))
 		 ((not (pair? body)) (loop body defs #t))
 		 ((and (list? (car body))
@@ -497,9 +488,9 @@
 		    (loop 
 		     (cdr body) 
 		     (cons (if (pair? (cadr def))
-			       `(,(macro-alias 'define-syntax se)
+			       `(##core#define-syntax
 				 ,(caadr def)
-				 (,(macro-alias 'lambda se) ,(cdadr def) ,@(cddr def)))
+				 (##core#lambda ,(cdadr def) ,@(cddr def)))
 			       def)
 			   defs) 
 		     #f)))
@@ -515,12 +506,12 @@
 				(symbol? exp1)
 				(or (lookup exp1 se) exp1))))
 		(cond [(not (symbol? head)) (fini vars vals mvars mvals body)]
-		      [(eq? 'define head)
-		       (##sys#check-syntax 'define x '(define _ . #(_ 0)) #f se)
+		      [(eq? 'define (or (lookup head se) head))
+		       (##sys#check-syntax 'define x '(_ _ . #(_ 0)) #f se)
 		       (let loop2 ([x x])
 			 (let ([head (cadr x)])
 			   (cond [(not (pair? head))
-				  (##sys#check-syntax 'define x '(define variable . #(_ 0)) #f se)
+				  (##sys#check-syntax 'define x '(_ variable . #(_ 0)) #f se)
 				  (loop rest (cons head vars)
 					(cons (if (pair? (cddr x))
 						  (caddr x)
@@ -528,25 +519,24 @@
 					      vals)
 					mvars mvals) ]
 				 [(pair? (car head))
-				  (##sys#check-syntax 'define x '(define (_ . lambda-list) . #(_ 1)) #f se)
+				  (##sys#check-syntax 'define x '(_ (_ . lambda-list) . #(_ 1)) #f se)
 				  (loop2 (cons (macro-alias 'define se)
 					       (##sys#expand-curried-define head (cddr x) se))) ]
 				 [else
 				  (##sys#check-syntax
 				   'define x
-				   '(define (variable . lambda-list) . #(_ 1)) #f se)
+				   '(_ (variable . lambda-list) . #(_ 1)) #f se)
 				  (loop rest
 					(cons (car head) vars)
 					(cons `(##core#lambda ,(cdr head) ,@(cddr x)) vals)
 					mvars mvals) ] ) ) ) ]
-		      ((eq? 'define-syntax head) ;XXX captures, should perhaps use `##core#define-syntax'?
-		       (##sys#check-syntax 'define-syntax x '(define-syntax _ . #(_ 1)) se)
+		      ((eq? 'define-syntax (or (lookup head se) head))
+		       (##sys#check-syntax 'define-syntax x '(_ _ . #(_ 1)) se)
 		       (fini/syntax vars vals mvars mvals body) )
-		      [(eq? 'define-values head) ;XXX captures
-		       (##sys#check-syntax 'define-values x '(define-values #(_ 0) _) #f se)
+		      [(eq? 'define-values (or (lookup head se) head))
+		       (##sys#check-syntax 'define-values x '(_ #(_ 0) _) #f se)
 		       (loop rest vars vals (cons (cadr x) mvars) (cons (caddr x) mvals)) ]
-		      [(or (eq? 'begin head) (eq? '##core#begin head)) ;XXX only `##core#begin'?
-		       (##sys#check-syntax 'begin x '(_ . #(_ 0)) #f se)
+		      [(eq? '##core#begin head)
 		       (loop (##sys#append (cdr x) rest) vars vals mvars mvals) ]
 		      ((or (memq head vars) (memq head mvars))
 		       (fini vars vals mvars mvals body))
@@ -966,6 +956,22 @@
 
 (define ##sys#initial-macro-environment (##sys#macro-environment))
 
+(##sys#extend-macro-environment
+ 'quote
+ '()
+ (##sys#er-transformer
+  (lambda (x r c)
+    (##sys#check-syntax 'quote x '(_ _))
+    `(##core#quote ,(cadr x)))))
+
+(##sys#extend-macro-environment
+ 'syntax
+ '()
+ (##sys#er-transformer
+  (lambda (x r c)
+    (##sys#check-syntax 'syntax x '(_ _))
+    `(##core#syntax ,(cadr x)))))
+
 (##sys#extend-macro-environment
  'if
  '()
@@ -1025,6 +1031,50 @@
 	       ,(car head)
 	       (,(r 'lambda) ,(cdr head) ,@body))))))))
 
+(##sys#extend-macro-environment
+ 'let
+ '()
+ (##sys#er-transformer
+  (lambda (form r c)
+    (##sys#check-syntax 'let x '(_ #((symbol _) 0) . #(_ 1)))
+    `(##core#let ,@(cdr x)))))
+
+(##sys#extend-macro-environment
+ 'letrec
+ '()
+ (##sys#er-transformer
+  (lambda (form r c)
+    (##sys#check-syntax 'letrec x '(_ #((symbol _) 0) . #(_ 1)))
+    `(##core#letrec ,@(cdr x)))))
+
+(##sys#extend-macro-environment
+ 'let-syntax
+ '()
+ (##sys#er-transformer
+  (lambda (form r c)
+    (##sys#check-syntax 'let-syntax x '(_ #((symbol _) 0) . #(_ 1)))
+    `(##core#let-syntax ,@(cdr x)))))
+
+(##sys#extend-macro-environment
+ 'letrec-syntax
+ '()
+ (##sys#er-transformer
+  (lambda (form r c)
+    (##sys#check-syntax 'letrec-syntax x '(_ #((symbol _) 0) . #(_ 1)))
+    `(##core#letrec-syntax ,@(cdr x)))))
+
+(##sys#extend-macro-environment
+ 'set!
+ '()
+ (##sys#er-transformer
+  (lambda (form r c)
+    (##sys#check-syntax 'set! x '(_ _ _))
+    (let ((dest (cadr x))
+	  (val (caddr x)))
+      (cond ((pair? dest)
+	     `((##sys#setter ,(car dest)) ,@(cdr dest) ,val))
+	    (else `(##core#set! ,dest ,val)))))))
+
 (##sys#extend-macro-environment
  'and
  '()
Trap