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

         

ВЫВОД ТЕКСТА С ДИСКА


Ранее уже отмечалось, что слово BLOCK копирует заданный блок в некоторый доступный буфер и оставляет адрес последнего в вершине стека. Приняв этот адрес за исходный, мы можем добраться посредством индексирования до каждого из 1024 байтов данного буфера и вывести любую строку. К примеру, для того чтобы вывести строку 0 блока 214, вы можете ввести CR 214 BLOCK 64 TYPE<return>

( ЭТО БЛОК 214 ) ok

Для вывода строки 8 нужно добавить к исходному адресу 512 (8x64): CR 214 BLOCK 512 + 64 TYPE

Прежде чем перейти к более интересному примеру, нам бы хотелось предложить вашему вниманию еще два слова, которые ассоциируются со словом TYPE.

-TRAILING

( a u1 -- a u2)

Удаление незначащих пробелов из строки с заданным адресом путем уменьшения значения счетчика от u1 (счетчик исходных байтов) до u2 (счетчик байтов, полученных в результате вычеркивания пробелов).

>TYPE

( a # -- )



То же самое, что и TYPE, за исключением того, что перед выдачей выводимая строка помещается в pad. Используется в мультипрограммных системах для вывода строк, находящихся в блоках на диске.

Слово -TRAILING, используемое непосредственно перед командой TYPE, изменяет значение счетчика таким образом, что незначащие пробелы не выводятся. Так, если вы вставите это слово в приведенный выше пример (с блоком 214), то получите:CR 214 BLOCK 64 -TRAILING TYPE<return>

( ЭТО БЛОК 214 ) ок

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

Слово >TYPE применяется только в мультипрограммных системах для вывода строк из буферов, находящихся на диске. Вместо того чтобы непосредственно выдавать строку с заданного адреса, оно предварительно перекачивает строку целиком в рабочую область и затем выводит ее оттуда. Поскольку все пользователи разделяют одни и те же буферы, система не может гарантировать, что к тому времени, когда TYPE завершит вывод содержимого какого-то буфера, последний будет все еще хранить прежний блок.
Однако вы можете быть уверены в том, что данный буфер содержит один и тот же блок во время перекачки этого буфера в рабочую область1. Так как каждой задаче отведена своя рабочая область, >TYPE может выводить из нее информацию без риска получить не те данные.
В приведенном ниже примере используется слово TYPE, но вы при необходимости можете подставить вместо него >TYPE. В конце раздела мы покажем вам полезный прием с применением генератора случайных чисел.Block # 231 0 ( Генератор бессмысленных сообщений ) 1 : АБРЕД ( -- а) 232 BLOCK ; 2 : БРЕД ( строка# столбец# -- а) 3 20 * SWAP 64 * + АБРЕД + ; 4 : .БРЕД ( столбец# колонка# -- ) БРЕД 2И -TRAILING TYPE ; 5 : 1ПРИЛАГАТЕЛЬНОЕ 10 CHOOSE 0 .БРЕД ; 6 : 2ПРИЛАГАТЕЛЬНОЕ 10 CHOOSE 1 .БРЕД ; 7 : СУЩЕСТВИТЕЛЬНОЕ 10 CHOOSE 2 .БРЕД ; 8 : ФРАЗА 1ПРИЛАГАТЕЛЬНОЕ SPACE 2ПРИЛАГАТЕЛЬНОЕ SPACE СУЩЕСТВИТЕЛЬНОЕ ; 9 : СООБЩЕНИЕ 10 CR ." Применяя " ФРАЗА ." имея в виду " 11 CR ФРАЗА ." представляется возможным даже несмотря на " 12 CR ФРАЗА . " функционировать как " 13 CR ФРАЗА ." при существующих ограничениях на " 14 CR ФРАЗА ." . " ; 15 СООБЩЕНИЕ
Block # 232 0 высокий культурный уровень 1 общий производственный интерес 2 автоматизированный наукоемкий комплекс 3 запланированный валовой объем 4 интегрированный цифровой коэффициент 5 квалифицированный многоотраслевой принцип 6 представительный химический генератор 7 автономный аппаратный интерфейс 8 цифровой независимый автомат 9 синхронизированный функциональный критерий 10 систематизированный коротковолновой проект 11 12 13 14 15
1 Для специалистов. В мультипрограммной системе задача передает управление центрального процессора следующей задаче только на время ввода-вывода или по специальной команде, которая преднамеренно не включена в определение слова, пересылающего строки.
После загрузки блока (в нашем примере блока 231) вы получите следующий текст, хотя некоторые слова при выполнении слова СООБЩЕНИЕ всякий раз будут меняться: применяя высокий функциональный критерий имея в виду цифровой производственный комплекс представляется возможным даже несмотря на представительный независимый коэффициент функционировать как автоматизированный наукоемкий уровень при существующих ограничениях на квалифицированный Функциональный автомат.


Как видите, определение слова СООБЩЕНИЕ состоит из ряда сочетаний ." текст", перемежаемых словом ФРАЗА. Если вы выполните слово ФРАЗА отдельно, то получите ФРАЗА автоматизированный культурный объем ok
т. е. одно слово выбирается случайным образом из столбца 0 блока 232, другое - из столбца 1, а третье - из столбца 2.
Вы, конечно, заметили, что в определении слова ФРАЗА есть обращения к трем словам верхнего уровня: 1 ПРИЛАГАТЕЛЬНОЕ, 2ПРИЛАГАТЕЛБНОЕ и СУЩЕСТВИТЕЛЬНОЕ. Каждое из перечисленных слов в свою очередь обращается к слову .БРЕД, которому в качестве аргументов необходимо взять из стека номер строки (0-9) и номер столбца (0-2), определяющие выводимое слово или фразу. Случайное число, получаемое при выполнении выражения "10 CHOOSE", определяет номер строки. Каждая часть речи обеспечивает уникальный номер столбца.
Слово .БРЕД обращается к слову БРЕД для вычисления адреса бессмысленного сообщения, передавая максимальное значение счетчика, равное 20, слову TYPE. Но прежде слово -TRAILING сокращает значение 20 до фактического числа значащих символов в строке, удаляя тем самым незначащие пробелы в конце. Слово БРЕД вычисляет величину смещения в блоке путем умножения номера столбца на 20 (каждый столбец занимает 20 символов) и номера строки на 64 (каждая строка состоит из 64 символов), после чего складывает полученное смещение с. адресом начала, которое доставляется словом АБРЕД. Вообще хороший стиль программирования предполагает разделение программ, вычисляющих адреса, и программ, эти адреса использующие (так как адреса зачастую оказываются необходимыми для других целей).
Адрес начала обеспечивает слово АБРЕД, которое просто вызывает BLOCK. Здесь мы снова выделили получение адреса в отдельное действие на тот случай, если местоположение базы данных с бессмысленными выражениями изменится. Например, может измениться номер блока. Такое разбиение не мешает нам даже поместить базу данных в словарь (путем переопределения слова АБРЕД). CREATE АБРЕД 64 10 * ALLOT
Полезный прием. Генератор случайных чисел. Этот простой генератор случайных чисел может быть использован в играх. Для более же серьезных применений, например моделирования, существуют улучшенные варианты такого генератора.
( Генератор случайных чисел - верхний уровень )
VARIABLE RND HERE RND ! : RANDOM ( -- ) RND в 31421 * 6927 + DUP RND ! ; : CHOOSE ( u1 -- u2 ) RANDOM UM* SWAP DROP ; ( где CHOOSE оставляет на стеке случайное число в диапазоне от 0 до u1-1 )
Для получения некоторого случайного числа в диапазоне от 0 до 10 (само число 10 сюда не входит) просто наберите на клавиатуре
10 CHOOSE
и в вершине стека останется случайное число.

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