let->combination 实现了let原语

最近实现了普通的let表达式以及命名表达式。其中普通的表达式为

(let ((var1 exp1) (var2 exp2) ... (varn expn)) body)

变换成为((lambda (var1 var2 ... varn) body) exp1 exp2 ... expn)

命名let的形式为

(let name ((var1 exp1) (var2 exp2) ... (varn expn)) body)

变换为(begin (define (name var1 var2 ... varn) body) (name exp1 exp2 ... expn))

最终的代码实现为let->combination,其中未命名的和命名的let其实是分开来转换的。

 

(define (let->combination exp)
  (if (pair? (cadr exp)) ;; here is the unamed let
   (let ((list-of-body (cadr exp)) (body (cddr exp)))
    (let ((var-exp-list (unzipped list-of-body)))
      (let ((var-list (car var-exp-list))
            (exp-list (cadr var-exp-list)))
        (cons (make-lambda var-list body) exp-list))))
   ;; here is the named
   (let ((let-name (cadr exp)) (list-of-body (caddr exp)) (body (cadddr exp)))
     (let ((var-exp-list (unzipped list-of-body)))
       (let ((var-list (car var-exp-list))
             (exp-list (cadr var-exp-list)))
         (let ((func (list 'define (cons let-name var-list) body)))
           (list 'begin func (cons let-name exp-list))))))
   ))

posted on 2012-09-28 20:29  mathlover  阅读(213)  评论(0编辑  收藏  举报

导航