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。
;;若是(closureV-ds - f-val)中加入ds,就会成为dynamic scope。
(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))))]))