【问题标题】:I can't understand scheme define, lambda, let clearly我无法理解方案定义,lambda,让我们清楚
【发布时间】:2013-04-07 05:50:21
【问题描述】:

最近开始学习方案语言

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

(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*,但我不知道如何解决这个问题。 我该如何解决?请评论并详细说明

【问题讨论】:

  • 就我个人而言,我什至不记得 let 或 let* 是什么意思了,所以我不会讨论这个问题。但是由于 Michael Scott 的书涵盖了如此多的语言,我想您可能手头没有 Scheme 解释器。这个看起来不错:repl.it/languages/Scheme(只需按 Ctrl-Enter 即可评估您的表情)抱歉,我帮不上忙。
  • 如果你正在学习Scheme,我会说安装一个漂亮、简单和完整的环境是值得的,比如racket-lang.org
  • 我已经在 putty 上使用了 mit-scheme。但是当我执行该代码时,它会打印值:我不知道为什么
  • “浅绑定和深绑定”是什么意思?
  • 啊,如果在该代码中使用浅绑定的动态作用域和使用深绑定的动态作用域会打印什么

标签: scheme


【解决方案1】:

过程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 的任何其他绑定。

【讨论】:

  • 感谢您的解释。但我有点困惑“C 将因此调用 D(绑定到参数 P)”是什么意思。
  • B 用参数 D 调用 C,在 C 内部绑定到 P。然后调用 P,所以这实际上调用了 D。
猜你喜欢
  • 2022-07-24
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
相关资源
最近更新 更多