~ chicken-core (chicken-5) ba2dd616650a25c368b80a1a8644e8322b4196c0


commit ba2dd616650a25c368b80a1a8644e8322b4196c0
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Jun 25 13:36:48 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Sat Jun 25 13:36:48 2011 +0200

    brutally force-globalizing name in define-specialization

diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index c7f43ac1..98ad27e8 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -1211,8 +1211,10 @@
 	   (##sys#check-syntax 'define-specialization x '(_ (symbol . #(_ 0)) _ . #(_ 0 1)))
 	   (let* ((head (cadr x))
 		  (name (car head))
+		  (gname (##sys#globalize name '())) ;XXX correct?
 		  (args (cdr head))
 		  (alias (gensym name))
+		  (galias (##sys#globalize alias '())) ;XXX and this?
 		  (rtypes (and (pair? (cdddr x)) (caddr x)))
 		  (%define (r 'define))
 		  (body (if rtypes (cadddr x) (caddr x))))
@@ -1221,13 +1223,13 @@
 		      (let ((anames (reverse anames))
 			    (atypes (reverse atypes))
 			    (spec
-			     `(,alias ,@(let loop2 ((anames anames) (i 1))
-					 (if (null? anames)
-					     '()
-					     (cons (vector i)
-						   (loop2 (cdr anames) (fx+ i 1))))))))
+			     `(,galias ,@(let loop2 ((anames anames) (i 1))
+					   (if (null? anames)
+					       '()
+					       (cons (vector i)
+						     (loop2 (cdr anames) (fx+ i 1))))))))
 			(##sys#put! 
-			 name '##compiler#local-specializations
+			 gname '##compiler#local-specializations
 			 (##sys#append
 			  (list
 			   (cons atypes
@@ -1244,7 +1246,8 @@
 				      spec)
 				     (list spec))))
 			  (or (##compiler#variable-mark 
-			       name '##compiler#local-specializations)
+			       gname
+			       '##compiler#local-specializations)
 			      '())))
 			`(##core#begin
 			  (##core#declare (inline ,alias) (hide ,alias))
diff --git a/manual/Types b/manual/Types
index 3cd55803..214ff7a9 100644
--- a/manual/Types
+++ b/manual/Types
@@ -188,19 +188,19 @@ Specializations can also be defined by the user:
 
 <syntax>(define-specialization (NAME ARGUMENT ...) [RESULTS] BODY)</syntax>
 
-{{NAME}} should have a declared type (for example by using {{:}}).
-Declares the calls to the procedure {{NAME}} with arguments matching
-the types given in {{ARGUMENTS}} should be replaced by {{BODY}} (a
-single expression). If given, {{RESULTS}} (which follows the syntax
-given above under "Type Syntax") narrows the result type(s) if it
-differs from the result types previously declared for {{NAME}}.
-{{ARGUMENT}} should be an identifier naming the formal parameter or a
-list of the form {{(IDENTIFIER TYPE)}}. In the former case, this
-argument specializes on the {{*}} type. User-defined specializations
-are always local to the compilation unit in which they occur and can
-not be exported. When encountered in the interpreter,
-{{define-specialization}} does nothing and returns an unspecified
-result.
+{{NAME}} should have a declared type (for example by using {{:}})
+(this is currently not checked).  Declares the calls to the globally
+defined procedure {{NAME}} with arguments matching the types given in
+{{ARGUMENTS}} should be replaced by {{BODY}} (a single expression). If
+given, {{RESULTS}} (which follows the syntax given above under "Type
+Syntax") narrows the result type(s) if it differs from the result
+types previously declared for {{NAME}}.  {{ARGUMENT}} should be an
+identifier naming the formal parameter or a list of the form
+{{(IDENTIFIER TYPE)}}. In the former case, this argument specializes
+on the {{*}} type. User-defined specializations are always local to
+the compilation unit in which they occur and can not be exported. When
+encountered in the interpreter, {{define-specialization}} does nothing
+and returns an unspecified result.
 
 
 ---
Trap