美文网首页
Lexical binding与Dynamic binding

Lexical binding与Dynamic binding

作者: lyhux | 来源:发表于2016-03-01 15:53 被阅读109次

lexical绑定与dynamic绑定

EOPL 的练习题 3.28 与 3.29 中用到了dynamic绑定,运行的结果与lexical绑定中的不同,并且难与理解程序

习题 3.8 代码

  let a = 3
  in let p = proc (x) -(x,a)
      in let  a=5
          in -(a,(p 2)) 

习题 3.9 代码

  let a = 3
      in let p = proc (z) a
          in let f = proc (x) (p 0)
              in let a = 5
                  in (f 2)

lexical binding 结果

(struct:num-val 6)
(struct:num-val 3)

dynamic binding结果

(struct:num-val 8)
(struct:num-val 5)

解析器中的代码差异

lexical 中的 不同这处在于

 (proc-exp (iden exp1)
       (let ((free-var (remove-same-element (free-variables exp1  iden))))
             (let ((f-env (filter-env free-var env)))
                  (proc-val (procedure iden exp1 f-env )))))  ;; 绑定环境变量
         
(call-exp (exp1 exp2)
        (letrec ((proc (expval->proc (value-of exp1 env)))
                    (more-param (lambda (parms rsl)
                                         (if (null? parms)
                                          rsl
                                          (let ((val (value-of (car parms) env)))
                                               (more-param (cdr parms) (cons val rsl)))))))
                 (let ((param-lst (more-param (reverse exp2) '())))
                       (apply-procedure proc param-lst))))

dynamic binding 中的不同之处

(proc-exp (iden exp1)
                       (proc-val (procedure iden exp1 (empty-env)  )))  ;; 不进行环境变量的绑定


(call-exp (exp1 exp2)
                   (letrec ((p-proc (expval->proc (value-of exp1 env)))
                            (more-param (lambda (parms rsl)
                                         (if (null? parms)
                                             rsl
                                             (let ((val (value-of (car parms) env)))
                                               (more-param (cdr parms) (cons val rsl)))))))
                     (let ((param-lst (more-param (reverse exp2) '())))
                       (cases proc p-proc
                              (procedure (p-var p-body p-env)
                                         (apply-procedure (procedure p-var p-body env) param-lst))))))  ;;绑定环境变量

不同之处

在于procedure绑定环境变量env的时间不同
在lexical中是在对procedure解析的时候绑定的
而在dynamic是在运行里对env进行绑定的。
dynamic绑定的问题也是很明显的,对于动态绑字的变量,在不同的环境上运行会得到不同的结果,认为很迷惑。

参见BLOG | 逍遥郡

相关文章

网友评论

      本文标题:Lexical binding与Dynamic binding

      本文链接:https://www.haomeiwen.com/subject/yozgkttx.html