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

#if-statement #scheme #sicp

#if-statement #схема #sicp

Вопрос:

Упражнение 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 формы?

Ответ №1:

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

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

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

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

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

Комментарии:

1. Языковая спецификация для Scheme допускает оба варианта, if <test> <consequent> <alternate> а if <test> <consequent> о последнем говорится: «Если <test> выдает значение false и <alternate> не указан, то результат выражения не указан». Т.Е. Разработчик схемы может возвращать все, что захочет (это может быть false илиспециальное unspecified значение, но оно также может быть 42 или процедурой).

2. Поведение, описанное в главе 4, относится к конкретной реализации схемы, то есть к метакруговому вычислителю, который построен в этой главе, он не претендует на описание поведения схем в целом.

3. Возможно, также стоит отметить, что результат if in Ex1.22 не используется. Процедура вызывается только для ее побочного эффекта — печати. Главы 1 и 2 обычно избегают процедур с побочными эффектами, пока они не будут подробно рассмотрены в главе 3