Причина в том, что если вы определяете функцию с синтаксисом:
(define (function arg1 . rest-of-args-as-list) body)
, вы должны вызывать ее всегда с определенным количеством аргументов, но не со списком.Например, предполагая, что вам нужно работать с последовательностью целых чисел, вы можете вызвать ее следующим образом:
(function 1 2 3 4 5)
и внутри тела функции arg1
будет связано с 1
и rest-of-args-as-list
будет привязан к списку (2 3 4 5)
.
Так что в вашем случае, если вы вызовете функцию: (even-odd-filter 1 2 3 4 5)
, x
будет привязан к 1
, intlis
t к (2 3 4 5)
и во второй итерации функция будет вызываться как: (even-odd-filter 1 (3 4 5))
(поскольку x
равно 1
, а cdr
из (2 3 4 5)
равно (3 4 5)
).И вызов его таким образом вызовет ошибку (в DrRacket):
modulo: contract violation
expected: integer?
given: '(3 4 5)
argument position: 1st
other arguments...:
>
Как вы могли бы решить эту проблему?
Возможно определить функцию с одним аргументом, которыйсписок.Вот переписывание вашей функции следующим образом:
(define (even-odd-filter intlist)
(cond ((equal? '() intlist) '())
((equal? '() (cdr intlist)) intlist)
((equal? (modulo (car intlist) 2) (modulo (cadr intlist) 2))
(cons (cadr intlist) (even-odd-filter (cons (car intlist) (cddr intlist)))))
(else (even-odd-filter (cons (car intlist) (cddr intlist))))))