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


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


Наконец наши нейроны дают нужное соединение. Мы смотрим вновь на только что определенное слово +LOAD:

: +LOAD ( смещение -- ) BLK @ + LOAD ;

Это слово, +LOAD, должно было бы и делать такую работу. Все, что нам нужно написать - это:

: +THRU ( низ верх ) 1+ SWAP DO I +LOAD LOOP ;

Таким образом мы не создали более эффективной версии, поскольку работа BLK @ + будет проделываться в каждом проходе цикла. Однако у нас получился более чистый, более простой концептуально и более читабельный кусок кода. В данном случае неэффективность незаметна, поскольку проявляется один раз при загрузке каждого блока. Перепроектирование или переосмысливание задачи должно быть тем путем, который нам следует избирать всякий раз, когда дела становятся плохи.

ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ.

Большинство задач могут быть перегруппированы так, что лишь несколько аргументов на стеке нужны для них одновременно. Однако бывают ситуации, когда ничего сделать не удается. Вот пример наихудшего случая. Пусть у нас имеется слово ЛИНИЯ, которое проводит линию между двумя точками, определенными их координатами в следующем порядке:

( x1 y1 x2 y2 )

где x1,y1 представляют координаты одного конца, а x2,y2 - противоположного конца линии. Теперь Вам надо написать слово по имени [РАМКА], которое берет четыре аргумента в таком порядке:

( x1 y1 x2 y2 )

где x1 y1 представляют координаты верхнего левого угла, а x2 y2 - нижнего правого угла рамки. У Вас не просто четыре элемента на стеке, но каждый из них должен использоваться более одного раза при рисовании линий от точки до точки. Хотя мы и используем стек для получения этих - 208 -

четырех аргументов, алгоритм рисования сам по себе не соответствует природе стека. Если Вы торопитесь, то, быть может, лучшим выходом было бы использовать простое решение:

VARIABLE ВЕРХ ( координата y - вершина рамки) VARIABLE ЛЕВО ( " x - левая сторона) VARIABLE НИЗ ( " y - низ рамки) VARIABLE ПРАВО ( " x - правая сторона) : [РАМКА] ( x1 y1 x2 y2 ) НИЗ ! ПРАВО ! ВЕРХ ! ЛЕВО ! ЛЕВО @ ВЕРХ @ ПРАВО @ ВЕРХ @ ЛИНИЯ ПРАВО @ ВЕРХ @ ПРАВО @ НИЗ @ ЛИНИЯ ПРАВО @ НИЗ @ ЛЕВО @ НИЗ @ ЛИНИЯ ЛЕВО @ НИЗ @ ЛЕВО @ ВЕРХ @ ЛИНИЯ ;




Начало  Назад  Вперед