【问题标题】:What does this error mean in Scheme: "and: bad syntax in: and"?这个错误在 Scheme 中是什么意思:“and: bad syntax in: and”?
【发布时间】:2017-09-11 17:57:35
【问题描述】:

我收到以下错误“and: bad syntax in: 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);

【问题讨论】:

    标签: lambda functional-programming scheme racket


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 2015-05-09
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多