最近我开始学习计划语言
但我真的不知道如何解决这个问题。
(define A
(lambda()
(let* ((x 2)
(C (lambda (P)
(let ((x 4))
(P))))
(D (lambda ()
x))
(B (lambda ()
(let ((x 3))
(C D)))))
B)))
Q值。什么会打印?如何浅层绑定和深层绑定?
我简单地理解了define,lambda,let *但是我不知道解决这个问题。 我该如何解决?请评论详细解释
答案 0 :(得分: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的任何其他绑定。