Сообщение об ошибке говорит о том, что вы используете Racket, но вы также выбрали языковой уровень, который отключает полезные сообщения об ошибках, такие как сообщение, которое я получаю, когда копирую вашу программу в буфер на языке ракетки #lang:
if: missing an "else" expression in: (if (< count 4) (if (= (fz-fermat-loop number 1) 0)
(fz-prime (+ number 1) count) ((display number) (fz-prime (+ number 1) (+ count 1)))))
На самом деле, держу пари, что вы используете превосходный язык sicp
Дженса Акселя Соегарда, который является совершенно правильным выбором для работы через sicp .... но, к сожалению, отсутствуют некоторые полезные сообщения об ошибках.
В частности, на языке, который вы используете, в if
может отсутствовать ветвь else
, и если тест не пройден, он молча оценивает специальное значение #.
Oh! Но ждать! У тебя другая проблема ... ты пишешь
((display number) (fz-prime (+ number 1) (+ count 1)))
Могу поспорить, что вы думаете, что если вы просто возьмете два выражения, такие как (display number)
и (fz-prime ...)
, и заключите их в скобки, это означает: «делай первое, потом делай второе». Однако на самом деле это означает, что «первое выражение вычисляется для функции; вызывайте ее с аргументами, полученными в результате вычисления оставшихся выражений», а #void
- это именно то, что возвращает (display ...)
.
Возможно, вы ищете begin
, вот так:
(begin
(display number)
(fz-prime (+ number 1) (+ count 1)))