错误:无法在null语法环境中绑定名称

时间:2013-02-16 07:03:17

标签: scheme sicp

我目前正在阅读sicp书的练习1.3。以下是问题的描述:

  

定义一个过程,该过程将三个数字作为参数并返回   两个较大数字的平方和。

我尝试使用以下代码解决它

(define (square x) (* x x))

(define (sq2largest a b c)
        ((define large1 (if (> a b) a b)) 
         (define small  (if (= large1 a) b a))
         (define large2 (if (> c small) c small))
         (+ (square large1) (square large2))))

当我在mit-scheme中运行它时,我收到以下错误:

  

;无法在null语法环境中绑定名称:large1   #[reserved-name-item 13]

Google搜索此错误不会产生太多结果。有谁知道我的代码有什么问题? (我不熟悉Scheme)

2 个答案:

答案 0 :(得分:3)

你的括号太多了。如果你在内部定义周围取出额外的括号,那么事情应该会好很多。

答案 1 :(得分:3)

我会尝试分解你的sq2largest程序的结构:

基本结构是:

(define (sq2largest a b c)
    ; Body)

你写的身体是:

((define large1 (if (> a b) a b)) ; let this be alpha
 (define small  (if (= large1 a) b a)) ; let this be bravo
 (define large2 (if (> c small) c small)) ; let this be charlie
 (+ (square large1) (square large2)) ; let this be delta) ; This parentheses encloses body

因此,Body的结构为:

(alpha bravo charlie delta)

其转换为:“将bravo,charlie和delta作为alpha的参数传递。”

现在,alpha被告知要在为large1保留的命名空间中使用一堆参数但是,没有为任何参数做出任何规定...即方案遇到一个空的句法环境,在那里它不能绑定任何变量。

括号在Scheme(以及大多数,如果不是全部,Lisps)中都很重要,因为它们定义了过程的范围并强制执行[1]操作的应用顺序。

[1]“不会出现歧义,因为运算符始终是最左边的元素,整个组合由括号分隔。” http://mitpress.mit.edu/sicp/full-text/sicp/book/node6.html