Как справиться с этой ошибкой, сгенерированной в упражнении SICP 4.9? - PullRequest
0 голосов
/ 30 декабря 2018

Я выполняю упражнение.4.9 из sicp и пытаюсь реализовать синтаксис выражения «for», который выглядит так, как другие будут видеть в c ++:

(for (((i 0) (j 1))
      (< (+ i j) 10)
      ((i (+ i 1))))
     (display "i:")
     (display i)
     (display "\n")
     (display "j:")
     (display j)
     (display "\n"))

выглядит синтаксиснапример:

(for ((initial-statement) (predicate-statement) (updating-statement)) (for-body))

и то, что я сгенерировал, выглядит так:

((lambda ()
   (define j 1)
   (define i 0)
   (define inner-loop
     (if (< (+ i j) 10)
         (begin (display "i:")
                (display i)
                (display "\n")
                (display "j:")
                (display j)
                (display "\n")
                (set! i (+ i 1))
                (inner-loop))))
   (inner-loop)))

И я получил сообщение о том, что первый вызов inner-loop пытался приблизиться к несвязанной переменной

Мне интересно, как должен выглядеть правильный код, который я должен сгенерировать?

1 Ответ

0 голосов
/ 30 декабря 2018

Как упоминалось в комментариях @Rainer, ваше определение inner-loop неверно.

Функция в схеме определяется следующим образом: (define (name ...args) body)

Или, если аргументов нет:(define (name) body)

Работы следующие:

((lambda ()
   (define j 1)
   (define i 0)
   (define (inner-loop)
     (if (< (+ i j) 10)
         (begin (display "i:")
                (display i)
                (display "\n")
                (display "j:")
                (display j)
                (display "\n")
                (set! i (+ i 1))
                (inner-loop))))
   (inner-loop)))
...