我收到以下错误"以及:错误的语法:和":
(define test (lambda(list1 a b c d)
(cond (null? list1)
(and (eqv? a b) (eqv? c d))
(two-subsets (cdr list1) a b c d))))
(test '(1 2 3 4) 0 0 0 0)
基本上我试图将以下递归调用作为基本情况(在java中等效):
return (a == b && c == d);
答案 0 :(得分:2)
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?
返回#t
时它不是#f
1}}。它还清楚这可以用#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