From 9be2f62ed3e0beb3f42022f4b269c5332416f530 Mon Sep 17 00:00:00 2001 From: Peter Bex Date: Sat, 23 Jan 2016 16:26:27 +0100 Subject: [PATCH 2/2] 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. --- chicken-syntax.scm | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/chicken-syntax.scm b/chicken-syntax.scm index f3ee9c8..1e33071 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,28 @@ (##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 guards 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 '() -- 2.1.4