问题

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

unsaved-editor:8:2:define:预期只有一个表达式 函数体,但在下面找到了3个额外的部分:(定义(改进猜测x) (平均猜测(/x猜))

但这段代码可以在Racket或repl.it中运行.

我想知道为什么在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.但学生语言是Scheme的子集,非常有限,所以对初学者来说更容易.它也用于How To Design Programme book.您可以在 https://docs.racket-lang.org/htdp-langs/index.html 上读到更多关于学生语言(实际上有5个).

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

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

为了使代码对学生语言有效,根据级别(开始,中级等),您可以:

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

要么

  • 定义 good-enough, improvesqrt-iter 作为顶级函数。

  相同标签的其他问题

schemeracketsqrtracket-student-languages