Что происходит в предложении Схемы "cond", когда "else" опущено?

StackOverflow https://stackoverflow.com/questions/813587

  •  03-07-2019
  •  | 
  •  

Вопрос

Я нахожусь в процессе изучения Схемы.Недавно я потратил (слишком много!) времени, пытаясь найти ошибку в программе, прежде чем понял, что мне не хватает слова "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) .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top