【问题标题】:Shallow vs. Deep binding in scheme方案中的浅绑定与深绑定
【发布时间】:2017-02-22 00:39:10
【问题描述】:

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

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

【问题讨论】:

  • @greenteam 您能否提供您的资料来源以解释什么是浅/深绑定?此外,Scheme 是词法的,所以也许你的意思是一般的 lisp,如果是这样的话,也许应该重新标记为“lisp”?
  • 这个编辑是错误的,因为它改变了帖子太多,所以我回滚了。
  • @WillNess 老实说,这个问题来自 3 年前我在大学上一门函数式编程课程时,自从课程结束后我就没有看过这些材料。如果我说我记得足以解释它的差异,那我就是在撒谎。如果我没记错的话,深度绑定占用了相关函数的父函数的范围,而浅绑定占用了最后一个函数的范围来调用相关函数。 (如果措辞令人困惑,我们深表歉意)
  • 谢谢。顺便说一句,参考是Shallow Binding in LISP 1.5

标签: binding scheme


【解决方案1】:

让我们来看看一些定义:

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

所以唯一的区别在于 B 内部对 C 的评估。

(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)))

(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。

【讨论】:

  • 我认为你很困惑,因为它询问了 Scheme 上下文中的深绑定和浅绑定,这与你描述的完全不同。同样,您所描述的内容与其他 语言中名称相似但完全不同 的概念相关。但问题是关于Scheme。在 Scheme 中,这些术语的含义很明确,并且不是您所描述的。 Scheme中根本没有“浅或深的动态范围”之类的东西。这个短语在 Scheme 的上下文中是没有意义的。
  • 另一件事是,您只发现了一个错误。如所写,当 B 在设置为某个数值(无论是 2、3 或 4)后作为过程调用时,您的第二个 sn-p 仍然会导致错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多