【问题标题】:sum of squares of max 2 of 3 SICP exercise3 个 SICP 练习的最大 2 个平方和
【发布时间】:2012-03-13 20:32:55
【问题描述】:

我已经编写了一个程序来计算 3 个数字中的第一个和第二个最大的平方和,如下所示...

    (define (max2of3 x y z)
      (let ((first (max x y))
            (second (max first z)))
        (+ (* first first) (* second second))))

但是当我执行它时出现错误...

[2](加载“max2of3”) 好的 [3] (max2of3 1 2 3)

[遇到虚拟机错误!] 词法环境中未定义变量 第一

虽然我确实理解错误是由于解释器无法识别变量“FIRST”而引起的,但我不明白为什么?

根据 SICP 的定义:

let 表达式的第一部分是名称-表达式对的列表。当评估 let 时,每个 name 与相应表达式的值相关联。 let 的主体被评估为 这些名称绑定为局部变量

这是否意味着'let'构造在声明块中声明了一个变量?

谢谢。

【问题讨论】:

    标签: scheme


    【解决方案1】:

    问题是为什么评估 (second (max first z))) first 不在范围内。

    正如定义所说,该名称仅在let 的正文中可用。此时,运行时会尝试在外部范围内解析名称,但未定义名称,因此会出现错误。

    注意:嵌套的let 可以解决这个问题。

    【讨论】:

    • 是的,我开枪了..应该阅读文本中的下一段“变量的值是在 let 之外计算的。当为局部变量提供值的表达式依赖时,这很重要在与局部变量本身同名的变量上”
    • 经验丰富的 Schemers/Lispers 将使用 let* 而不是嵌套的 lets。 (let* 是一个宏,它只是扩展为嵌套的lets。)
    • 好的,我使用了 let* 构造:(define (max2of3 x y z) (let* ((first (max x y)) (second (max first z))) (+ (* first first) (* second second)))) 但是当我调用 (max2of3 3 5 2) 时它给了我一个结果 50?它以某种方式评估为 (+ 25 25).. 这段代码有什么问题?
    • 如果您不确定,只需替换,您会看到 ;)
    猜你喜欢
    • 2012-09-04
    • 2012-07-05
    • 2011-11-05
    • 2017-02-03
    • 2010-12-26
    • 2012-12-15
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多