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



Глава 7. Работа с данными: стеки и состояния - часть 7


ПО ПОВОДУ СЛОВ PICK И ROLL.

Некоторые чудаки любят слова PICK и ROLL. Они их используют для доступа к элементам с любого уровня стека. Мы их не рекомендуем. С одной стороны, PICK и ROLL побуждают программиста думать о стеке как о массиве, которым тот не является. Если у Вас настолько много элементов на стеке, что нужны PICK и ROLL, то эти элементы должны были бы быть действительно в массиве. Второе, программист начинает считать возможным обращаться к аргументам, оставленным на стеке определениями более высокого, вызывающего уровня без того, чтобы эти элементы действительно `передавались` в качестве аргументов, что делает определения зависящими от других определений. Это - признак неструктурированности, и это - опасно. Наконец, позиция элемента на стеке зависит от того, что находится над ним, а число вещей над ним может постоянно меняться. К примеру, если адрес находится у Вас в четвертом элементе стека, то можно написать

4 PICK @

для загрузки его содержимого. Но Вам придется писать

( n) 5 PICK !

поскольку при наличии на стеке "n" адрес теперь перемещается в пятую позицию. Подобный код трудно читать и еще труднее переделывать.

ДЕЛАЙТЕ СТЕКОВЫЕ РИСУНКИ.

Когда Вам нужно разрешить некую запутанную стековую ситуацию, лучше ее проработать с помощью карандаша и бумаги. Некоторые люди даже изготавливают формы, типа той, что показана - 211 -

на рис. 7-1. Будучи оформленными подобным образом (вместо закорючек на обороте Вашей телефонной книжки), стековые комментарии становятся приятной внешней документацией.

Рис.7-1. Пример стекового комментария.

---------------------------------------------------------- | | | Имя слова: CMOVE> Программист: LPB Дата: 9/23/83 | | | |----------------------------------------------------------| | Операции | Стековый эффект |Стек возвр| |----------------------------------------------------------| | / / / / / / / / / | s d # | | |----------------------------------------------------------| | ?DUP IF | s d # | | --|----------------------------------------------------------| | | 1- DUP >R | s d #-1 | #-1 | | |----------------------------------------------------------| | | + | s end-of-d | #-1 | | |----------------------------------------------------------| | | SWAP | end-of-d s | #-1 | | |----------------------------------------------------------| | | DUP | end-of-d s s | #-1 | | |----------------------------------------------------------| | | R> | end-of-d s s #-1 | | | |----------------------------------------------------------| | | + | end-of-d s end-of-s | | | |----------------------------------------------------------| | | DO | end-of-d | | | |----------------------------------------------------------| | | -- I C@ | end-of-d last-char | | | |-|--------------------------------------------------------| | | | OVER | end-of-d last-char end-of-d| | | |-|--------------------------------------------------------| | | | C! | end-of-d | | | |-|--------------------------------------------------------| | | -- 1- | next-to-end-of-d | | | |----------------------------------------------------------| | | -1 +LOOP | | | --|----------------------------------------------------------| | | ELSE | s d | | | |----------------------------------------------------------| | | DROP | s | | | |----------------------------------------------------------| | | THEN | x | | --|----------------------------------------------------------| | DROP ; | | | ---------------------------------------------------------- - 212 -




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