Итак, продолжаем наше представление!
После того, как на нашей ARENE объявили жонглера-эквилибриста с 11 предметами, публика было оживилась. Однако выехавший артист на одностековом, тьфу, одноколесном велосипеде всего-навсего держал в руках стопку некрупных кубиков, которые благополучно свалил в корзину с надписью WINAPI, едва доехав до нее. Где, собственно, жонглирование? Так бы спросили старожилы цирка, но их, увы, немного. Были еще намеки на укрощение хищников, а такие ожидания обманывать нельзя. Поэтому следующим номером на арену был выволочен пенек с чем-то круглым и мохнатым в центре. Очевидно, он должен был с этого пенька куда-то спрыгнуть. Однако же все знают, почему кошачьи бега непопулярны. Вот сами подумайте, оно им надо? Лапы, между прочим, не казенные. Поэтому для полноты картины место прыжка надо бы обозначить.
Обозначим же хищнику место прыжка какой-нибудь рамкой. Ну например такой:
BOX // x1, y1, x2, y2, color --
Хищник вытянул из-под пенька пару табличек HLINE и VLINE // x, y, length, color Одна табличка была вытянута по горизонтали, а другая по вертикали, что наводило на определенные мысли. И вот тут-то работникам арены пришлось пожонглировать! Итак, нам теперь надо уложить x1, y1, x2-x1, color, чтобы организовать верхнюю планочку. Не вопрос! Правда, DUP и OVER оказались с коротенькими лапками и до x1 не достают. Придется брать PICK.
Итак, 4 PICK вытянул нам x1. Теперь надо вытянуть еще y1. Фокус несложный, но тут нам поможет все тот же 4 PICK. Юные зрители на трибунах слегка ахнули, но ведь поверх всех параметров уже уложен x1, так что нумерация сместилась. Взрослых зрителей таким фокусом, понятно, не проймешь. А что дальше? А не поверите, для x2 надо еще раз 4 PICK. А дальше будет x1... и вот тут придется притормозить и пересчитать, что у нас там на стеке навалено. Оказывается, надо аж 7 PICK, а за ним уже можно ставить минус, чтобы узнать длину линии. Ну и наконец-то вытягиваем COLOR... эээ... "3 PICK" - промурчал с пенька хищник, и наконец кучка была скомпонована.
Покопавшись так еще 3 раза, оказалось возможным выложить вот такое:
Код:
: BOX // X1, Y1, X2, Y2, COLOR
4 PICK 4 PICK 4 PICK 7 PICK - 3 PICK HLINE
4 PICK 4 PICK 3 PICK 6 PICK - 3 PICK VLINE
4 PICK 2 PICK 4 PICK 7 PICK - 3 PICK HLINE
2 PICK 4 PICK 3 PICK 6 PICK - 3 PICK VLINE
DROP DROP DROP DROP DROP
;
И оно даже работает. Образовалась такая симпатичная рамочка, через которую можно бы и прыгнуть. Собственно, раз некруглые хищники прыгают через круглый обруч, почему бы круглому не прыгнуть через что-то некруглое? Однако, несмотря на дежурные фоновые выкрики "впервые на арене Форт использован по назначению", хищник на пеньке даже ухом не повел. Весь его вид как бы говорил "не буду я через эту страсть прыгать". А что такое это ваше 7 PICK? Где гарантия, что при пролете не задену ушами? А если, к примеру улыбнуться в полете во всю хищническую пасть? Вы-то броситесь переделывать вашу рамочку, поправите не тот PICK, а мне отдуваться. Вдруг раскрытой пастью кого перекушу? Вон, на трибунах EuroFIG сидит. Конечно, если кого из них слопать, они не заметят. Им вообще не интересно, сколько вокруг них реальных фортеров, но почему чисткой их рядов должны заниматься мирно спящие на пеньке?
Придется навесить ярлычки:
Код:
: BOX // X1, Y1, X2, Y2, COLOR
// 4 3 2 1 0
FRAME{
ARG4 @ ARG3 @ ARG2 @ ARG4 @ - ARG0 @ HLINE
ARG4 @ ARG3 @ ARG1 @ ARG3 @ - ARG0 @ VLINE
ARG4 @ ARG1 @ ARG2 @ ARG4 @ - ARG0 @ HLINE
ARG2 @ ARG3 @ ARG1 @ ARG3 @ - ARG0 @ VLINE
}FRAME
DROP DROP DROP DROP DROP
;
Что делает FRAME{ ? Оно запоминает на специальном стеке текущую глубину стека данных. }FRAME, соответственно, убирает число с этого специального стека. Благодаря запомненной глубине ARG0 всегда будет давать адрес того числа, которое было на вершине в момент выполнения FRAME{. Таким образом, становится понятен смысл второй строки комментариев. Теперь встроенное слово ARG4 всегда дает x1, и так далее.
На эту картину хищник с пенька слегка заинтересованно повел ухом. Текст не то чтобы стал меньше или сильно понятнее, однако теперь стало возможным хотя бы отследить глазками соответствие номеров аргументов и их смысла. Вот еще бы имена им дать понятные, а то ведь говорят, что ARG4 это x1... поди проверь!
Покопавшись в пеньке, хищник подпихнул лапой еще пачку словечек. Из них можно соорудить рамку того же типа, но процесс как-то более симпатичен.
Код:
: BOX
LOC[
QUAN X1 QUAN X2 QUAN Y1 QUAN Y2 QUAN COLOR
]LOC
TO COLOR TO Y2 TO X2 TO Y1 TO X1
X1 Y1 X2 X1 - COLOR HLINE
X1 Y1 Y2 Y1 - COLOR VLINE
X1 Y2 X2 X1 - COLOR HLINE
X2 Y1 Y2 Y1 - COLOR VLINE
;
Итак, что такое LOC[ ]LOC, куда делись DROP и почему словарь замусорен? Стоп, а кто вам таки сказал, что словарь замусорен? Оказывается, внутри LOC[ ]LOC Форт ушел в режим исполнения и наобъявлял переменных. Они были в цепочке поиска вплоть до выполнения ; , а там указатель на вход в цепочку слов оказался просто переставлен обратно на то слово, которое было до LOC[ Мы же в цирке! Тут постоянно что-то появляется и пропадает. Внутри определения BOX доступны X1 X2 Y1 Y2 COLOR. Выполнили ; ... але-оп, только BOX! Конечно, где-то глубоко в словаре эти слова по-прежнему существуют, как предметы в ящике с двойным дном. Но их просто обходят при поиске, и все.
Однако даже такая красивая рамочка не помогла. Рамку помочь построить, так еще и прыгать через нее прикажете? Нет уж, спать на пеньке полезнее и приятнее, пусть даже в цирке и шумновато стало...