方案中的浅层与深层绑定

时间:2016-10-13 03:11:42

标签: binding scheme

假设动态作用域,如果浅层或深层绑定,显示语句会有什么区别? 我理解浅层绑定是在调用时绑定的,而深层绑定是在作为参数传递时绑定的,但我不确定它在方案的上下文中是如何工作的。我认为深度绑定应该打印2但我不确定

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

1 个答案:

答案 0 :(得分:0)

让我们来定义一下:

  • 深度绑定在将过程作为 争论。
  • 浅绑定在实际调用过程时绑定环境

因此,唯一的区别在于B内部发生的C评估。

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

另一方面,代码本身似乎有错误,(显示x)不会返回值,但会传递给C。

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

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

在深度绑定下,当D传递给C时x的值为3,因此我们应该期望打印出3。

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