Как SICP предполагает работу форм (if) без их альтернативной (else) части?

Упражнение 1.22 SICP содержит следующую процедуру:

(define (start-prime-test n start-time)
  (if (prime? n)
      (report-prime (- (runtime) start-time))))

На мой взгляд, форма if не имеет альтернативной ветви. Я вижу только if (test) (consequent). Где SICP вводит эту форму? if представлен в Раздел 1.1.6, но я не вижу в этом разделе ничего, что касалось бы if случаев без else. Возможно, я мог догадаться о предполагаемом поведении из определения cond в том же разделе, но указанный раздел имеет сноска, которая показывает, что они разные. Итак, как я могу сказать, как SICP намеревается работать с такими if формами?


person J. Mini    schedule 09.11.2020    source источник


Ответы (1)


Изучив указатель, я обнаружил два места, где он определен: Сноска 29 в разделе 3.3 и Сноска 10 в Разделе 4.1. Цитирую оба:

Обратите внимание, что выражение if в этой процедуре не имеет ‹ альтернативного › выражения. Такой «однорукий оператор if» используется для принятия решения о том, следует ли что-то делать, а не для выбора между двумя выражениями. Выражение if возвращает неопределенное значение, если предикат ложный и нет альтернативы ‹ ›.

Значение выражения if, когда предикат ложен и альтернативы нет, в схеме не указано; здесь [в The Metacircular Evaluator] мы решили сделать его ложным. Мы будем поддерживать использование переменных true и false в оцениваемых выражениях, связывая их в глобальной среде. См. раздел 4.1.4.

Я признаю, что мне следовало подумать о том, чтобы обратиться к индексу, прежде чем обращаться к Stack Overflow. Очевидно, интернет прогнил мой мозг. Однако я надеюсь, что на этот вопрос есть лучший ответ, чем тот, который я дал здесь. Это определено двумя главами после того, как вам это нужно, даже если оно правильное, не очень приятное.

С другой стороны, комментарии codybartfast справедливо указывают на то, что вам не нужно понимать процедуру, описанную в упражнении 1.22, чтобы решить вопрос. На самом деле, решив это самостоятельно, становится ясно, что я очень много думал об этом. Ее можно решить менее чем за пять строк. Кроме того, также было указано, что, хотя первые несколько слов соответствуют стандарту для Scheme, вторая цитата выше в основном говорит о реализации, которая создается в главе 4, а не о чем-либо, что, как ожидается, будет использоваться или использоваться. понятно в предыдущих главах.

person J. Mini    schedule 09.11.2020
comment
Спецификация языка для Scheme допускает как if <test> <consequent> <alternate>, так и if <test> <consequent> относительно последнего, в нем говорится: Если ‹test› дает ложное значение, а ‹alternate› не указан, то результат выражения не указан. Т. е. разработчик схемы может вернуть все, что захочет (это может быть false или специальное значение unspecified, но также может быть 42 или процедура). - person codybartfast; 10.11.2020
comment
Поведение, описанное в главе 4, является поведением конкретной реализации схемы, т. е. метациклического оценщика, созданного в этой главе, он не претендует на описание поведения схем в целом. - person codybartfast; 10.11.2020
comment
Также стоит заметить, что результат if в примере 1.22 не используется. Процедура вызывается только из-за ее побочного эффекта - печати. В главах 1 и 2 обычно избегают процедур с побочными эффектами, пока они не будут подробно описаны в главе 3. - person codybartfast; 10.11.2020