diff --git a/scheme/base.sld b/scheme/base.sld index 85e0e623..a47854a7 100644 --- a/scheme/base.sld +++ b/scheme/base.sld @@ -86,7 +86,7 @@ or let let* - ;letrec + letrec begin case cond @@ -154,18 +154,25 @@ `(,(rename 'let) (,(caar (cdr expr))) (,(rename 'let*) ,(cdar (cdr expr)) ,@(cddr expr))) (error "bad let* syntax")))))) -; (define-syntax letrec -; (er-macro-transformer -; (lambda (exp rename compare) -; (let* ((bindings (cadr exp)) ;(letrec->bindings exp) -; (namings (map (lambda (b) (list (car b) #f)) bindings)) -; (names (map car (cadr exp))) ;(letrec->bound-vars exp) -; (sets (map (lambda (binding) -; (cons 'set! binding)) -; bindings)) -; (args (map cadr (cadr exp)))) ;(letrec->args exp) -; `(let ,namings -; (begin ,@(append sets (cddr exp)))))))) ;(letrec->exp exp) + (define-syntax letrec + (er-macro-transformer + (lambda (exp rename compare) + (let* ((bindings (cadr exp)) ;(letrec->bindings exp) + (namings (map (lambda (b) (list (car b) #f)) bindings)) + (names (map car (cadr exp))) ;(letrec->bound-vars exp) + (sets (map (lambda (binding) + (cons 'set! binding)) + bindings)) + (args (map cadr (cadr exp)))) ;(letrec->args exp) + `(let ,namings + (begin ,@(append sets (cddr exp)))))))) ;(letrec->exp exp) +;; NOTE: chibi uses the following macro. turns vars into defines? +;;(define-syntax letrec +;; (er-macro-transformer +;; (lambda (expr rename compare) +;; ((lambda (defs) +;; `((,(rename 'lambda) () ,@defs ,@(cddr expr)))) +;; (map (lambda (x) (cons (rename 'define) x)) (cadr expr)))))) (define-syntax begin (er-macro-transformer (lambda (exp rename compare) diff --git a/scheme/cyclone/transforms.sld b/scheme/cyclone/transforms.sld index 87507374..5ec9c905 100644 --- a/scheme/cyclone/transforms.sld +++ b/scheme/cyclone/transforms.sld @@ -138,7 +138,6 @@ (define (get-macros) *defined-macros*) (define *defined-macros* (list - (cons 'letrec (lambda (exp rename compare) (letrec=>lets+sets exp))) (cons 'cond-expand ;; Based on the cond-expand macro from Chibi scheme (lambda (expr rename compare) @@ -931,15 +930,6 @@ (args (letrec->args exp))) `(let ,namings (begin ,@(append sets (letrec->exp exp))))))) -;; NOTE: chibi uses the following macro. turns vars into defines? -;;(define-syntax letrec -;; (er-macro-transformer -;; (lambda (expr rename compare) -;; ((lambda (defs) -;; `((,(rename 'lambda) () ,@defs ,@(cddr expr)))) -;; (map (lambda (x) (cons (rename 'define) x)) (cadr expr)))))) -;; - ;; Top-level analysis