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。
原文地址:https://www.cnblogs.com/lastk/p/12848373.html