引自 SICP:
内部定义必须位于过程体的开头。对于运行混合定义及其使用的程序的后果,管理部门概不负责。
正确的代码示例
(define (sqrt x)
(define (good-enough? guess)
(< (abs (- (square guess) x)) 0.001))
(define (improve guess)
(average guess (/ x guess)))
(define (sqrt-iter guess)
(if (good-enough? guess)
guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))
这是否意味着我不能这样做?-
(define (test x)
(define (test2) (* x x))
(test2)
(define (test3) (+ x x))
(test3))
还是暗示我必须在使用它之前声明它?
语言标准 Scheme - R5RS(这里)说的是一样的。我在 Chez Scheme 中运行这段代码并得到:
编辑:
还有一个反例。我在 Chibi Scheme (R7RS) 中运行了相同的代码,现在它可以正常工作了。球拍中的结果相同。但是,定义的顺序很重要。当我跑的时候:
已收到: