1

当我在 Dr Racket 中编写代码时,我收到了错误消息

unsaved-editor:8:2: 定义:函数体只需要一个表达式,但在:(定义(改进猜测 x)(平均猜测(/ x 猜测)))中发现了 3 个额外部分

但是这段代码可以在Racketrepl.it中运行。

我想知道为什么 Dr Racket 会发生错误,我的代码真的错了吗?

我的代码是这样的:

(define (average x y) (/ (+ x y) 2))

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

(define (sqrt1 x)
  (define (good-enough? guess x)
    (< (abs (- (square guess) x)) 0.001))
  (define (improve guess x)
    (average guess (/ x guess)))
  (define (sqrt-iter guess x)
    (if (good-enough? guess x)
        guess
        (sqrt-iter (improve guess x) x)))
  (sqrt-iter 1.0 x))

(sqrt1 9)
4

1 回答 1

1

您的代码适用于 Scheme/Racket。然而,学生语言是 Scheme 的一个子集,受到高度限制,因此对初学者来说更容易。它也用于“如何设计程序”一书中。您可以在https://docs.racket-lang.org/htdp-langs/index.html上阅读有关学生语言的更多信息(实际上有五种)。

如果define存在重要限制:

  1. 函数体中只能有一个表达式。
  2. 在函数体中,你只能使用表达式,而不是定义(所以没有defineinside define)。

要使您的代码对Student Language有效,取决于级别(初级、中级等),您可以:

  • 使用letrec*orlocal代替define所有本地定义

或者

  • 定义good-enough和作为improve顶级sqrt-iter函数。
于 2019-09-27T02:31:23.710 回答