Ваш случай else
содержит три различных выражения: (eq? x L)
, 1
и 0
. Это рассматривается как блок begin
(можно сказать, что каждый случай cond
автоматически запускает блок begin
), что означает, что все три выражения вычисляются по порядку, а затем возвращается значение последнего выражения. Таким образом, ваш else
регистр всегда возвращает 0
независимо от того, равен x
L
или нет.
(eq? x L)
не должно быть выражением в блоке else
, это должно быть одно из условий вашего cond
. Так и должно быть:
(cond
((null? L) 0)
((pair? L) (+ (countall x (car L)) (countall x (cdr L))))
((eq? x L) 1)
(else 0))