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

         

ВВОД С КЛАВИАТУРЫ


Слово KEY (КЛАВИША) ожидает, пока вы нажмете какую-либо клавишу на панели терминала и оставляет в вершине стека в младшем по порядку байте эквивалент символа, соответствующего этой клавише, в коде ASCII.

Наберите на клавиатуре: KEY<return>

Курсор продвинется на одну позицию, но «ok» на терминале не высветится: система ждет ввода вашего символа. Нажмите, к примеру, клавишу А и Форт-система ответит вам: «ok». Теперь в вершине стека находится значение литеры А в коде ASCII, поэтому введите .<return> 65 ok

Это дает вам возможность определить значение символа в коде ASCII, не заглядывая в таблицу.

Вы можете также включить KEY в состав определения. При встрече слова KEY выполнение данного определения приостановится до тех пор, пока не будет введен некоторый символ. Например, следующее определение выводит на печать по порядку заданное число блоков, начиная с текущего, но, прежде чем приступить к распечатке очередного блока, ожидает нажатия любой клавиши: : БЛОКИ ( # -- ) SCR @ + SCR @ DO I LIST KEY DROP LOOP ;

В этом случае вы снимаете со стека посредством DROP значение, оставленное словом KEY, так как оно вам не нужно. Позднее мы продемонстрируем использование слова KEY на примере программы ввода

В ряде систем имеется нестандартное слово с именем KEY? (в более ранних системах ?TERMINAL), которое помещает в вершину стека значение истины при нажатии на одну из клавиш, не останавливая вычисления и не ожидая ввода самого символа.

Допустим, вы выполняете бесконечный цикл на прибавление единицы: : БЕСКОНЕЧНЫЙ 0 BESIN DUP . 1+ FALSE UNTIL DROP ;

Можно организовать выход из такого цикла, заменив слово FALSE на KEY?: : СКАЖИ-КОГДА 0 BEBIN DUP . 1+ KEY? UNTIL DROP KEY DROP ;

Слово KEY? не считывает значение символа, соответствующего нажатой клавише, а лишь сигнализирует о том, что одна из клавиш была нажата. Чтобы считать ее значение, вы должны обратиться к слову KEY. В этом месте вы можете либо определить значение нажатой клавиши (при необходимости), либо просто выполнить выражение KEY DROP. (Во многих системах, где есть этап предварительного чтения в буфер, невозможность применять связку KEY KEY?, по существу, сводит на нет описываемый универсальный прием и вынуждает прибегать к системно-зависимым «ухищрениям»).


Если слово KEY ожидает ввода одного символа, то EXPECT (ОЖИДАТЬ) ожидает ввода с клавиатуры целой строки. На самом деле это адекватно использованию KEY в цикле. Цикл заканчивается по достижении заданного числа нажатий клавиш (обычно 80) или при нажатии клавиши возврата каретки. Кроме того, слово EXPECT способно распознать значение клавиши «Забой» и возвратить назад как курсор, так и внутренний указатель слова. С помощью EXPECT Форт-система ожидает ввода вашей команды.







EXPECT
выбирает из стека два аргумента: адрес, по которому нужно запомнить вводимый текст, и максимальное значение счетчика. Например, выражение TIB 80 EXPECT

ожидает ввода до 80 символов или нажатия клавиши RETURN и после завершения набора помещает введенный текст в буфер входного текста. Приведенное выражение содержится в определении слова QUERY (ЗАПРОС), используемое, как было показано выше, словом QUIT.

С помощью EXPECT вы можете сделать запрос на ввод из определения1. Ниже дается слово, которое при своем выполнении запрашивает имя пользователя, а затем выводит введенное имя вместе с приветствием:CREATE ИМЯ-ПОЛЬЗОВАТЕЛЯ 40 ALLOT : .ПОЛЬЗОВАТЕЛЬ ИМЯ-ПОЛЬЗОВАТЕЛЯ 40 -TRAILING TYPE ; : ПОЛУЧЕНИЕ-ИМЕНИ ИМЯ-ПОЛЬЗОВАТЕЛЯ 40 BLANK ИМЯ-ПОЛЬЗОВАТЕЛЯ 40 EXPECT ; : ВСТРЕЧА CR ." Пожалуйста, введите свое имя: " ПОЛУЧЕНИЕ-ИМЕНИ CR ." Привет, " .ПОЛЬЗОВАТЕЛЬ ." , Я говорю на Форте." ;

В результате вы получаете2:ВСТРЕЧА

Пожалуйста, введите свое имя:
ВАСЯ Привет, ВАСЯ, Я говорю на Форте.

1 для специалистов. Вы можете использовать EXPECT для снятия данных с последовательной шины, например, некоторого измерительного устройства. Так как у вас задействованы адрес и счетчик, такие данные могут быть считаны непосредственно в массив. Если вы являетесь единственным пользованием системы, ю перед записью на диск можете считать данные в буфер. В случае же мультизадачной системы вы должны применить TIB и уже потом пересылать данные в указанный буфер, поскольку «вашим» буфером может воспользоваться другая задача.



2 для пользователей систем, созданных до введения Стандарта-83. Слово EXPECT в таких системах требует наличия нуля в конце вводимого текста. Поэтому при выполнении приведенного выше примера на вашей системе между именем и запятой может появиться пробел.

-TRAILING
здесь воспринимает нуль как невыводимый на печать символ и при его выводе печатается пробел. Во избежание этого нужно ввести текст посредством EXPECT в рабочую область (PAD), после чего скопировать его, используя SPAN, в слово ИМЯ-ПОЛЬЗОВАТЕЛЯ с требуемым числом символов:

: ПОЛУЧЕНИЕ-ИМЕНИ ИМЯ-ПОЛЬЗОВАТЕЛЯ 40 BLANK PAD 40 EXPECT PAD ИМЯ-ПОЛЬЗОВАТЕЛЯ SPAN @ CMOVE ;



SPAN
- пользовательская переменная, в которой содержится фактическое число символов, полученных словом EXPECT,

KEY

( -- с)

Занесение на стек значения в коде ASCII очередного доступного символа на текущем устройстве ввода.

EXPECT

( а u --)

Ожидание и символов (или нажатий клавиши RETURN) с клавиатуры и запоминание их в участок памяти, начинающийся с адреса a и продолжавшийся сторону увеличения адресов. На нажатие клавиши ЗАБОЙ осуществляется возврат курсора.

SPAN

( -- a)

Содержится количество символов, полученных, словом EXPECT


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