~ chicken-core (chicken-5) f2c8fc30b6a590a28d9ae25def85837e49cf9e92


commit f2c8fc30b6a590a28d9ae25def85837e49cf9e92
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sun Mar 14 13:13:28 2010 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Wed Mar 24 07:29:21 2010 +0100

    - integer? always returns #f for nan and inf
    - implemented lambda as syntax and fixed various bugs
    - tests run, added some new module-related tests

diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index 67258488..8a12bb92 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -60,7 +60,7 @@
 	     (##sys#check-syntax 'define-inline form '(_ (symbol . _) . #(_ 1)))
 	     `(##core#define-inline
 	       ,(car head)
-	       `(,(r 'lambda) ,(cdr head) ,@(cdr form))))
+	       `(##core#lambda ,(cdr head) ,@(cdr form))))
 	    (else
 	     (##sys#check-syntax 'define-inline form '(_ symbol _))
 	     `(##core#define-inline ,@(cdr form))))))))
@@ -73,19 +73,16 @@
     (let* ((name (cadr x))
 	   (slots (cddr x))
 	   (prefix (symbol->string name))
-	   (%quote (r 'quote))
 	   (setters (memq #:record-setters ##sys#features))
-	   (%begin (r 'begin))
 	   (%define (r 'define))
-	   (%getter-with-setter (r 'getter-with-setter))
-	   (%lambda (r 'lambda)) )
-      `(,%begin
+	   (%getter-with-setter (r 'getter-with-setter)))
+      `(##core#begin
 	  (,%define 
 	   ,(string->symbol (string-append "make-" prefix))
-	   (,%lambda ,slots (##sys#make-structure (,%quote ,name) ,@slots)) )
+	   (##core#lambda ,slots (##sys#make-structure (##core#quote ,name) ,@slots)) )
 	  (,%define
 	   ,(string->symbol (string-append prefix "?"))
-	   (,%lambda (x) (##sys#structure? x ',name)) )
+	   (##core#lambda (x) (##sys#structure? x ',name)) )
 	  ,@(let mapslots ((slots slots) (i 1))
 	      (if (eq? slots '())
 		  slots
@@ -93,22 +90,22 @@
 			 (setr (string->symbol (string-append prefix "-" slotname "-set!")))
 			 (getr (string->symbol (string-append prefix "-" slotname)) ) )
 		    (cons
-		     `(,%begin
+		     `(##core#begin
 			(,%define
 			 ,setr
-			 (,%lambda (x val)
-				   (##core#check (##sys#check-structure x (,%quote ,name)))
+			 (##core#lambda (x val)
+				   (##core#check (##sys#check-structure x (##core#quote ,name)))
 				   (##sys#block-set! x ,i val) ) )
 			(,%define
 			 ,getr
 			 ,(if setters
 			      `(,%getter-with-setter
-				(,%lambda (x) 
-					  (##core#check (##sys#check-structure x (,%quote ,name)))
+				(##core#lambda (x) 
+					  (##core#check (##sys#check-structure x (##core#quote ,name)))
 					  (##sys#block-ref x ,i) )
 				,setr)
-			      `(,%lambda (x)
-					 (##core#check (##sys#check-structure x (,%quote ,name)))
+			      `(##core#lambda (x)
+					 (##core#check (##sys#check-structure x (##core#quote ,name)))
 					 (##sys#block-ref x ,i) ) ) ) )
 		     (mapslots (##sys#slot slots 1) (fx+ i 1)) ) ) ) ) ) ) ) ) )
 
@@ -117,34 +114,30 @@
  '()
  (##sys#er-transformer
  (lambda (form r c)
-   (let ((%lambda (r 'lambda))
-	 (%let (r 'let)))
      (##sys#check-syntax 'receive form '(_ _ . #(_ 0)))
      (cond ((null? (cddr form))
-	    `(##sys#call-with-values (,%lambda () ,@(cdr form)) ##sys#list) )
+	    `(##sys#call-with-values (##core#lambda () ,@(cdr form)) ##sys#list) )
 	   (else
 	    (##sys#check-syntax 'receive form '(_ lambda-list _ . #(_ 1)))
 	    (let ((vars (cadr form))
 		  (exp (caddr form))
 		  (rest (cdddr form)))
 	      (if (and (pair? vars) (null? (cdr vars)))
-		  `(,%let ((,(car vars) ,exp)) ,@rest)
+		  `(##core#let ((,(car vars) ,exp)) ,@rest)
 		  `(##sys#call-with-values 
-		    (,%lambda () ,exp)
-		    (,%lambda ,vars ,@rest)) ) ) ) ) ))))
+		    (##core#lambda () ,exp)
+		    (##core#lambda ,vars ,@rest)) ) ) ) ) )))
 
 (##sys#extend-macro-environment
  'time '()
  (##sys#er-transformer
  (lambda (form r c)
-   (let ((rvar (r 't))
-	 (%begin (r 'begin))
-	 (%lambda (r 'lambda)))
-    `(,%begin
+   (let ((rvar (r 't)))
+    `(##core#begin
        (##sys#start-timer)
        (##sys#call-with-values 
-	(,%lambda () ,@(cdr form))
-	(,%lambda ,rvar
+	(##core#lambda () ,@(cdr form))
+	(##core#lambda ,rvar
 		  (##sys#display-times (##sys#stop-timer))
 		  (##sys#apply ##sys#values ,rvar) ) ) ) ) ) ) )
 
@@ -168,18 +161,16 @@
     (##sys#check-syntax 'assert form '#(_ 1))
     (let* ((exp (cadr form))
 	   (msg-and-args (cddr form))
-	   (%if (r 'if))
-	   (%quote (r 'quote))
 	   (msg (if (eq? '() msg-and-args)
 		    `(##core#immutable '"assertion failed")
 		    (car msg-and-args) ) ) )
-      `(,%if (##core#check ,exp)
+      `(##core#if (##core#check ,exp)
 	     (##core#undefined)
 	     (##sys#error 
 	      ,msg 
 	      ,@(if (fx> (length msg-and-args) 1)
 		    (cdr msg-and-args)
-		    `((,%quote ,(##sys#strip-syntax exp))))))))))
+		    `((##core#quote ,(##sys#strip-syntax exp))))))))))
 
 (##sys#extend-macro-environment
  'ensure
@@ -190,11 +181,9 @@
     (let ((pred (cadr form))
 	  (exp (caddr form))
 	  (args (cdddr form))
-	  (tmp (r 'tmp))
-	  (%let (r 'let))
-	  (%if (r 'if)) )
-      `(,%let ([,tmp ,exp])
-	      (,%if (##core#check (,pred ,tmp))
+	  (tmp (r 'tmp)))
+      `(##core#let ([,tmp ,exp])
+	      (##core#if (##core#check (,pred ,tmp))
 		    ,tmp
 		    (##sys#signal-hook
 		     #:type-error
@@ -212,24 +201,22 @@
 	   (body (cddr form))
 	   (ids (##sys#map car clauses))
 	   (new-tmps (##sys#map (lambda (x) (r (gensym))) clauses))
-	   (old-tmps (##sys#map (lambda (x) (r (gensym))) clauses))
-	   (%let (r 'let))
-	   (%lambda (r 'lambda)))
-       `(,%let (,@(map ##sys#list new-tmps (##sys#map cadr clauses))
+	   (old-tmps (##sys#map (lambda (x) (r (gensym))) clauses)))
+       `(##core#let (,@(map ##sys#list new-tmps (##sys#map cadr clauses))
 		,@(map ##sys#list old-tmps
 		       (let loop ((n (length clauses)))
 			 (if (eq? n 0)
 			     '()
 			     (cons #f (loop (fx- n 1))) ) ) ) )
 	       (##sys#dynamic-wind
-		(,%lambda ()
+		(##core#lambda ()
 			  ,@(map (lambda (ot id) `(##core#set! ,ot ,id))
 				 old-tmps ids)
 			  ,@(map (lambda (id nt) `(##core#set! ,id ,nt))
 				 ids new-tmps)
 			  (##core#undefined) )
-		(,%lambda () ,@body)
-		(,%lambda ()
+		(##core#lambda () ,@body)
+		(##core#lambda ()
 			  ,@(map (lambda (nt id) `(##core#set! ,nt ,id))
 				 new-tmps ids)
 			  ,@(map (lambda (id ot) `(##core#set! ,id ,ot))
@@ -242,8 +229,7 @@
   (lambda (form r c)
     (##sys#check-syntax 'eval-when form '#(_ 2))
     (let* ((situations (cadr form))
-	   (%begin (r 'begin))
-	   (body `(,%begin ,@(cddr form)))
+	   (body `(##core#begin ,@(cddr form)))
 	   (%eval (r 'eval))
 	   (%compile (r 'compile))
 	   (%load (r 'load))
@@ -275,21 +261,19 @@
      (let* ((bindings (cadr form))
 	    (body (cddr form))
 	    (swap (r 'swap))
-	    (%let (r 'let))
-	    (%lambda (r 'lambda))
 	    [params (##sys#map car bindings)]
 	    [vals (##sys#map cadr bindings)]
 	    [aliases (##sys#map (lambda (z) (r (gensym))) params)]
 	    [aliases2 (##sys#map (lambda (z) (r (gensym))) params)] )
-       `(,%let ,(##sys#append (map ##sys#list aliases params) (map ##sys#list aliases2 vals))
-	  (,%let ((,swap (,%lambda ()
+       `(##core#let ,(##sys#append (map ##sys#list aliases params) (map ##sys#list aliases2 vals))
+	  (##core#let ((,swap (##core#lambda ()
 				   ,@(map (lambda (a a2)
-					    `(,%let ((t (,a))) (,a ,a2)
+					    `(##core#let ((t (,a))) (,a ,a2)
 						    (##core#set! ,a2 t)))
 					  aliases aliases2) ) ) )
 		 (##sys#dynamic-wind 
 		  ,swap
-		  (,%lambda () ,@body)
+		  (##core#lambda () ,@body)
 		  ,swap) ) ) ) )))
 
 (##sys#extend-macro-environment
@@ -315,20 +299,19 @@
   (lambda (form r c)
     (##sys#check-syntax 'set!-values form '(_ #(variable 0) _))
     (let ((vars (cadr form))
-	  (exp (caddr form))
-	  (%lambda (r 'lambda)))
+	  (exp (caddr form)))
       (cond ((null? vars)
 	     ;; may this be simply "exp"?
 	     `(##sys#call-with-values
-	       (,%lambda () ,exp)
-	       (,%lambda () (##core#undefined))) )
+	       (##core#lambda () ,exp)
+	       (##core#lambda () (##core#undefined))) )
 	    ((null? (cdr vars))
 	     `(##core#set! ,(car vars) ,exp)) 
 	    (else
 	     (let ([aliases (map gensym vars)])
 	       `(##sys#call-with-values
-		 (,%lambda () ,exp)
-		 (,%lambda ,aliases
+		 (##core#lambda () ,exp)
+		 (##core#lambda ,aliases
 			   ,@(map (lambda (v a)
 				    `(##core#set! ,v ,a))
 				  vars aliases) ) ) ) ) ) ))))
@@ -347,9 +330,7 @@
   (lambda (form r c)
     (##sys#check-syntax 'let-values form '(_ list . _))
     (let ((vbindings (cadr form))
-	  (body (cddr form))
-	  (%let (r 'let))
-	  (%lambda (r 'lambda)))
+	  (body (cddr form)))
       (letrec ((append* (lambda (il l)
 			  (if (not (pair? il))
 			      (cons il l)
@@ -383,14 +364,14 @@
 		     [exps (map (lambda (x) (cadr x)) vbindings)]
 		     [llists2 llists2] )
 	    (cond ((null? llists)
-		   `(,%let ,(map (lambda (v) (##sys#list v (lookup v))) vars) ,@body) )
+		   `(##core#let ,(map (lambda (v) (##sys#list v (lookup v))) vars) ,@body) )
 		  ((and (pair? (car llists2)) (null? (cdar llists2)))
-		   `(,%let ((,(caar llists2) ,(car exps)))
+		   `(##core#let ((,(caar llists2) ,(car exps)))
 			   ,(fold (cdr llists) (cdr exps) (cdr llists2)) ) )
 		  (else
 		   `(##sys#call-with-values
-		     (,%lambda () ,(car exps))
-		     (,%lambda ,(car llists2) ,(fold (cdr llists) (cdr exps) (cdr llists2))) ) ) ) ) ) ) ) ) ) )
+		     (##core#lambda () ,(car exps))
+		     (##core#lambda ,(car llists2) ,(fold (cdr llists) (cdr exps) (cdr llists2))) ) ) ) ) ) ) ) ) ) )
 
 (##sys#extend-macro-environment
  'let*-values '()
@@ -399,11 +380,10 @@
     (##sys#check-syntax 'let*-values form '(_ list . _))
     (let ((vbindings (cadr form))
 	  (body (cddr form))
-	  (%let (r 'let))
 	  (%let-values (r 'let-values)) )
       (let fold ([vbindings vbindings])
 	(if (null? vbindings)
-	    `(,%let () ,@body)
+	    `(##core#let () ,@body)
 	    `(,%let-values (,(car vbindings))
 			   ,(fold (cdr vbindings))) ) ) ))))
 
@@ -413,18 +393,17 @@
   (lambda (form r c)
     (##sys#check-syntax 'letrec-values form '(_ list . _))
     (let ((vbindings (cadr form))
-	  (body (cddr form))
-	  (%let (r 'let))
-	  (%lambda (r 'lambda)))
+	  (body (cddr form)))
       (let* ([vars (apply ##sys#append (map (lambda (x) (car x)) vbindings))] 
 	     [aliases (map (lambda (v) (cons v (r (gensym v)))) vars)] 
 	     [lookup (lambda (v) (cdr (assq v aliases)))] )
-	`(,%let ,(map (lambda (v) (##sys#list v '(##core#undefined))) vars)
+	`(##core#let ,(map (lambda (v) (##sys#list v '(##core#undefined))) vars)
 		,@(map (lambda (vb)
 			 `(##sys#call-with-values 
-			   (,%lambda () ,(cadr vb))
-			   (,%lambda ,(map lookup (car vb))
-				     ,@(map (lambda (v) `(##core#set! ,v ,(lookup v))) (car vb)) ) ) )
+			   (##core#lambda () ,(cadr vb))
+			   (##core#lambda ,(map lookup (car vb))
+				     ,@(map (lambda (v)
+					      `(##core#set! ,v ,(lookup v))) (car vb)) ) ) )
 		       vbindings)
 		,@body) ) ) ) ) )
 
@@ -434,31 +413,31 @@
  (##sys#er-transformer
   (lambda (form r c)
     (##sys#check-syntax 'nth-value form '(_ _ _))
-    (let ((v (r 'tmp))
-	  (%lambda (r 'lambda)))
+    (let ((v (r 'tmp)))
       `(##sys#call-with-values
-	(,%lambda () ,(caddr form))
-	(,%lambda ,v (,(r 'list-ref) ,v ,(cadr form))))))))
+	(##core#lambda () ,(caddr form))
+	(##core#lambda ,v (,(r 'list-ref) ,v ,(cadr form))))))))
 
 (##sys#extend-macro-environment
  'define-inline '()
  (##sys#er-transformer
   (lambda (form r c)
-    (let ((%lambda (r 'lambda)))
       (letrec ([quotify-proc 
 		(lambda (xs id)
 		  (##sys#check-syntax id xs '#(_ 1))
 		  (let* ([head (car xs)]
 			 [name (if (pair? head) (car head) head)]
 			 [val (if (pair? head)
-				  `(,%lambda ,(cdr head) ,@(cdr xs))
+				  `(##core#lambda ,(cdr head) ,@(cdr xs))
 				  (cadr xs) ) ] )
-		    (when (or (not (pair? val)) (not (c %lambda (car val))))
+		    (when (or (not (pair? val)) 
+			      (and (not (eq? '##core#lambda (car val)))
+				   (not (c (r 'lambda) (car val)))))
 		      (syntax-error 
 		       'define-inline "invalid substitution form - must be lambda"
 		       name val) )
 		    (list name val) ) ) ] )
-	`(##core#define-inline ,@(quotify-proc (cdr form) 'define-inline)))) ) ) )
+	`(##core#define-inline ,@(quotify-proc (cdr form) 'define-inline)))) ) )
 
 (##sys#extend-macro-environment
  'and-let* '()
@@ -466,20 +445,18 @@
   (lambda (form r c)
     (##sys#check-syntax 'and-let* form '(_ #(_ 0) . _))
     (let ((bindings (cadr form))
-	  (body (cddr form))
-	  (%if (r 'if))
-	  (%let (r 'let)))
+	  (body (cddr form)))
       (let fold ([bs bindings])
 	(if (null? bs)
-	    `(,(r 'begin) ,@body)
+	    `(##core#begin ,@body)
 	    (let ([b (car bs)]
 		  [bs2 (cdr bs)] )
-	      (cond [(not (pair? b)) `(,%if ,b ,(fold bs2) #f)]
-		    [(null? (cdr b)) `(,%if ,(car b) ,(fold bs2) #f)]
+	      (cond [(not (pair? b)) `(##core#if ,b ,(fold bs2) #f)]
+		    [(null? (cdr b)) `(##core#if ,(car b) ,(fold bs2) #f)]
 		    [else
 		     (let ((var (car b)))
-		       `(,%let ((,var ,(cadr b)))
-			 (,%if ,var ,(fold bs2) #f) ) ) ] ) ) ) ) ) ) ) )
+		       `(##core#let ((,var ,(cadr b)))
+			 (##core#if ,var ,(fold bs2) #f) ) ) ] ) ) ) ) ) ) ) )
 
 (##sys#extend-macro-environment
  'select '()
@@ -489,11 +466,9 @@
     (let ((exp (cadr form))
 	  (body (cddr form))
 	  (tmp (r 'tmp))
-	  (%if (r 'if))
 	  (%else (r 'else))
-	  (%or (r 'or))
-	  (%begin (r 'begin)))
-      `(,(r 'let) ((,tmp ,exp))
+	  (%or (r 'or)))
+      `(##core#let ((,tmp ,exp))
 	,(let expand ((clauses body))
 	   (if (not (pair? clauses))
 	       '(##core#undefined)
@@ -501,10 +476,10 @@
 		     (rclauses (##sys#slot clauses 1)) )
 		 (##sys#check-syntax 'select clause '#(_ 1))
 		 (if (c %else (car clause))
-		     `(,%begin ,@(cdr clause))
-		     `(,%if (,%or ,@(map (lambda (x) `(##sys#eqv? ,tmp ,x)) 
+		     `(##core#begin ,@(cdr clause))
+		     `(##core#if (,%or ,@(map (lambda (x) `(##sys#eqv? ,tmp ,x)) 
 					 (car clause) ) )
-			    (,%begin ,@(cdr clause)) 
+			    (##core#begin ,@(cdr clause)) 
 			    ,(expand rclauses) ) ) ) ) ) ) ) ) ) )
 
 
@@ -593,10 +568,7 @@
     (##sys#check-syntax 'let-optionals form '(_ _ . _))
     (let ((arg-list (cadr form))
 	  (var/defs (caddr form))
-	  (body (cdddr form))
-	  (%if (r 'if))
-	  (%let (r 'let))
-	  (%lambda (r 'lambda)))
+	  (body (cdddr form)))
 
       ;; This guy makes the END-DEF, START-DEF, PORT-DEF definitions above.
       ;; I wish I had a reasonable loop macro.
@@ -609,7 +581,7 @@
 	  (if (null? vars) '()
 	      (let ((vars (cdr vars)))
 		`((,(car defaulter-names)
-		   (,%lambda ,(reverse vars)
+		   (##core#lambda ,(reverse vars)
 			     (,next-guy ,@(reverse vars) ,(car defs))))
 		  . ,(recur vars
 			    (cdr defaulter-names)
@@ -622,13 +594,13 @@
       (define (make-if-tree vars defaulters body-proc rest rename)
 	(let recur ((vars vars) (defaulters defaulters) (non-defaults '()))
 	  (if (null? vars)
-	      `(,%if (##core#check (,(r 'null?) ,rest))
+	      `(##core#if (##core#check (,(r 'null?) ,rest))
 		     (,body-proc . ,(reverse non-defaults))
 		     (##sys#error (##core#immutable '"too many optional arguments") ,rest))
 	      (let ((v (car vars)))
-		`(,%if (null? ,rest)
+		`(##core#if (null? ,rest)
 		       (,(car defaulters) . ,(reverse non-defaults))
-		       (,%let ((,v (,(r 'car) ,rest)) ; we use car/cdr, because of rest-list optimization
+		       (##core#let ((,v (,(r 'car) ,rest)) ; we use car/cdr, because of rest-list optimization
 			       (,rest (,(r 'cdr) ,rest)))
 			      ,(recur (cdr vars)
 				      (cdr defaulters)
@@ -661,7 +633,7 @@
 				    rest-var gensym)))
 
 	`(,(r 'let*) ((,rest-var ,arg-list)
-		      (,body-proc (,%lambda ,vars . ,body))
+		      (,body-proc (##core#lambda ,vars . ,body))
 		      . ,defaulters)
 	  ,if-tree) ) ))))
 
@@ -689,9 +661,9 @@
     (let ((var (r 'tmp))
 	  (%if (r 'if)))
       `(,(r 'let) ((,var ,(cadr form)))
-	(,%if (,(r 'null?) ,var) 
+	(##core#if (,(r 'null?) ,var) 
 	      ,(optional (cddr form) #f)
-	      (,%if (##core#check (,(r 'null?) (,(r 'cdr) ,var)))
+	      (##core#if (##core#check (,(r 'null?) (,(r 'cdr) ,var)))
 		    (,(r 'car) ,var)
 		    (##sys#error
 		     (##core#immutable '"too many optional arguments") 
@@ -722,31 +694,29 @@
     (let ((args (cadr form))
 	  (var/defs (caddr form))
 	  (body (cdddr form))
-	  (%let (r 'let))
 	  (%null? (r 'null?))
 	  (%car (r 'car))
-	  (%cdr (r 'cdr))
-	  (%if (r 'if)))
+	  (%cdr (r 'cdr)))
       (let ((rvar (r 'tmp)))
-	`(,%let ((,rvar ,args))
+	`(##core#let ((,rvar ,args))
 		,(let loop ([args rvar] [vardefs var/defs])
 		   (if (null? vardefs)
-		       `(,%if (##core#check (,%null? ,args))
-			      (,%let () ,@body)
+		       `(##core#if (##core#check (##core#null? ,args))
+			      (##core#let () ,@body)
 			      (##sys#error 
 			       (##core#immutable '"too many optional arguments") 
 			       ,args) )
 		       (let ([head (car vardefs)])
 			 (if (pair? head)
 			     (let ((rvar2 (r 'tmp2)))
-			       `(,%let ((,(car head) (,%if (,%null? ,args)
+			       `(##core#let ((,(car head) (##core#if (##core#null? ,args)
 							   ,(cadr head)
 							   (,%car ,args)))
-					(,rvar2 (,%if (,%null? ,args) 
+					(,rvar2 (##core#if (,%null? ,args) 
 						      '()
 						      (,%cdr ,args))) )
 				       ,(loop rvar2 (cdr vardefs)) ) )
-			     `(,%let ((,head ,args)) ,@body) ) ) ) ) ) ) ))))
+			     `(##core#let ((,head ,args)) ,@body) ) ) ) ) ) ) ))))
 
 
 ;;; case-lambda (SRFI-16):
@@ -774,22 +744,19 @@
 	   (minvars (genvars mincount))
 	   (rvar (r 'rvar))
 	   (lvar (r 'lvar))
-	   (%lambda (r 'lambda))
-	   (%let (r 'let))
 	   (%>= (r '>=))
 	   (%eq? (r 'eq?))
 	   (%car (r 'car))
-	   (%cdr (r 'cdr))
-	   (%if (r 'if)))
-      `(,%lambda ,(append minvars rvar)
-		 (,%let ((,lvar (length ,rvar)))
+	   (%cdr (r 'cdr)))
+      `(##core#lambda ,(append minvars rvar)
+		 (##core#let ((,lvar (length ,rvar)))
 			,(fold-right
 			  (lambda (c body)
 			    (##sys#decompose-lambda-list
 			     (car c)
 			     (lambda (vars argc rest)
 			       (##sys#check-syntax 'case-lambda (car c) 'lambda-list)
-			       `(,%if ,(let ([a2 (fx- argc mincount)])
+			       `(##core#if ,(let ([a2 (fx- argc mincount)])
 					 (if rest
 					     (if (zero? a2)
 						 #t
@@ -800,18 +767,18 @@
 					 (let ((bindings
 						(let build ((vars2 vars2) (vrest rvar))
 						  (if (null? vars2)
-						      (cond (rest `(,%let ((,rest ,vrest)) ,@(cdr c)))
+						      (cond (rest `(##core#let ((,rest ,vrest)) ,@(cdr c)))
 							    ((null? (cddr c)) (cadr c))
-							    (else `(,%let () ,@(cdr c))) )
+							    (else `(##core#let () ,@(cdr c))) )
 						      (let ((vrest2 (r (gensym))))
-							`(,%let ((,(car vars2) (,%car ,vrest))
+							`(##core#let ((,(car vars2) (,%car ,vrest))
 								 (,vrest2 (,%cdr ,vrest)) )
 								,(if (pair? (cdr vars2))
 								     (build (cdr vars2) vrest2)
 								     (build '() vrest2) ) ) ) ) ) ) )
 					   (if (null? vars1)
 					       bindings
-					       `(,%let ,(map list vars1 minvars) ,bindings) ) ) )
+					       `(##core#let ,(map list vars1 minvars) ,bindings) ) ) )
 				      ,body) ) ) )
 			  '(##core#check (##sys#error (##core#immutable '"no matching clause in call to 'case-lambda' form")))
 			  (cdr form))))))))
@@ -832,7 +799,7 @@
 	      '((symbol symbol symbol) . #(_ 1)))
 	     `(##sys#register-record-printer 
 	       ',(##sys#slot head 0)
-	       (,(r 'lambda) ,(##sys#slot head 1) ,@body)) ]
+	       (##core#lambda ,(##sys#slot head 1) ,@body)) ]
 	    [else
 	     (##sys#check-syntax 'define-record-printer (cons head body) '(symbol _))
 	     `(##sys#register-record-printer ',head ,@body) ] ) ))))
@@ -848,18 +815,17 @@
   (lambda (form r c)
     (##sys#check-syntax 'handle-exceptions form '(_ variable _ . _))
   (let ((k (r 'k))
-	(args (r 'args))
-	(%lambda (r 'lambda)))
+	(args (r 'args)))
     `((,(r 'call-with-current-continuation)
-       (,%lambda (,k)
+       (##core#lambda (,k)
 	 (,(r 'with-exception-handler)
-	  (,%lambda (,(cadr form)) (,k (,%lambda () ,(caddr form))))
-	  (,%lambda ()
+	  (##core#lambda (,(cadr form)) (,k (##core#lambda () ,(caddr form))))
+	  (##core#lambda ()
 	    (##sys#call-with-values
-	     (,%lambda () ,@(cdddr form))
-	     (,%lambda 
+	     (##core#lambda () ,@(cdddr form))
+	     (##core#lambda 
 	      ,args 
-	      (,k (lambda () (##sys#apply ##sys#values ,args)))) ) ) ) ) ) ) ) ) ) )
+	      (,k (##core#lambda () (##sys#apply ##sys#values ,args)))) ) ) ) ) ) ) ) ) ) )
 
 (##sys#extend-macro-environment
  'condition-case 
@@ -871,8 +837,6 @@
     (let ((exvar (r 'exvar))
 	  (kvar (r 'kvar))
 	  (%and (r 'and))
-	  (%let (r 'let))
-	  (%quote (r 'quote))
 	  (%memv (r 'memv))
 	  (%else (r 'else)))
       (define (parse-clause c)
@@ -882,14 +846,14 @@
 	  (if (null? kinds)
 	      `(,%else 
 		,(if var
-		     `(,%let ([,var ,exvar]) ,@body)
-		     `(,%let () ,@body) ) )
-	      `((,%and ,kvar ,@(map (lambda (k) `(,%memv (,%quote ,k) ,kvar)) kinds))
+		     `(##core#let ([,var ,exvar]) ,@body)
+		     `(##core#let () ,@body) ) )
+	      `((,%and ,kvar ,@(map (lambda (k) `(,%memv (##core#quote ,k) ,kvar)) kinds))
 		,(if var
-		     `(,%let ([,var ,exvar]) ,@body)
-		     `(,%let () ,@body) ) ) ) ) )
+		     `(##core#let ([,var ,exvar]) ,@body)
+		     `(##core#let () ,@body) ) ) ) ) )
       `(,(r 'handle-exceptions) ,exvar
-	(,%let ([,kvar (,%and (##sys#structure? ,exvar (,%quote condition) )
+	(##core#let ([,kvar (,%and (##sys#structure? ,exvar (##core#quote condition) )
 			      (##sys#slot ,exvar 1))])
 	       (,(r 'cond) ,@(map parse-clause (cddr form))
 		(,%else (##sys#signal ,exvar)) ) )
@@ -911,8 +875,6 @@
 	  (conser (caddr form))
 	  (pred (cadddr form))
 	  (slots (cddddr form))
-	  (%begin (r 'begin))
-	  (%lambda (r 'lambda))
 	  (%define (r 'define))
 	  (%quote (r 'quote))
 	  (%getter-with-setter (r 'getter-with-setter))
@@ -920,16 +882,16 @@
 	  (x (r 'x))
 	  (y (r 'y))
 	  (slotnames (map car slots)))
-      `(,%begin
+      `(##core#begin
 	(,%define ,conser
 		  (##sys#make-structure 
-		   (,%quote ,t)
+		   (##core#quote ,t)
 		   ,@(map (lambda (sname)
 			    (if (memq sname vars)
 				sname
 				'(##core#undefined) ) )
 			  slotnames) ) )
-	(,%define (,pred ,x) (##sys#structure? ,x (,%quote ,t)))
+	(,%define (,pred ,x) (##sys#structure? ,x (##core#quote ,t)))
 	,@(let loop ([slots slots] [i 1])
 	    (if (null? slots)
 		'()
@@ -981,18 +943,16 @@
   (lambda (form r c)
     (let ((%<> (r '<>))
 	  (%<...> (r '<...>))
-	  (%apply (r 'apply))
-	  (%begin (r 'begin))
-	  (%lambda (r 'lambda)))
+	  (%apply (r 'apply)))
       (let loop ([xs (cdr form)] [vars '()] [vals '()] [rest #f])
 	(if (null? xs)
 	    (let ([rvars (reverse vars)]
 		  [rvals (reverse vals)] )
 	      (if rest
 		  (let ([rv (r (gensym))])
-		    `(,%lambda (,@rvars . ,rv)
+		    `(##core#lambda (,@rvars . ,rv)
 			       (,%apply ,(car rvals) ,@(cdr rvals) ,rv) ) )
-		  `(,%lambda ,rvars ((,%begin ,(car rvals)) ,@(cdr rvals)) ) ) )
+		  `(##core#lambda ,rvars ((##core#begin ,(car rvals)) ,@(cdr rvals)) ) ) )
 	    (cond ((c %<> (car xs))
 		   (let ([v (r (gensym))])
 		     (loop (cdr xs) (cons v vars) (cons v vals) #f) ) )
@@ -1004,9 +964,7 @@
  `((apply . ,(##sys#primitive-alias 'apply)))
  (##sys#er-transformer
   (lambda (form r c)
-    (let ((%let (r 'let))
-	  (%lambda (r 'lambda))
-	  (%apply (r 'apply))
+    (let ((%apply (r 'apply))
 	  (%<> (r '<>))
 	  (%<...> (r '<...>)))
       (let loop ([xs (cdr form)] [vars '()] [bs '()] [vals '()] [rest #f])
@@ -1015,12 +973,12 @@
 		  [rvals (reverse vals)] )
 	      (if rest
 		  (let ([rv (r (gensym))])
-		    `(,%let 
+		    `(##core#let 
 		      ,bs
-		      (,%lambda (,@rvars . ,rv)
+		      (##core#lambda (,@rvars . ,rv)
 				(,%apply ,(car rvals) ,@(cdr rvals) ,rv) ) ) )
-		  `(,%let ,bs
-			  (,%lambda ,rvars (,(car rvals) ,@(cdr rvals)) ) ) ) )
+		  `(##core#let ,bs
+			  (##core#lambda ,rvars (,(car rvals) ,@(cdr rvals)) ) ) ) )
 	    (cond ((c %<> (car xs))
 		   (let ([v (r (gensym))])
 		     (loop (cdr xs) (cons v vars) bs (cons v vals) #f) ) )
@@ -1049,7 +1007,7 @@
 	(cond ((null? cs)
 	       (let ((exps (if exports
 			       `(,%declare (,%export ,@exports))
-			       '(,%begin))))
+			       '(##core#begin))))
 		 `(,(r 'cond-expand)
 		   (chicken-compile-shared ,exps ,@d)
 		   ((,(r 'not) compiling) ,@d)
@@ -1062,9 +1020,9 @@
 	       (let ((t (caar cs))
 		     (next (cdr cs)) )
 		 (cond ((c %static t)
-			(loop (cons `(,%begin ,@(cdar cs)) s) d next exports))
+			(loop (cons `(##core#begin ,@(cdar cs)) s) d next exports))
 		       ((c %dynamic t) 
-			(loop s (cons `(,%begin ,@(cdar cs)) d) next exports))
+			(loop s (cons `(##core#begin ,@(cdar cs)) d) next exports))
 		       ((c %export t)
 			(loop s d next (append (or exports '()) (cdar cs))))
 		       (else
@@ -1082,14 +1040,13 @@
  (##sys#er-transformer
   (lambda (form r c)
     (##sys#check-syntax 'rec form '(_ _ . _))
-    (let ((head (cadr form))
-	  (%letrec (r 'letrec)))
+    (let ((head (cadr form)))
       (if (pair? head)
-	  `(,%letrec ((,(car head) 
-		       (,(r 'lambda) ,(cdr head)
-			,@(cddr form))))
-		     ,(car head))
-	  `(,%letrec ((,head ,@(cddr form))) ,head))))))
+	  `(##core#letrec ((,(car head) 
+			    (##core#lambda ,(cdr head)
+					   ,@(cddr form))))
+			  ,(car head))
+	  `(##core#letrec ((,head ,@(cddr form))) ,head))))))
 
 
 ;;; Definitions available at macroexpansion-time:
diff --git a/compiler-namespace.scm b/compiler-namespace.scm
index ceedc546..7dad067b 100644
--- a/compiler-namespace.scm
+++ b/compiler-namespace.scm
@@ -229,7 +229,6 @@
  print-version
  process-command-line
  process-declaration
- process-lambda-documentation
  profile-info-vector-name
  profile-lambda-index
  profile-lambda-list
diff --git a/compiler.scm b/compiler.scm
index 09ad645f..cea1ea55 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -635,7 +635,7 @@
 			      (##core#let () ,@body) )
 			    e se dest)))
 
-			((lambda ##core#lambda)
+			((##core#lambda)
 			 (let ((llist (cadr x))
 			       (obody (cddr x)) )
 			   (when (##sys#extended-lambda-list? llist)
@@ -659,28 +659,18 @@
 				(cond ((or (not dest) 
 					   (assq dest se)) ; not global?
 				       l)
-				      ;; (*) here we make a distinction between user-
-				      ;; lambdas and internally created lambdas. Bad.
-				      ((and (eq? 'lambda (or (lookup name se) name))
-					    emit-profile
+				      ((and emit-profile
 					    (or (eq? profiled-procedures 'all)
 						(and
 						 (eq? profiled-procedures 'some)
-						 (variable-mark dest '##compiler#profile))))
-				       (expand-profile-lambda dest llist2 body) )
-				      (else
-				       (if (and (> (length body0) 1)
-						(symbol? (car body0))
-						(eq? 'begin (or (lookup (car body0) se) (car body0)))
-						(let ((x1 (cadr body0)))
-						  (or (string? x1)
-						      (and (list? x1)
-							   (= (length x1) 2)
-							   (symbol? (car x1))
-							   (eq? 'quote (or (lookup (car x1) se) (car x1)))))))
-					   (process-lambda-documentation
-					    dest (cadr body) l) 
-					   l))))))))
+						 (variable-mark dest '##compiler#profile)))
+					    (##sys#interned-symbol? dest))
+				       (expand-profile-lambda
+					(if (memq dest e) ;XXX should normally not be the case
+					    e
+					    (##sys#alias-global-hook dest #f))
+					llist2 body) )
+				      (else l)))))))
 			
 			((##core#let-syntax)
 			 (let ((se2 (append
diff --git a/csi.scm b/csi.scm
index 3b2ea946..c1c9e3cb 100644
--- a/csi.scm
+++ b/csi.scm
@@ -859,9 +859,18 @@ EOF
 		    arg 
 		    (and (equal? "-sx" scr)
 			 (lambda (x)
-			   (pretty-print x ##sys#standard-error)
-			   (newline ##sys#standard-error)
-			   (eval x)))
+			   (let* ((str (with-output-to-string (cut pretty-print x)))
+				  (len (string-length str)))
+			     (flush-output ##sys#standard-output)
+			     (display "\n; " ##sys#standard-error)
+			     (do ((i 0 (fx+ i 1)))
+				 ((fx>= i len))
+			       (let ((c (string-ref str i)))
+				 (write-char c ##sys#standard-error)
+				 (when (char=? #\newline c)
+				   (display "; " ##sys#standard-error))))
+			     (newline ##sys#standard-error)
+			     (eval x))))
 		    #f)
 		   (when (equal? "-ss" scr)
 		     (call-with-values (cut main (command-line-arguments))
diff --git a/eval.scm b/eval.scm
index 5581ccff..315ecc0c 100644
--- a/eval.scm
+++ b/eval.scm
@@ -487,7 +487,7 @@
 			       (##core#let () ,@body) )
 			     e h tf cntr se)))
 
-			 [(lambda ##core#lambda) ;XXX qualified only
+			 [(##core#lambda)
 			  (##sys#check-syntax 'lambda x '(_ lambda-list . #(_ 1)) #f se)
 			  (let* ([llist (cadr x)]
 				 [body (cddr x)] 
diff --git a/expand.scm b/expand.scm
index 11d87ce9..a64dbb5a 100644
--- a/expand.scm
+++ b/expand.scm
@@ -57,7 +57,7 @@
     (no-procedure-checks)))
  (else))
 
-(begin
+#;(begin
   (define-syntax dd (syntax-rules () ((_ . _) (void))))
   (define-syntax dm (syntax-rules () ((_ . _) (void))))
   (define-syntax dc (syntax-rules () ((_ . _) (void)))) )
@@ -958,6 +958,14 @@
 
 (define ##sys#initial-macro-environment (##sys#macro-environment))
 
+(##sys#extend-macro-environment
+ 'lambda
+ '()
+ (##sys#er-transformer
+  (lambda (x r c)
+    (##sys#check-syntax 'lambda x '(_ lambda-list . #(_ 1)))
+    `(##core#lambda ,@(cdr x)))))
+
 (##sys#extend-macro-environment
  'quote
  '()
diff --git a/support.scm b/support.scm
index fc3b1fa2..44494372 100644
--- a/support.scm
+++ b/support.scm
@@ -270,9 +270,6 @@
 
 (define decompose-lambda-list ##sys#decompose-lambda-list)
 
-(define (process-lambda-documentation id doc proc)
-  proc)					; Hook this
-
 (define (llist-length llist)
   (##core#inline "C_u_i_length" llist))
 
diff --git a/tests/module-tests-2.scm b/tests/module-tests-2.scm
new file mode 100644
index 00000000..4b5d8500
--- /dev/null
+++ b/tests/module-tests-2.scm
@@ -0,0 +1,87 @@
+;;;; module-tests-2.scm
+
+
+(module oo (output-of)
+  (import scheme chicken ports)
+  (define-syntax output-of 
+    (syntax-rules ()
+      ((_ exp) (with-output-to-string (lambda () exp)))))
+)
+
+(module mscheme (lambda)
+  (import (rename scheme (lambda s:lambda))
+	  chicken)
+  (reexport (except scheme lambda))
+  (define-syntax lambda
+    (syntax-rules ()
+      ((_ llist . body)
+       (let ((results #f))
+	 (s:lambda 
+	  llist
+	  (if results
+	      (apply values results)
+	      (call-with-values (s:lambda () . body)
+		(s:lambda rs
+		  (set! results rs)
+		  (apply values rs)))))))))
+)
+
+(module m (f1 f2)
+  (import mscheme)
+  (define (f1)
+    (display 'f1) (newline)
+    'f1)
+  (define f2
+    (lambda ()
+      (display 'f2) (newline)
+      'f2))
+)
+
+(module mtest ()
+  (import scheme m chicken oo)
+  (assert (string=? "f1\n" (output-of (f1))))
+  (assert (string=? "f1\n" (output-of (f1))))
+  (assert (string=? "f2\n" (output-of (f2))))
+  (assert (string=? "" (output-of (f2)))))
+
+;;;
+
+(module m1 (lambda f1 f2)
+  (import (rename scheme (lambda s:lambda)))
+
+  (define-syntax lambda
+    (syntax-rules ()
+      ((_ llist . body)
+       (s:lambda llist (display 'llist) (newline) . body))))
+
+  (define (f1)				; should use standard lambda
+    (display 'f1)
+    (newline))
+
+  (define f2
+    (lambda (x)				; should be our lambda
+      (display 'f2)
+      (newline)))
+
+)
+
+(module mtest2 (f3 f4)
+  (import (except scheme lambda) m1 chicken oo)
+
+  (define (f3)				; standard lambda
+    (display 'f3)
+    (newline))
+
+  (define f4				; our lambda
+    (lambda (x)
+      (display 'f4)
+      (newline)))
+
+  (assert (string=? "f1\n" (output-of (f1))))
+  (assert (string=? "(x)\nf2\n" (output-of (f2 'yes))))
+  (assert (string=? "f3\n" (output-of (f3))))
+  (assert (string=? "(x)\nf4\n" (output-of (f4 'yes)))))
+
+(module m2 ()
+  (import m1)
+  ((lambda () (f1)))) ; should use new lambda (but should be folded by compiler)
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 1e41afb9..c4515614 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -139,6 +139,7 @@ $interpret -i -s r5rs_pitfalls.scm
 
 echo "======================================== module tests ..."
 $interpret -include-path .. -s module-tests.scm
+$interpret -include-path .. -s module-tests-2.scm
 
 echo "======================================== module tests (compiled) ..."
 $compile module-tests-compiled.scm
Trap