• PLAI那些事07 FAE with Deferred Substitution


    FAE-parse : 一成不变

    FAE-Value : interp的最终转让值

    numV: value
    closureV: param-FAE(或value,或function) pair list
    (define-type FAE-Value
      [numV (n number?)]
      [closureV (param symbol?) (body FAE?) (ds DefrdSub?)])
    

    DefrdSub : 传达environment

    以前WAE中使用的DefrdSub只用于with,但是在这里with的置换和function call这两种作用是同时进行的。所以在FAE-Value上有numV和closureV两种组合。
    (define-type DefrdSub
      [mtSub]
      [aSub (name symbol?) (value FAE-Value?) (ds DefrdSub?)])
    

    lookup : symbol DefrdSub -> FAE-Value

    (define (lookup name ds)
      (type-case DefrdSub ds
        [mtSub () (error 'lookup "free variable")]
        [aSub (x val rest) (if (symbol=? x name)
                               val
                               (lookup name rest))]))
    

    interp : FAE - >FAE 修改为 FAE DefrdSub -> FAE-Value

    如果interp f ds中有f存在于ds中,在id (s)的lookup s ds中,closureV重新出现,那么f-val中的closureV a-val将成为numV。
    app中aSub为什么不是mtsub ?F1WAE with deferred substitution中是mtSub的理由是static scope。这里是由ds决定lambda函数的scope。这时的ds不是叫app时的ds,而是相当于function被定义时scope的ds。
    (define (interp fae ds)
      (type-case FAE fae
        [num (n) (numV n)]
        [add (l r) (num+ (interp l ds) (interp r ds))]
        [sub (l r) (num- (interp l ds) (interp r ds))]
        [id (s) (lookup s ds)]
        [fun (x b) (closureV x b ds)]
        [app (f a) (local [(define f-val (interp f ds))
                           (define a-val (interp a ds))]
                      (interp (closureV-body f-val)
                              (aSub (closureV-param f-val)
                                    a-val
                                    (closureV-ds f-val))))]))
    
    如果(closureV-ds - f-val)中加入ds,就会成为dynamic scope。
  • 相关阅读:
    Linux下搭建socks5代理
    在vs2005 使用FreeTextBox
    毕业了!!
    ASP.net 2.0上传图片方法
    再网页中,怎么用VS2005中的日历空件输入日期格式!
    毕业设计!!
    学校终于放假了,今天就可以回家了!
    求职!本人是07届刚毕业的学生!求程序员
    libcurl教程(转)
    spring boot集成swagger3
  • 原文地址:https://www.cnblogs.com/lastk/p/12848373.html
Copyright © 2020-2023  润新知