该错误在:"和:中表示语法错误是什么意思?

人气:801 发布:2022-10-16 标签: lambda functional-programming scheme racket

问题描述

我收到以下错误"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

117