~ chicken-core (chicken-5) 70e53184f9a530905011503a0a90c21919202cdb


commit 70e53184f9a530905011503a0a90c21919202cdb
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Aug 1 08:51:59 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Aug 1 08:51:59 2011 +0200

    additional parameter-argument determines whether guard proc should be called or not

diff --git a/chicken-syntax.scm b/chicken-syntax.scm
index aea116fd..edcb0970 100644
--- a/chicken-syntax.scm
+++ b/chicken-syntax.scm
@@ -276,28 +276,32 @@
  (##sys#er-transformer
   (lambda (form r c)
     (##sys#check-syntax 'parameterize form '#(_ 2))
-     (let* ((bindings (cadr form))
-	    (body (cddr form))
-	    (swap (r 'swap))
-	    [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)] )
-       `(##core#let
-	 ,(##sys#append 
-	   (map ##sys#list aliases params)
-	   (map ##sys#list aliases2 vals))
+    (let* ((bindings (cadr form))
+	   (body (cddr form))
+	   (swap (r 'swap))
+	   (mode (r 'mode))
+	   (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)) )
+      `(##core#let
+	,(map ##sys#list aliases params)
+	(##core#let
+	 ,(map ##sys#list aliases2 vals)
+	 (##core#let
+	  ((,mode #f))
 	  (##core#let
 	   ((,swap (##core#lambda
 		    ()
 		    ,@(map (lambda (a a2)
-			     `(##core#let ((t (,a))) (,a ,a2)
+			     `(##core#let ((t (,a))) (,a ,a2 ,mode)
 					  (##core#set! ,a2 t)))
-			   aliases aliases2) ) ) )
+			   aliases aliases2)
+		    (##core#set! ,mode #t))))
 	   (##sys#dynamic-wind 
 	    ,swap
 	    (##core#lambda () ,@body)
-	    ,swap) ) ) ) )))
+	    ,swap) ) ) ) )))))
 
 (##sys#extend-macro-environment
  'when '()
diff --git a/library.scm b/library.scm
index 4b5ff135..6399e284 100644
--- a/library.scm
+++ b/library.scm
@@ -2160,26 +2160,32 @@ EOF
 
 (define make-parameter
   (let ((count 0))
-    (lambda (init . guard)
-      (let* ((guard (if (pair? guard) (car guard) (lambda (x) x)))
-	     (val (guard init))
-	     (i count))
+    (lambda (init #!optional (guard (lambda (x) x)))
+      (let ((val (guard init))
+	    (i count))
 	(set! count (fx+ count 1))
 	(when (fx>= i (##sys#size ##sys#default-parameter-vector))
 	  (set! ##sys#default-parameter-vector 
-	    (##sys#grow-vector ##sys#default-parameter-vector (fx+ i 1) (##core#undefined)) ) )
+	    (##sys#grow-vector
+	     ##sys#default-parameter-vector
+	     (fx+ i 1)
+	     (##core#undefined)) ) )
 	(##sys#setslot ##sys#default-parameter-vector i val)
 	(let ((assign 
-	       (lambda (val n)
+	       (lambda (val n mode)
 		 (when (fx>= i n)
 		   (set! ##sys#current-parameter-vector
-		     (##sys#grow-vector ##sys#current-parameter-vector (fx+ i 1) ##sys#snafu) ) )
-		 (##sys#setslot ##sys#current-parameter-vector i (guard val))
+		     (##sys#grow-vector
+		      ##sys#current-parameter-vector
+		      (fx+ i 1)
+		      ##sys#snafu) ) )
+		 (##sys#setslot ##sys#current-parameter-vector i (if mode val (guard val)))
 		 (##core#undefined) )))
 	  (getter-with-setter
-	   (lambda arg
+	   (lambda args
 	     (let ((n (##sys#size ##sys#current-parameter-vector)))
-	       (cond ((pair? arg) (assign (car arg) n))
+	       (cond ((pair? args)
+		      (assign (car args) n (optional (cdr args) #f)))
 		     ((fx>= i n)
 		      (##sys#slot ##sys#default-parameter-vector i) )
 		     (else
@@ -2189,7 +2195,7 @@ EOF
 			    val) ) ) ) ) )
 	   (lambda (val)
 	     (let ((n (##sys#size ##sys#current-parameter-vector)))
-	       (assign val n)))))))))
+	       (assign val n #f)))))))))
   
 
 ;;; Input:
diff --git a/tests/library-tests.scm b/tests/library-tests.scm
index 8aa5441c..7a491a07 100644
--- a/tests/library-tests.scm
+++ b/tests/library-tests.scm
@@ -229,3 +229,26 @@
 (assert (equal=? '#(1 2 (3)) '#(1 2 (3))))
 (assert (not (equal=? '#(1 2 (4)) '#(1 2 (3)))))
 (assert (not (equal=? 123 '(123))))
+
+;;; parameters
+
+(define guard-called 0)
+
+(define p
+  (make-parameter 
+   1
+   (lambda (x)
+     (set! guard-called (+ guard-called 1))
+     x)))
+
+(define k
+  (parameterize ((p 2))
+    (call/cc
+     (lambda (k) 
+       (assert (= 2 (p)))
+       k))))
+
+(k #f)
+
+(assert (= 2 guard-called))
+
Trap