Доктор Ракетка определит ошибку на студенческом языке.define: ожидалось только одно выражение для тела функции, но найдено 3 дополнительные части - PullRequest
1 голос
/ 27 сентября 2019

Когда я пишу код в Dr Racket, я получаю сообщение об ошибке

unsaved-editor: 8: 2: define: ожидал только одно выражение для тела функции, но нашел 3 дополнительные части в:(определить (улучшить предположение x) (среднее предположение (/ x предположение)))

Но этот код может выполняться в Racket или repl.it .

Я хочу знать, почему в докторе Ракете происходит ошибка и действительно ли мой код неверен?

Мой код такой:

(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)

1 Ответ

1 голос
/ 27 сентября 2019

Ваш код в порядке для схемы / ракетки.Однако Student Language - это подмножество Схем, строго ограниченное, так что для начинающих это проще.Он также используется в Как разрабатывать программы книга.Вы можете узнать больше о студенческих языках (на самом деле их пять) на https://docs.racket -lang.org / htdp-langs / index.html .

В случае defineСуществуют важные ограничения:

  1. В теле функции может быть только одно выражение.
  2. В теле функции вы можете использовать только выражения, а не определения (поэтому define внутри define).

Чтобы сделать ваш код действительным для Язык ученика , в зависимости от Уровень (Начальный, Средний и т. Д.), Вы можете:

  • используйте letrec* или local вместо define для всех локальных определений

или

  • define good-enough, improveи sqrt-iter как функции верхнего уровня.
...