0

最近我开始学习方案语言

但我真的不知道如何解决这个问题。

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

问:会打印什么?浅绑定和深绑定怎么样?

我简要了解了define、lambda、let*,但我不知道如何解决这个问题。我该如何解决?请评论并详细解释

4

1 回答 1

2

过程 A 返回过程 B。所以

(A)

返回

#<procedure:B>

如果你想让它被执行,你必须运行

((A))

这实际上会调用 B 并返回

2

那么发生了什么?调用 B 将以 D 作为参数调用 C。因此,C 将调用 D(绑定到参数 P)。D 返回 x,所以打印的是过程 D 中绑定到 x 的任何值。由于 Scheme 是词法范围的,并且 D 对 x 没有任何绑定,因此使用词法上下文的绑定,它来自

(let* ((x 2)

这就是打印 2 的原因,而不管其他过程中可能存在的对 D 的任何其他绑定。

于 2013-04-07T08:42:42.647 回答