【问题标题】:Need help understanding bindings in Scheme code需要帮助理解方案代码中的绑定
【发布时间】:2010-12-06 15:55:16
【问题描述】:

对于下面的代码,我无法理解绑定 (x, y, z) 是如何发生的。请查看代码,我将在下面更详细地解释我的问题:

(define (w x)
  (lambda (y z)
    (begin 
      (set! x (+ (* y x) z)) x)))
(define f1 (w 3))
(f1 4 2)
(f1 2 1)

输出是 14、29。这些是 x 的值。

这意味着最初,x=3,y=4,z=2。在第二次调用中,即 (f1 2 1), x=14, y=2,z=1。

我的疑惑:

最初的绑定是如何发生的,为什么是 x=3、y=4 和 z=2?如果它与函数中的 lambda 表达式有关,请详细说明它是如何工作的。我感觉这是我的理解失败的地方。。

接下来,为什么在第二次调用中保留了 x=14 的初始答案,即 (f1 2 1)?

感谢您对此进行调查 :)

【问题讨论】:

    标签: variables binding scheme


    【解决方案1】:

    w 运行时,它会在内部 lambda 之外创建一个 闭包。因为 x 来自内部 lambda 外部,所以 x 存储在该闭包内(在本例中为 f1)。

    所以,f1 内部有一个变量表示 x,它以 3 开头。当您运行 f1 时,它会计算数学然后设置 它自己的 @987654328 @ 14 岁。

    道德是,lambda 不仅仅是代码;它的代码结合了它关闭的变量,例如x

    【讨论】:

    • 嗯,简单的答案是它是由lambda 创建的。一旦lambda 运行,函数就会被Scheme 转换成一个你可能看不到的内部闭包(代码+环境)。
    • 这仍然让我感到困惑。如何控制 lambda 表达式创建的内部变量数量?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多