Проблема в том, что порядок условий имеет значение : в выражении and
условия оцениваются в порядке слева направо, если одно условие - false
, тогда другие условия пропущено (оценка короткого замыкания).
Ваш ввод представляет собой список списков, поэтому вы должны проверить сначала , если текущий элемент является фактическим списком - в противном случае вы попытаетесь взять length
объекта, который не является списком (число 3
в вашем примере), что является ошибкой.
Между прочим: код можно упростить, на самом деле вы этого не делаете нужно использовать if
, просто верните значение условия:
(define is1?
(lambda (tuple)
(and (list? tuple) ; you must ask this first!
(= 2 (length tuple))
(= 1 (- (cadr tuple) (car tuple))))))