2011-02-23 66 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旨在爲您提供一種熟悉語法的簡單途徑。

相關問題