Как я могу заставить схему возвращать #f явно вместо просто void? - PullRequest
0 голосов
/ 23 февраля 2011
(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?

Нет проблем с возвратом #t, хотя, если предикат соответствует каждому элементу lst.

Изменение последней строки на

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

на

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

возвращает "#f", поэтому процедура верна.

Как заставить схему вернуть #f явно вместо void?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2011

Ваш код очень грязный:

  • У вас есть cond внутри другого, но cond предназначен для нескольких тестов / результатов.

  • Нет никаких оснований для изменения status - Схема использует вызов по значению, поэтому, скорее всего, это не делает того, что вы думаете.

  • В частности, нет смысла использовать (else (set! status #f) status) - вы можете просто вернуть #f напрямую.

  • Фактическая причина вашего замешательства - странное cond вложение - второй cond фактически используется как тест , поэтому, если вы его сделаете (внутренний cond) ) возвращает #f, тогда весь тест внешнего cond получает #f, что означает, что он (внешний cond) не получил никакого истинного результата, и прибегает к возврату неопределенного значения (и если это Racket, то это значение отображается как #<void>). Поэтому, если вы сведете два cond в один, ваша проблема исчезнет.

  • Наконец, если у вас возникли проблемы на таком уровне, вам следует рассмотреть возможность использования какого-нибудь учебника для ознакомления с языком. В частности, HtDP предназначен для облегчения знакомства с синтаксисом.

1 голос
/ 24 февраля 2011

@ Эли Барзилай

После некоторых размышлений я смог найти решение.Спасибо за указатели.

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