zoukankan      html  css  js  c++  java
  • 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))))))
       ))

  • 相关阅读:
    FJ省队集训DAY3 T1
    FJ省队集训DAY2 T2
    FJ省队集训DAY2 T1
    FJ省队集训DAY1 T1
    POJ 1225 Substrings
    BZOJ 2732 射箭
    Light OJ 1314 Names for Babies
    SPOJ220 Relevant Phrases of Annihilation
    POJ3683 Falsita
    ES6 常用语法
  • 原文地址:https://www.cnblogs.com/mathlover/p/2707709.html
Copyright © 2011-2022 走看看