Here is my try:
(define-macro (my-letrec bindings . expr-list)
(define (gen-sym-list n acc)
(if (zero? n)
acc
(gen-sym-list (- n 1) (cons (gensym) acc))))
(if (not (list? bindings))
(error "Bad bindings: " bindings))
(let* ((num-bindings (length bindings))
(proc-sym-list (gen-sym-list num-bindings '()))
(var-list (map (lambda (var-bind) (car var-bind)) bindings))
(z-list
(map
(lambda (proc-sym)
`(lambda arg (apply (,proc-sym ,@[EMAIL PROTECTED]
) arg)))
proc-sym-list))
(y-list
(map
(lambda (var-bind)
(let ((var (car var-bind)) (bind (cadr var-bind)))
`(lambda ,proc-sym-list
((lambda ,var-list ,bind)
,@[EMAIL PROTECTED]
))))
bindings))
(y-sym-list (gen-sym-list num-bindings '())))
`(let ,(map
(lambda (y-sym y)
`(,y-sym ,y))
y-sym-list y-list)
(let ,(map
(lambda (var y-sym)
`(,var (,y-sym ,@[EMAIL PROTECTED]
)))
var-list y-sym-list)
,@[EMAIL PROTECTED]
))))


|