a == b && c == d 是 (and (eqv? a b) (eqv? c d)),但是您使用 cond 错误。正确的做法是:
(cond
(predicate-expression consequence-expression ...)
...
(else alternative-expression ...))
您的尝试如下所示:
(cond
(null? list1)
(and (eqv? a b) (eqv? c d))
(two-subsets (cdr list1) a b c d))))
这使得null? 成为谓词,list1 成为结果。由于null? 是一个过程,它不能是#f,因此您的cond 应该总是返回list1。因为and 不允许单独评估并且它是一个宏,所以会出现编译时错误。
我不知道你想用 cond 做什么,因为如果我添加括号,我会得到:
(cond
((null? list1) #t)
((and (eqv? a b) (eqv? c d)) #t)
(else (two-subsets (cdr list1) a b c d))))))
这是基于没有后果的cond 术语返回其真实值,并且null? 和eqv? 在不是#f 时都返回#t。同样清楚的是,这可以替换为#t,因为无论参数是什么,这始终是结果。
cond 不是原语,它只是将您的代码转换为if。只是为了好玩,您原来的 cond 会被翻译成这样:
(if null?
list1
(if and
(begin
(eqv? a b) ; dead code
(eqv? c d))
(if two-subsets
(begin
(cdr list1) ; dead code
a ; dead code
b ; dead code
c ; dead code
d)
'undefined-return-value))) ; no else clause