2011-02-23 39 views
0
(define every-aux 
    (lambda(status predicate lst) 
    (cond((null? lst) status) 
     ((cond((equal? (predicate (car lst)) #t) 
       (set! status #t) 
       (every-aux status predicate (cdr lst))) 
       (else (set! status #f) status)))))) 

上面的过程返回void如果谓词与lst中的每个元素都不匹配?我该如何强制方案明确返回#f而不是仅仅是void?

虽然谓词匹配lst的每个元素,但它没有任何问题返回#t。

更改最后一行

(else (set! status #f) status)))))) 

(else (set! status "#f") status)))))) 

返回 “#F” 这样的程序是正确的。

我如何强制计划明确返回#f而不是仅仅是void?

回答

1

@Eli Barzilay

经过一番商议我,我可以看到的解决方案。感谢指针。

(define every? 
    (lambda (predicate list) 
    (if(null? list) "Empty List not allowed." 
     (every-aux? predicate list)))) 

(define every-aux? 
    (lambda (predicate lst) 
    (cond ((null? lst) #t) 
      ((equal? (predicate (car lst)) #t) (every-aux? predicate (cdr lst))) 
      (else #f)))) 
3

您的代码很凌乱:

  • 你有cond内的另一个,但cond适用于多个测试/结果。

  • 没有理由对status进行修改 - Scheme使用按值调用,因此这可能不会做任何您认为它所做的事情。

  • 具体而言,没有理由使用(else (set! status #f) status) - 您可以直接返回#f

  • 实际的原因你的困惑是怪异cond嵌套 - 实际上是用作测试第二cond,所以如果你把它(内cond)返回#f,然后外的整个测试cond变得#f,这意味着它(外部cond)没有得到任何真实的结果,并诉诸返回一个未指定的值(如果这是球拍,那么该值显示为#<void>)。所以如果你把两个cond拼合成一个,你的问题就会消失。

  • 最后,如果你在这个级别有问题,那么你应该考虑使用一些教科书来熟悉这门语言。具体来说,HtDP旨在为您提供一种熟悉语法的简单途径。

相关问题