Вы должны знать, что когда вы делаете:
(when test
do-something)
do-something-else
Это всегда будет do-something-else
независимо от того, истинно test
или нет.Итак, что происходит, так это то, что первый раунд max
равен null?
, и он делает (helper (cdr lst) (car lst)))
, и это возвращает ответ.Затем он отбрасывает этот ответ и продолжает до if
с max
, равным null?
, и, в конце концов, терпит неудачу, когда делает (> (car lst) max)
, поскольку null?
не является числом.В сообщении об ошибке говорится, что ожидалось real?
, но оно получило начальное значение '()
.
Поэтому, чтобы намекать вам на дорогу, вы должны иметь одно выражение в дополнение к локальным определениямнапример.
(if test1
result1
(if test2
result2
alternative2))
или
(cond (test1 result1)
(test2 result2)
(else alternative2))
И, конечно, поскольку вы знаете, что аргумент не null?
, вы можете просто позвонить (helper (cdr lst) (car lst))
вместо прохождения пустого списка и удалить when
целикомwhen
и unless
предназначены для побочных эффектов и не совсем для хорошего функционального стиля Scheme.