Что происходит в предложении схемы «cond», когда «else» опущено? - PullRequest
9 голосов
/ 02 мая 2009

Я в процессе изучения схемы. Недавно я потратил (слишком много!) Времени на поиск ошибки в программе, прежде чем понял, что пропускаю слово «else» в предложении cond. Но поведение в таких обстоятельствах кажется немного странным. Поэкспериментируя с условиями простой программы (ниже), «все» отображается так, как ожидалось в предложении else, но также отображается, но без «else», отображается с окружающими двойными кавычками и не интерпретируемыми строка печатается буквально. Кто-нибудь может объяснить мне, что происходит? ТИА.

   (define (foo x)
    (cond ((eq? x 0) (display "zero\n"))
          (display "whatever\n")))

   (define (bar x)
    (cond ((eq? x 0 ) (display "zero\n"))
          (else (display "whatever\n"))))

In the repl window:
Welcome to DrScheme, version 4.1.5 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
> (foo 0)
zero
> (bar 0)
zero
> (foo 2)
"whatever\n"
> (bar 2)
whatever
> 

Ответы [ 2 ]

17 голосов
/ 02 мая 2009

«else» - это просто синоним «true». Способ чтения cond - это серия тестов, где первый истинный тест вызывает оценку этой формы.

(cond  ( (test) (do this) )
       ( (test) (do this) ) )

Вот ваш первый

 (cond ((eq? x 0) (display "zero\n"))
        (display "whatever\n")))

Конд смотрит на (eq? x 0) и определил, что это неверно. Следующий пункт - (display "whatever\n"). Он смотрит на display, и поскольку display не nil, это правда. Затем он оценивает строку "whatever\n", которая просто оценивает себя. Таким образом, значение cond тогда равно "whatever\n".

Теперь вот вам второй:

(cond ((eq? x 0 ) (display "zero\n"))
       (else (display "whatever\n"))))

Здесь первый тест ложен, и он переходит ко второму, который является else и который оценивается как истинный. (Если вы подумаете об этом, то в обычном if-then-else это означает «else»: «верно для всех случаев, когда ни один из предыдущих тестов не был верным».)

Теперь следующая за ним форма - (display "whatever\n"). Это функция, которая отправляет строковый аргумент на консоль и ничего не возвращает, потому что это то, что происходит с дисплеем. В другой схеме он может вернуть свое строковое значение, а также распечатать его, и в этом случае вы увидите

whatever
"whatever\n"
9 голосов
/ 02 мая 2009

В функции foo оператор cond оценивает display как условие для проверки. Поскольку действительно существует символ с именем display, он принимает значение true, поэтому "whatever\n" затем оценивается как результат (foo 2).

...