Dr.Schemeのlocal

これで良いかな…

(define-macro (local defs . body)
  (let* ((split-define
          (lambda (def)
            (let ((name (cadr def))
                  (body (cddr def)))
              (cond [(list? name)
                     (cons (car name) (list (cons 'lambda (cons (cdr name) body))))]
                    [(pair? name)
                     (cons (car name) (list (cons 'lambda (cons (cdr name) body))))]
                    [else (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)))))

(local ((define x 1)) x)
(local ((define (f x) (+ x 1))) (f 2))
(local ((define (f . x) (print x))) (f 1 2 3))