这个错误在Scheme中意味着什么:"以及:错误的语法:和"?

时间:2017-04-15 17:26:05

标签: lambda functional-programming scheme racket

我收到以下错误"以及:错误的语法:和":

(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);

1 个答案:

答案 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