我已经编写了一个程序来计算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'构造在声明块中声明了一个变量?
感谢。
答案 0 :(得分:1)
问题在于评估(second (max first z)))
first
的原因不在范围内。
正如定义所述,该名称仅在let
的正文中可用。此时,运行时尝试解析外部作用域中的名称,该名称未定义,因此出现错误。
注意:嵌套的let
可以解决此问题。