Начальный курс программирования на языке Форт

         

ПОСТРОЕНИЕ ПРОГРАММЫ ВВОДА ЧИСЕЛ С ПОМОЩЬЮ СЛОВА KEY


В данном разделе мы покажем вам, как слово KEY может быть использовано при разработке специализированного интерпретатора ввода с клавиатуры. Допустим, вы хотите создать слово, подобное EXPECT, которое ожидало бы ввода с клавиатуры, но воспринимало бы только числовые символы. Остальные символы не должны восприниматься. Исключение составляют сигналы, посылаемые при нажатии клавиш ЗАБОЙ (в обычном значении) и RETURN (конец ввода). В отличие от EXPECT ваше слово не будет завершать свое выполнение при вводе заданного числа цифр, так как пользователь может, нажав клавишу ЗАБОЙ, исправить последнюю цифру до нажатия клавиш RETURN. Назовем это слово EXPECT# и зададим ему следующий порядок аргументов:( a макс-длина -- факт-длина)

где а - поле для размещения строки, а макс-длина - предельное число вводимых цифр. Фактическая длина может понадобиться в том случае, если вы захотите проверить, ввел ли пользователь хотя бы одну цифру.

Вам придется осуществлять такие действия, как возврат курсора на одну позицию, что программируется в разных системах по-разному. Принято вычленять подобные фрагменты в слова Форта и определять их отдельно от остальной части программы. Это делает программу более мобильной, поскольку при смене системы достаточно будет заменить лишь соответствующие слова. Такой прием называется локализацией или упрятыванием информации, не существенной для пользователя. Для большинства компьютеров мы можем написать определение: : ЗАБОЙ 8 EMIT ;

но в некоторых системах, где применяются устройства вывода с распределенной памятью, могут потребоваться другие определения. Кроме того, символы, получаемые словом KEY при нажатии клавиш ЗАБОЙ и RETURN, в различных системах различны. Упрятывание информации происходит следующим образом:: ЗБ? ( с -- t=клавиша-забоя) 8 = ; \ в некот.сист. 12 : ВК? ( с -- t=клавиша-RETURN) 13 = ; \ в некот.сист. 0

Основной конструкцией слова EXPECT# является цикл BEGIN WHILE REPEAT. Здесь WHILE выполняет проверку на нажатие клавиши RETURN.
Цикл начинается со слова KEY. Если введена правильная цифра, вы обрабатываете ее с помощью слова ПОЛУЧЕНИЕ (посылаете в буфер и увеличиваете соответствующий указатель). В случае «ЗАБОЯ» вы уничтожаете последний символ посредством слова НАЗАД (заполняете пробелом позицию последнего введенного символа и уменьшаете значение указателя). Используя таким образом слово KEY в цикле, можно создавать любые интерпретаторы клавиатуры или редакторы. Последнее определение, ЦИФРЫ, демонстрирует использование слова EXPECT#. Итак, в листинге не осталось больше ничего, что было бы вам не известно, поэтому никаких причин для того, чтобы отложить рассмотрение этой программы, у вас нет. (Более подробную информацию вы найдете в [1].)Block # 350 0 \ Ввод чисел часть 1 1 2 : НАЗАД 8 EMIT ; 3 : ЗБ? ( с -- t=клавиша-забоя) 8 = ; \ в некот.сист. 12 4 : ВК? ( с -- t=клавиша-RETURN) 13 = ; \ в некот.сист. 0 5 : #? ( с -- t=правильная-цифра) ASCII 0 ASCII 9 1+ WITHIN ; 6 7 8 9 10 11 12 13 14 15

Block # 351 0 \ Ввод чисел часть 2 1 : ПОЛУЧЕНИЕ ( 1-й-адр посл-а+1 текущ-адр с - 1-й-адр 2 посл текущ') 3 >R 2DUP > IF R@ DUP EMIT OVER C! 1+ THEN R> DROP ; 4 : НАОБОРОТ ( 1-й-адр посл-а+1 текущ-адр с -- 1-й-адр поcл 5 текущ' ) 6 DROP SWAP >R 2DUP < IF НАЗАД SPACE НАЗАД 1- DUP 1 BLANK 7 THEN R> SWAP ; 8 : EXPECT# ( а макс-длина -- факт.-длина) 9 OVER + OVER BEGIN KEY DUP ВК? NOT WHILE 10 DUP #? IF ПОЛУЧЕНИЕ ELSE 11 DUP ЗБ? IF НАОБОРОТ ELSE DROP 12 THEN THEN REPEAT ROT 2DROP SWAP - ; 13 14 : ЦИФРЫ ( #цифр -- d) 15 PAD SWAP 2DUP 1+ BLANK EXPECT# DROP PAD 1- NUMBER ;


Содержание раздела