From 14c4d0b57dee99ed06727670014b92ae02e75bed Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Sat, 15 May 2010 13:07:01 +0900 Subject: [PATCH] named let evaluates the initial bindings outside the scope of the loop (fixes 8.2 in r5rs_pitfalls.scm) --- lib/init.scm | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/init.scm b/lib/init.scm index b7f40fe0..d5191caf 100644 --- a/lib/init.scm +++ b/lib/init.scm @@ -219,13 +219,17 @@ (if (every (lambda (x) (if (pair? x) (if (pair? (cdr x)) (null? (cddr x)) #f) #f)) bindings) - (if (identifier? (cadr expr)) - `(,(rename 'letrec) ((,(cadr expr) - (,(rename 'lambda) ,(map car bindings) - ,@(cdddr expr)))) - ,(cons (cadr expr) (map cadr bindings))) - `((,(rename 'lambda) ,(map car bindings) ,@(cddr expr)) - ,@(map cadr bindings))) + ((lambda (vars vals) + (if (identifier? (cadr expr)) + `((,(rename 'lambda) ,vars + (,(rename 'letrec) ((,(cadr expr) + (,(rename 'lambda) ,vars + ,@(cdddr expr)))) + (,(cadr expr) ,@vars))) + ,@vals) + `((,(rename 'lambda) ,vars ,@(cddr expr)) ,@vals))) + (map car bindings) + (map cadr bindings)) (error "bad let syntax" expr))) (if (identifier? (cadr expr)) (caddr expr) (cadr expr))))))