我目前正在阅读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)
答案 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