问题描述
我收到以下错误"and::中的语法不正确":
(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);
推荐答案
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