Binding 方案中的浅绑定与深绑定

Binding 方案中的浅绑定与深绑定,binding,scheme,Binding,Scheme,假设动态范围,如果display语句是浅绑定还是深绑定,那么它的区别是什么? 我知道浅绑定是在调用时绑定,而深绑定是在作为参数传递时绑定,但我不确定这在scheme上下文中是如何工作的。我认为深装订应该打印2,但我不确定 (define A (let* ((x 2) (C (lambda (P) (let ((x 4)) (P)))) (D (display x))

假设动态范围,如果display语句是浅绑定还是深绑定,那么它的区别是什么? 我知道浅绑定是在调用时绑定,而深绑定是在作为参数传递时绑定,但我不确定这在scheme上下文中是如何工作的。我认为深装订应该打印2,但我不确定

(define A 
    (let* ((x 2)
           (C (lambda (P) 
                 (let ((x 4))
                    (P))))
           (D (display x))
           (B (let ((x 3))
                   (C D))))
        (B)))

让我们来了解一些定义:

  • 深度绑定在将过程作为 争论
  • 浅绑定在实际调用过程时绑定环境
所以唯一的区别是关于C的评估,它发生在B内部

(define A 
    (let* ((x 2)
           (C (lambda (P) 
                 (let ((x 4))
                    (P))))
           (D (display x))
           (B (let ((x 3))
                   (C D))))
        (B)))
另一方面,代码本身似乎有缺陷,(display x)不会返回值,但它会被传递到C中

假设您的意思是
(D(lambda()(display x))

在深度绑定下,当D被传递到C时,x的值是3,所以我们应该期望打印3


在浅层绑定下,当实际调用过程时,x的值为4,因此将打印4。

可能重复@greenteam。您能否提供您的来源,以便解释什么是浅层/深层绑定?另外,Scheme是词法,所以你可能指的是一般的lisp,如果是的话,这应该重新标记为“lisp”吗?进行编辑是错误的,因为它改变了文章太多,所以我退了回去。@WillNess完全诚实地说,这个问题是3年前我在大学上函数式编程课时提出的,自从课程结束后,我就没有看过这些材料。如果我说我能很好地记住差异并解释它,那我就是在撒谎。如果我没记错的话,深度绑定是在相关函数的父函数的作用域上进行的,而浅层绑定是在调用相关函数的最后一个函数的作用域上进行的。(如果措辞混乱,我道歉)谢谢。顺便说一句,参考文献是。我想你会感到困惑,因为它询问Scheme上下文中的深层和浅层绑定,这与你描述的完全不同。同样,您所描述的内容与其他语言中名称相似但完全不同的概念有关。但问题是关于这个计划。在Scheme中,这些术语的含义是明确的,而不是您所描述的。方案中根本不存在“浅动态范围”或“深动态范围”。这个短语在Scheme的上下文中是没有意义的。另一件事是,你只发现了一个错误。如前所述,当B被设置为某个数值(无论是2、3还是4)后作为过程调用时,第二个代码段仍然会导致错误。
(define A 
    (let* ((x 2)
           (C (lambda (P) 
                 (let ((x 4))
                    (P))))
           (D (lambda () (display x)))
           (B (let ((x 3))
                   (C D))))
        (B)))