Схема - печать на экране - нормальный eval - PullRequest
1 голос
/ 25 апреля 2011

Почему в следующем коде ничего не отображается, когда мы работаем с Normal eval (lazy one).

;;; [Number, Number -> Number]
(define (printing-sub x y)
   (display x)
   (- x y))

;;; [Number, Number -> Number] 
(define (f a b)
   (if (< a 0)
 a
       (f b (printing-sub b a))))
(f 0 0)

Я поясню: на первой итерации мы получим (f 0 (printing-sub 0 0)), на 2-й: (f (prining-sub 0 0) (prining sub (printing sub 0 0) 0). Теперь, на 3-й, мы должны вычислить (printing-sub 0 0), потому что мы хотим знать (if (<a 0). В этой итерации будет напечатано 0.

Чего мне не хватает?

Спасибо.

1 Ответ

0 голосов
/ 26 апреля 2011

Я тоже не знаю, что вы подразумеваете под "обычным eval", но я не понимаю, почему вы ожидаете, что с этим кодом будет распечатано что угодно, кроме 0.Фактически это вызовет бесконечный цикл, выводящий бесконечные нули.

Обратите внимание, что (printing-sub 0 0) всегда будет просто отображать 0 и возвращать 0, потому что (- 0 0) равно 0. Таким образом, в первой итерации вы получаете (f 0 (printing-sub 0 0)), который возвращается обратно к (f 0 0), что вызывает бесконечный цикл.

Другими словами, if всегда оценивается как #f, потому что a никогда не станет ничем иным, кроме 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...