~ chicken-core (chicken-5) cfc05f5fbd419de5e4c66c7ada8226bcf556ebf7


commit cfc05f5fbd419de5e4c66c7ada8226bcf556ebf7
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Tue Sep 6 12:35:28 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Tue Sep 6 12:35:28 2011 +0200

    restore interface defs in modules, added define-type (untested)

diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index c9ba3428..3d2f3ba8 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -1109,23 +1109,25 @@
  'define-interface '()
  (##sys#er-transformer
   (lambda (x r c)
-    (##sys#check-syntax 'define-interface x '(_ symbol _))
+    (##sys#check-syntax 'define-interface x '(_ variable _))
     (let ((name (##sys#strip-syntax (cadr x)))
 	  (%quote (r 'quote)))
       (when (eq? '* name)
 	(syntax-error-hook
 	 'define-interface "`*' is not allowed as a name for an interface"))
       `(,(r 'begin-for-syntax)
-	(##sys#register-interface
+	(##sys#put/restore!
 	 (,%quote ,name)
-	 (,%quote ,(let ((exps (##sys#strip-syntax (caddr x))))
-		     (cond ((eq? '* exps) '*)
-			   ((symbol? exps) `(#:interface ,exps))
-			   ((list? exps) 
-			    (##sys#validate-exports exps 'define-interface))
-			   (else
-			    (syntax-error-hook
-			     'define-interface "invalid exports" (caddr x))))))))))))
+	 (,%quote ##core#interface)
+	 (,%quote
+	  ,(let ((exps (##sys#strip-syntax (caddr x))))
+	     (cond ((eq? '* exps) '*)
+		   ((symbol? exps) `(#:interface ,exps))
+		   ((list? exps) 
+		    (##sys#validate-exports exps 'define-interface))
+		   (else
+		    (syntax-error-hook
+		     'define-interface "invalid exports" (caddr x))))))))))))
 
 
 ;;; functor definition
@@ -1281,6 +1283,26 @@
 			     (list (car clause) `(##core#begin ,@(cdr clause))))
 			   (cddr x))))))))
 
+(##sys#extend-macro-environment
+ 'define-type '()
+ (##sys#er-transformer
+  (lambda (x r c)
+    (##sys#check-syntax 'define-type x '(_ variable _))
+    (cond ((memq #:csi ##sys#features) '(##core#undefined))
+	  (else
+	   (let ((name (##sys#strip-syntax (cadr x)))
+		 (%quote (r 'quote))
+		 (t0 (##sys#strip-syntax (caddr x))))
+	     (let-values (((t pred pure) (##compiler#validate-type t0 #f)))
+	       (if t
+		   `(,(r 'begin-for-syntax)
+		     (##sys#put/restore!
+		      (,%quote ,name)
+		      (,%quote '##compiler#type-abbreviation)
+		      (,%quote ,t)))
+		   (syntax-error-hook 'define-type "invalid type" name t0)))))))))
+
+
 
 ;; capture current macro env
 
diff --git a/compiler.scm b/compiler.scm
index a68b01fa..92529ce4 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -851,43 +851,45 @@
 							##sys#initial-macro-environment)
 						       (##sys#module-alias-environment
 							(##sys#module-alias-environment)))
-					    (let loop ((body (cdddr x)) (xs '()))
-					      (cond 
-					       ((null? body)
-						(handle-exceptions ex
-						    (begin
-						      ;; avoid backtrace
-						      (print-error-message ex (current-error-port))
-						      (exit 1))
-						  (##sys#finalize-module (##sys#current-module)))
-						(cond ((or all-import-libraries
-							   (assq name import-libraries) ) =>
-						       (lambda (il)
-							 (when enable-module-registration
-							   (emit-import-lib name il))
-							 (values
-							  (reverse xs)
-							  '((##core#undefined)))))
-						      ((not enable-module-registration)
-						       (values 
-							(reverse xs)
-							'((##core#undefined))))
-						      (else
-						       (values
-							(reverse xs)
-							(if standalone-executable
-							    '()
-							    (##sys#compiled-module-registration 
-							     (##sys#current-module)))))))
-					       (else
-						(loop 
-						 (cdr body)
-						 (cons (walk 
-							(car body)
-							e ;?
-							(##sys#current-environment)
-							#f #f h)
-						       xs))))))))
+					  (##sys#with-property-restore
+					   (lambda ()
+					     (let loop ((body (cdddr x)) (xs '()))
+					       (cond 
+						((null? body)
+						 (handle-exceptions ex
+						     (begin
+						       ;; avoid backtrace
+						       (print-error-message ex (current-error-port))
+						       (exit 1))
+						   (##sys#finalize-module (##sys#current-module)))
+						 (cond ((or all-import-libraries
+							    (assq name import-libraries) ) =>
+							    (lambda (il)
+							      (when enable-module-registration
+								(emit-import-lib name il))
+							      (values
+							       (reverse xs)
+							       '((##core#undefined)))))
+						       ((not enable-module-registration)
+							(values 
+							 (reverse xs)
+							 '((##core#undefined))))
+						       (else
+							(values
+							 (reverse xs)
+							 (if standalone-executable
+							     '()
+							     (##sys#compiled-module-registration 
+							      (##sys#current-module)))))))
+						(else
+						 (loop 
+						  (cdr body)
+						  (cons (walk 
+							 (car body)
+							 e ;?
+							 (##sys#current-environment)
+							 #f #f h)
+							xs))))))))))
 			    (let ((body
 				   (canonicalize-begin-body
 				    (append
@@ -898,7 +900,7 @@
 					(lambda (x)
 					  (walk 
 					   x 
-					   e 	;?
+					   e ;?
 					   (##sys#current-meta-environment) #f #f h) )
 					mreg))
 				     body))))
diff --git a/eval.scm b/eval.scm
index 4b8b8fe1..445df6e7 100644
--- a/eval.scm
+++ b/eval.scm
@@ -623,27 +623,29 @@
 					    ##sys#initial-macro-environment)
 					   (##sys#module-alias-environment
 					    (##sys#module-alias-environment)))
-			      (let loop ((body (cdddr x)) (xs '()))
-				  (if (null? body)
-				      (let ((xs (reverse xs)))
-					(##sys#finalize-module (##sys#current-module))
-					(lambda (v)
-					  (let loop2 ((xs xs))
-					    (if (null? xs)
-						(##sys#void)
-						(let ((n (cdr xs)))
-						  (cond ((pair? n)
-							 ((car xs) v)
-							 (loop2 n))
-							(else
-							 ((car xs) v))))))))
-				      (loop 
-				       (cdr body)
-				       (cons (compile 
-					      (car body) 
-					      '() #f tf cntr 
-					      (##sys#current-environment))
-					     xs))))) ) )
+			      (##sys#with-property-restore
+			       (lambda ()
+				 (let loop ((body (cdddr x)) (xs '()))
+				   (if (null? body)
+				       (let ((xs (reverse xs)))
+					 (##sys#finalize-module (##sys#current-module))
+					 (lambda (v)
+					   (let loop2 ((xs xs))
+					     (if (null? xs)
+						 (##sys#void)
+						 (let ((n (cdr xs)))
+						   (cond ((pair? n)
+							  ((car xs) v)
+							  (loop2 n))
+							 (else
+							  ((car xs) v))))))))
+				       (loop 
+					(cdr body)
+					(cons (compile 
+					       (car body) 
+					       '() #f tf cntr 
+					       (##sys#current-environment))
+					      xs))))) ) )))
 
 			 [(##core#loop-lambda)
 			  (compile `(,(rename 'lambda se) ,@(cdr x)) e #f tf cntr se) ]
@@ -823,6 +825,33 @@
 	 x
 	 env) )
 
+
+;;; Setting properties dynamically scroped
+
+(define-values (##sys#put/restore! ##sys#with-property-restore)
+  (let ((trail '())
+	(restoring #f))
+    (values
+     (lambda (sym prop val)
+       (when restoring
+	 (set! trail (cons (list sym prop (##sys#get sym prop)) trail)))
+       (##sys#put! sym prop val)
+       val)
+     (lambda (thunk)
+       (let ((t0 #f)
+	     (r0 restoring))
+	 (dynamic-wind
+	     (lambda ()
+	       (set! t0 trail)
+	       (set! restoring #t))
+	     thunk
+	     (lambda ()
+	       (do () ((eq? t0 trail))
+		 (apply ##sys#put! (car trail))
+		 (set! trail (cdr trail)))
+	       (set! restoring r0))))))))
+
+
 ;;; Split lambda-list into its parts:
 
 (define ##sys#decompose-lambda-list
diff --git a/scrutinizer.scm b/scrutinizer.scm
index 9bd214d3..72b4b8d6 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -89,6 +89,7 @@
 ;   ##compiler#enforce         ->  BOOL
 ;   ##compiler#special-result-type -> PROCEDURE
 ;   ##compiler#escape          ->  #f | 'yes | 'no
+;   ##compiler#type-abbreviation -> TYPESPEC
 ;
 ; specialization specifiers:
 ;
@@ -1786,6 +1787,7 @@
   ;; - simplifies result
   ;; - coalesces all "forall" forms into one (remove "forall" if typevar-set is empty)
   ;; - renames type-variables
+  ;; - replaces type-abbreviations
   (let ((ptype #f)			; (T . PT) | #f
 	(clean #f)
 	(typevars '())
@@ -1827,6 +1829,7 @@
 	     '(or eof null fixnum char boolean))
 	    ((eq? t 'any) '*)
 	    ((eq? t 'void) 'undefined)
+	    ((##sys#get t '##compiler#type-abbreviation) => cdr)
 	    ((not (pair? t)) 
 	     (cond ((memq t typevars) t)
 		   (else #f)))
Trap