最多2个SICP运动的平方和

时间:2012-03-13 20:32:55

标签: scheme

我已经编写了一个程序来计算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)

[VM ERROR遇到!]变量未在词法环境中定义 FIRST

虽然我确实理解错误是因为解释器无法识别变量'FIRST',但我不明白为什么?

根据SICP的定义:

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

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

感谢。

1 个答案:

答案 0 :(得分:1)

问题在于评估(second (max first z))) first的原因不在范围内。

正如定义所述,该名称仅在let的正文中可用。此时,运行时尝试解析外部作用域中的名称,该名称未定义,因此出现错误。

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