Во-первых, сделайте отступ в своем коде правильно:
(define (mylength alist cnt)
(if (null? alist) ;
0 ; this section is wasted because
(if (= (modulo cnt 2) 0) ; it's not the last expression
(+ (car alist) (mylength (cdr alist) (+ cnt 1))))) ;
(if (= (modulo cnt 2) 1) ; this if is the last expression, but
(mylength (cdr alist) (+ cnt 1)))) ; if it's false you get #<void>
Вы не должны иметь if
выражений, которые не имеют как истинных, так и ложных ветвей.Вы должны помнить, что это не C, и все, что не является последним выражением, будет выполнено, а затем выброшено.
Объедините два последних оператора if в один оператор if
:
(define (mylength alist cnt)
(if (null? alist)
0
(if (= (modulo cnt 2) 0)
(+ (car alist) (mylength (cdr alist) (+ cnt 1)))
(mylength (cdr alist) (+ cnt 1)))))
Редактировать: Когда я писал «все, что не является последним выражением, будет выполняться, а затем выбрасываться», я имел в виду:
(begin
(+ 2 2)
(+ 4 1)
(+ 1 0)
(+ 1 1)) => 2
(let ((x 5))
(add1 x)
(+ x 2)
(* x 2)) => 10
((lambda ()
(if #t 3)
(if #f 0 4)
(if #t 2))) => 2