読者です 読者をやめる 読者になる 読者になる

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!を使って書いた.