#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