(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而不是虚空?
答案 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))))