2013-02-16 68 views
3

我目前正在通过练习1.3的sicp书。这里的问题描述:我尝试用下面的代码错误:无法在空语法环境中绑定名称

(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)))) 

来解决它。当我在麻省理工学院的方案运行它

Define a procedure that takes three numbers as arguments and returns the sum of the squares of the two larger numbers.

,我得到了以下错误:

;Can't bind name in null syntactic environment: large1 #[reserved-name-item 13]

使用谷歌搜索这个错误不会产生很多结果。有人知道我的代码有什么问题吗? (我对Scheme不熟悉)

回答

3

你有太多的括号。如果你在内部定义中取出额外的括号,事情应该会更好。

+0

删除内部圆括号确实有效,但我不明白如何解决问题。 define的语法是(定义)。我认为我必须把所有的东西都归为,因此需要多加一对括号。 – 2013-02-16 07:27:28

+1

@KietTran基本的'define'形式确实是'(define )''。但是您正在使用变体来定义函数,'(定义())'。您有''部分的额外支持。顺便说一下,用于定义函数的第二个变化形式简单地说就是糖:它是'(定义(lambda())'的简写形式。换句话说,“定义函数”意思是定义一个变量,其值是一个'lambda'而不是(说)一个数字或字符串。 – 2013-02-19 02:15:25

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 

因此,身体结构为:

(alpha bravo charlie delta) 

这意味着:“将bravo,charlie和delta作为参数传递给alpha。”

现在,阿尔法被告知,要采取一堆参数,为large1保留的命名空间内,未计提任何说法做出...即方案遇到空句法的环境,它不能将任何变量绑定。

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

[1]“不会出现任何不明确的地方,因为操作符总是最左边的元素,整个组合由圆括号分隔。” http://mitpress.mit.edu/sicp/full-text/sicp/book/node6.html

相关问题