Dr.SchemeのlocalをGaucheで実現するーその2
(define-macro (local defs . body) (let* ((split-define (lambda (def) (let ((name (cadr def)) (body (cddr def))) (if (list? name) (cons (car name) (list (cons 'lambda (cons (cdr name) body)))) (cons name body))))) (def-pairs (map split-define defs)) (init (map (lambda (p) (list (car p) #f)) def-pairs)) (setup (map (lambda (p) (cons 'set! (cons (car p) (cdr p)))) def-pairs))) (cons 'let (cons init (append setup body)))))
shiroさんがコメントで教えてくださった通りに,set!を使って書いた.