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))))))
       ))

  • 相关阅读:
    Atcoder Grand Contest 003 题解
    Atcoder Grand Contest 002 题解
    Atcoder Grand Contest 001 题解
    网络流24题
    AGC005D ~K Perm Counting
    loj6089 小Y的背包计数问题
    CF932E Team Work
    组合数学相关
    SPOJ REPEATS
    [SDOI2008]Sandy的卡片
  • 原文地址:https://www.cnblogs.com/mathlover/p/2707709.html
Copyright © 2011-2022 走看看