Scheme 无法将if转换为cond

Scheme 无法将if转换为cond,scheme,Scheme,我试图理解为什么这两个函数给了我不同的结果。当我将嵌套的if语句转换为conds时,是否有丢失的情况?这些函数应该递归地对列表中的元素进行计数 (define (countall x L) (if (null? L) 0 (if (pair? L) (+ (countall x (car L)) (countall x (cdr L))) (if (eq? x L) 1 0) ) ) ) (countall 'a '(a (

我试图理解为什么这两个函数给了我不同的结果。当我将嵌套的if语句转换为conds时,是否有丢失的情况?这些函数应该递归地对列表中的元素进行计数

(define (countall x L)
    (if (null? L) 0
        (if (pair? L) (+ (countall x (car L)) (countall x (cdr L)))
            (if (eq? x L) 1 0)
        )
    )
)
(countall 'a '(a (a))) ;gives 2

(define (countall x L)
    (cond
        ((null? L) 0)
        ((pair? L) (+ (countall x (car L)) (countall x (cdr L))))
        (else (eq? x L) 1 0)
    )
)
(countall 'a '(a (a))) ;gives 0?

我试着用手一步一步地通过,但我很难找到哪里出了问题。

您的
else
案例包含三种不同的表达式:
(eq?x L)
1
0
。这被视为
begin
块(可以说
cond
的每种情况都会自动启动
begin
块),这意味着所有三个表达式都会按顺序求值,然后返回最后一个表达式的值。因此,无论
x
是否等于
L
,您的
else
案例始终返回
0

(eq?x L)
不应该是
else
块中的表达式,它应该是
条件之一。因此,它应该是:

(cond
    ((null? L) 0)
    ((pair? L) (+ (countall x (car L)) (countall x (cdr L))))
    ((eq? x L) 1)
    (else 0))