Dr racket 定义了学生语言中的错误。定义:函数体只需要一个表达式,但发现了 3 个额外的部分

Dr racket define error in student language. define: expected only one expression for the function body, but found 3 extra parts

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

unsaved-editor:8:2: define: expected only one expression for the function body, but found 3 extra parts in: (define (improve guess x) (average guess (/ x guess)))

但是这段代码可以运行在Racket或者repl.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)

您的代码适用于 Scheme/Racket。但是 Student Language 是 Scheme 的一个子集,非常有限,因此对于初学者来说更容易。 如何设计程序 一书中也使用了它。您可以在 https://docs.racket-lang.org/htdp-langs/index.html.

上阅读更多关于学生语言(实际上有五种语言)的信息

define 的情况下有重要的限制:

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

要使您的代码适用于 学生语言,具体取决于 级别(初级、中级等),您可以:

  • 对所有本地定义使用 letrec*local 而不是 define

  • good-enoughimprovesqrt-iter 定义为顶级函数。