Lambda 这个错误在Scheme中是什么意思;and:and“中的and:bad语法错误;?

Lambda 这个错误在Scheme中是什么意思;and:and“中的and:bad语法错误;?,lambda,functional-programming,scheme,racket,Lambda,Functional Programming,Scheme,Racket,我在:and中遇到以下错误“and:语法错误”: 从本质上讲,我尝试将以下递归调用作为基本情况(在java中等效): a==b&&c==d是(和(eqv?ab)(eqv?cd)),但是您使用的cond是错误的。正确的方法是: (cond (predicate-expression consequence-expression ...) ... (else alternative-expression ...)) 您的尝试如下所示: (cond (null? list1) (

我在:and中遇到以下错误“and:语法错误”:

从本质上讲,我尝试将以下递归调用作为基本情况(在java中等效):


a==b&&c==d
(和(eqv?ab)(eqv?cd))
,但是您使用的
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
。由于
不允许单独计算,而且它是一个宏,因此会出现编译时错误

我不知道你想用这个
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
。同样清楚的是,这可以用
#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

a==b&&c==d
(和(eqv?ab)(eqv?cd))
,但是您使用的
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
。由于
不允许单独计算,而且它是一个宏,因此会出现编译时错误

我不知道你想用这个
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
。同样清楚的是,这可以用
#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