ВЛОЖЕННЫЕ КОНСТРУКЦИИ IF...THEN
Имеется возможность помещать оператор IF ... THEN (или IF ... ELSE ... THEN) внутрь другого оператора IF ... THEN. Фактически вы можете создать оператор любой степени вложенности при условии, что каждый оператор IF будет иметь соответствующий оператор THEN.
1 Для специалистов. В Форте нет оператора GOTO. Если вы не можете обойтись без этого оператора немного подождите. К концу книги вам станут ясны отрицательные последствия его буквального применения. Вместо GOTO мы предложим вам средства, позволяющие сделать ваши программы более корректными.
2 Для специалистов. Как вы увидите ниже, существуют лучшие способы выполнения этих действий.
Рассмотрим следующее слово, которое определяет сорт яиц для продажи в зависимости от их размера (очень крупные, крупные и т. д.), по весу в унциях1 на дюжину2: : РАЗМЕР-ЯИЦ ( унций-на-дюжину -- ) DUР 18 < IF . " Брак " ELSE DUP 21 < IF ." Мелкие " ELSE DUP 24 < IF ." Средние " ELSE DUP 27 < IF ." Крупные " ELSE DUP 30 < IF ." Очень крупные " ELSE ." Ошибка " THEN THEN THEN THEN THEN DROP ;
Загрузив однажды слово РАЗМЕР-ЯИЦ, вы можете получать различные результаты, например3: 23 РАЗМЕР-ЯИЦ Средние ок 29 РАЗМЕР-ЯИЦ Очень крупные ок
40 РАЗМЕР-ЯИЦ Ошибка ок
Обратите внимание на некоторые особенности работы со словом РАЗМЕР-ЯИЦ. Все определение является совокупностью вложенных операторов IF ... THEN. Эти операторы вложены друг в друга, как матрешки. Пять слов THEN, расположенных внизу, соответствуют пяти словам IF, расположенным в обратном порядке:
Отметим также, что в конце определения должно быть слово DROP, которое позволит избавиться от лишнего исходного значения.
1 1 унция = 28,3 г. — Примеч. пер.
2 Для работающих за терминалом. Поскольку приведенное определение уже достаточно сложное, рекомендуется вводить его из блока на диске.
3 Для любознательных. Ниже приводится официальная таблица, согласно которой производится определение сорта яиц:
очень крупные 27—30 крупные 24—27 средние 21—24 мелкие 18—21
Можно ли удалить последний оператор DUР с тем, чтобы число убиралось из стека последней операцией сравнении, и оператор DROP? Нет, а почему?
Наше определение организовано таким образом, что оно легко воспринимается человеком. Большинство программирующих на Форте скорее смирятся с потерей памяти в блоке из-за пропусков между словами (блоков много), чем допустят то, чтобы их программы выглядели запутаннее, чем они есть на самом деле,