2012-03-13 69 views
1

我写了一个程序来计算第一的平方和的总和第二个最大的3个数字如下...之和的3 SICP练习

(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时,每个名称都与相应表达式的值相关联。 let的主体用 进行评估,这些名称绑定为局部变量

这是否意味着“让”构造在声明块中声明变量?

谢谢。

回答

1

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

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

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

+0

啊,我跳下文本 “变量值计算的让利外读下一段的gun..should。这一点很重要,当表达式 本地变量提供值取决于变量与 本地变量本身具有相同的名称“ – sachinrahulsourav 2012-03-13 20:55:06

+1

经验丰富的Schemers/Lispers将使用'let *'而不是嵌套'let's。 (let *'是一个只扩展到嵌套'let's的宏。) – 2012-03-13 21:18:06

+0

好吧,我用let *构造: '(define(max2of3 xyz) (let *((first(max xy))当我打电话给我时(max2of3 3 5 2),它给了我一个结果50吗?其评估(+ 25 25)莫名其妙.. 此代码有什么问题? – sachinrahulsourav 2012-03-13 22:07:06