«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"