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

  • 相关阅读:
    HashMap、ConcurrentHashMap红黑树实现分析
    分布式系统ID
    分布式事务
    LRU算法实现
    Redis 深入
    分库分表利器——sharding-sphere
    Java常用的八种排序算法
    浅析Tomcat
    Kafka
    如何选择分布式事务形态
  • 原文地址:https://www.cnblogs.com/mathlover/p/2707709.html
Copyright © 2011-2022 走看看