Код явно неверный - ваш %2
предполагает инфиксную нотацию, где Схема использует префиксную нотацию. Синтаксис вашего if
также неверен - для if
, else
неявно (т.е. у вас есть if condition true-expression false-expression
. В этом случае вы пытаетесь вернуть #t с одной ноги и # f с другой ноги - это совершенно не нужно. Вы можете просто вернуть выражение, которое вы тестировали в if
.
Редактировать: еще одна деталь - вы должны действительно переименовать это в что-то вроде even-length?
. Даже если я предположу, что это предикат, имя типа even
будет означать для меня, что (even 3)
должен возвращать #f
, а (even 4)
должен возвращать #t
- но в этом случае ни то, ни другое не работает.
Edit2: Так как mquander уже дал вам одну версию кода, я думаю, что еще одна не повредит. Я бы написал так:
(define (even-length? L) (even? (length L)))
Мне не очень нравится использовать строчные буквы 'l' (но сам по себе), поэтому я набрал их заглавными буквами. Поскольку even?
встроен, я использовал его вместо того, чтобы находить остаток.
Запуск этого дает:
> (even-length? `(1 2 3))
#f
> (even-length? `(1 2 3 4))
#t
>
Это отличается от того, что вы имели в одном отношении: длина пустого списка равна 0, что считается четным числом, поэтому:
(четная длина? `())
дает # т.