~ chicken-core (chicken-5) b0594d1bb17d47a629164edfbb36bc972acc8823
commit b0594d1bb17d47a629164edfbb36bc972acc8823 Author: Peter Bex <peter@more-magic.net> AuthorDate: Sat Jan 23 16:26:27 2016 +0100 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Sat Jan 23 16:26:27 2016 +0100 Simplify parameterize expansion Conversion is only enabled upon first time entering the extent, this makes that a bit clearer. It's not necessary, but this would also allow setting the parameters in reverse order. It also pulls the code a little more comfortably to the left again. Signed-off-by: Evan Hanson <evhan@foldling.org> diff --git a/chicken-syntax.scm b/chicken-syntax.scm index f3ee9c81..0d14a3f5 100644 --- a/chicken-syntax.scm +++ b/chicken-syntax.scm @@ -279,7 +279,6 @@ (##sys#check-syntax 'parameterize form '#(_ 2)) (let* ((bindings (cadr form)) (body (cddr form)) - (swap (r 'swap)) (convert? (r 'convert?)) (params (##sys#map car bindings)) (vals (##sys#map cadr bindings)) @@ -291,29 +290,26 @@ (##core#let ,(map ##sys#list saveds vals) (##core#let - ((,convert? #t)) - (##core#let - ((,swap (##core#lambda - () - (##core#let - ;; First, convert all (converters may throw exns) - (,@(map (lambda (p s t) - `(,t (##core#if ,convert? - (,p ,s #t #f) - ,s))) - param-aliases saveds temps)) - ;; Save current values so we can restore them - ,@(map (lambda (p s) `(##core#set! ,s (,p))) - param-aliases saveds) - ;; Now set params to their new values (can't fail) - ,@(map (lambda (p t) `(,p ,t #f #t)) - param-aliases temps) - ;; And toggle conversion - (##core#set! ,convert? #f))))) - (##sys#dynamic-wind - ,swap - (##core#lambda () ,@body) - ,swap) ) ) ) ))))) + ((,convert? #t)) ; Convert only first time extent is entered! + (##sys#dynamic-wind + (##core#lambda () + (##core#let + ;; First, call converters (which may throw exceptions!) + ,(map (lambda (p s temp) + `(,temp (##core#if ,convert? (,p ,s #t #f) ,s))) + param-aliases saveds temps) + ;; Save current values so we can restore them later + ,@(map (lambda (p s) `(##core#set! ,s (,p))) + param-aliases saveds) + ;; Set parameters to their new values. This can't fail. + ,@(map (lambda (p t) `(,p ,t #f #t)) param-aliases temps) + ;; Remember we already converted (only call converters once!) + (##core#set! ,convert? #f) ) ) + (##core#lambda () ,@body) + (##core#lambda () + ;; Restore parameters to their original, saved values + ,@(map (lambda (p s) `(,p ,s #f #t)) + param-aliases saveds) )) ) ) ) ) ))) (##sys#extend-macro-environment 'when '()Trap