Способ мышления-Форт




Глава 8. Минимизация структур управления - часть 12


Однако в конструкции Сендерсона можно выходить из цикла, перепрыгивая `через` конец цикла и продолжая исполнение после ELSE. Имеются две возможные точки продолжения. Это "хуже структурировано", если можно так выразиться. И в то же время определение всегда закончится точкой с запятой и вернет управление вызвавшему его слову. В этом смысле оно хорошо структурировано; модуль имеет одну точку входа и одну точку выхода. Когда Вы хотите выполнить некий код только если `не` покинули цикл преждевременно, использовать такой подход кажется самым естественным. (Мы рассмотрим пример этому в последующем разделе "Использование структурированных выходов".)

------------------------------------------------------------ СОВЕТ Предпочитайте счетчики перед проверками на окончание. ------------------------------------------------------------

Форт поддерживает формат строк, содержащих длину в первом байте. Это упрощает печать, перемещение и вообще любые действия со строками. При адресе и счетчике, лежащих на стеке, определение слова TYPE может быть таким:

: TYPE ( a #) OVER + SWAP DO I C@ EMIT LOOP ;

(Хотя TYPE в действительности обязано быть написанным в машинных кодах.) Это определение не использует впрямую условного оператора. LOOP на самом деле скрывает в себе такой оператор, поскольку каждый цикл проверяет индекс и делает возврат на DO, если он еще не достиг предела. - 251 -

Если бы использовались символы-ограничители, скажем, ASCII нуль, то определение должно было бы быть написано как:

: TYPE ( a) BEGIN DUP C@ ?DUP WHILE EMIT 1+ REPEAT DROP ;

Нужна дополнительная проверка при каждом прохождении цикла. (WHILE является оператором условного перехода.) Замечание по оптимизации: использование слова ?DUP с точки зрения времени исполнения накладно, поскольку оно само содержит дополнительную проверку. Более быстрым было бы определение:

: TYPE ( a) BEGIN DUP C@ DUP WHILE EMIT 1+ REPEAT 2DROP ;

Стандарт '83 применил этот принцип в слове INTERPRET, которое ныне воспринимает счетчик вместо поиска символа-ограничителя.


Содержание  Назад  Вперед