Что происходит в предложении Схемы "cond", когда "else" опущено?
Вопрос
Я нахожусь в процессе изучения Схемы.Недавно я потратил (слишком много!) времени, пытаясь найти ошибку в программе, прежде чем понял, что мне не хватает слова "else" в предложении cond.Но поведение в таких обстоятельствах кажется немного странным.Экспериментируя с условиями с помощью простой программы (ниже), 'whatever' отображается, как и ожидалось, в предложении 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
>
Решение
"else" - это просто синоним слова "истина".Способ чтения 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
и который оценивается как true.(Если вы подумаете об этом, это то, что означает "else" в обычном if-then-else:"верно для всех случаев, когда ни один из предыдущих тестов не был верен".)
Теперь следующая за ним форма выглядит следующим образом (display "whatever\n")
.Это функция, которая отправляет строковый аргумент на консоль и ничего не возвращает, потому что именно это делает display.В другой схеме он может возвращать свое строковое значение, а также выводить его на печать, и в этом случае вы увидите
whatever
"whatever\n"
Другие советы
В функции foo
оператор cond
оценивает display
как условие для проверки. Поскольку действительно существует символ с именем display
, он оценивается как true, поэтому " независимо \ n "
затем оценивается как результат (foo 2) код>.