ПЕРЕМЕННЫЕ В КАЧЕСТВЕ СЧЕТЧИКА
В Форте переменная представляет собой идеальное средство для счетчика. Вернемся к примеру с машиной для упаковки яиц и предположим, что нам нужна информация о том, сколько яиц проходит по ленте конвейера за один день. (Этот пример вы должны выполнить за своим терминалом, так что по ходу изложения набирайте на клавиатуре текст и вводите его.)
Сначала мы определяем
в которой будем вести подсчет. Каждое утро мы будем начинать подсчет с нуля, поэтому нам придется загружать в переменную ЯЙЦА нуль, используя слово, определение которого выглядит так:
: УСТАНОВИТЬ 0 ЯЙЦА ! ;
После этого где-нибудь в нашей программе по упаковке яиц нужно определить слово, которое всякий раз, когда яйцо минует электрический «глазок» на конвейере, выполняет следующее выра-жение:
1 ЯЙЦА +!
Слово +!1 добавляет заданное значение к содержи^мому (любому) по данному адресу. Таким образом, выражение 1 ЯЙЦА + ! увеличивает счетчик яиц на единицу. Для иллюстрации изложенного поместим это выражение внутрь некоторого определения:
: ЯЙЦО 1 ЯЙЦА +! ;
А в конце дня выясним, сколько яиц прошло через конвейер, набрав на клавиатуре ЯЙЦА?. Теперь проверим:
УСТАНОВИТЬ ok
ЯЙЦО ok
ЯЙЦО ok
ЯЙЦО ok
ЯЙЦА ? 3 ok
Ниже приводится перечень слов, которые мы уже рассмотрели в настоящей главе.
VARIABLE ххх ( -- ) Создание переменной с именем ххх. ххх ( -- а) Слово ххх при выполнении помещает в стек свой адрес. ! ( n а --) Запоминание числа одинарной длины по заданному адресу. @ ( a -- n) Замещение адреса его содержимым. ? ( а --) Вывод значения по заданному адресу с последующим пробелом. +! ( n а --) Сложение числа одинарной длины с содержимым заданного адреса.
1Для любознательных. Это слово обычно определяют на уровне языка Ассемблера, определение же на языке высокого уровня имеет вид:
: +! ( приращение а --) DUP @ ROT + SWAP ! ;