我如何强制计划明确地返回#f而不是虚空?

时间:2011-02-23 18:12:43

标签: scheme return-value

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

如果谓词与lst中的每个元素都不匹配,则上面的过程返回void

如果谓词匹配lst的每个元素,那么返回#t没有任何问题。

将最后一行更改为

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

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

返回“#f”,所以程序正确。

如何强制方案明确返回#f而不是虚空?

2 个答案:

答案 0 :(得分:3)

你的代码非常混乱:

  • 您在另一个内部有cond,但cond适用于多个测试/结果。

  • 没有理由让status修改过 - Scheme使用call-by-value,所以这可能不会做你认为的任何事情。

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

  • 您混淆的实际原因是奇怪的cond嵌套 - 第二个cond实际上用作测试,所以如果你做了(内部cond)返回#f,然后外部cond的整个测试得到#f,这意味着它(外部cond)没有'得到任何真实的结果,并转而返回一个未指定的值(如果这是Racket,则该值显示为#<void>)。因此,如果您将两个cond展平为一个,那么您的问题就会消失。

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

答案 1 :(得分: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))))