Текстовая строка, скомпилированная в словарь со средствами получения ее адреса, называется строковым литералом. Общим словом для создания строковых литералов является слово STRING (СТРОКА)1. Оно функционирует следующим образом:CREATE СООБЩЕНИЕ BL STRING ПРИВЕТ СООБЩЕНИЕ COUNT TYPE ПРИВЕТ ok
Слово STRING выбирает из стека в качестве аргумента символ в коде ASCII - ограничитель строки - и считывает до него фрагмент из входного потока, компилируя его в словарь как строку со счетчиком.
1 Для пользователей всех систем, кроме полифорта. Во многих системах (но не всюду) вы можете воспользоваться следующим определением:
: STRING ( с -- ) WORD C@ 1+ ALLOT ;
Мы полагаем, что в таких системах буфер слова WORD начинается с Н ERE, поэтому здесь не требуется пересылка строки и счетчика в словарь. Адрес, оставляемый в стеке словом WORD, является адресом со счетчиком, там что слово С@ помещает значение этого счетчика в вершину стека Затем слово ALLOT продвигает указатель словаря по длине строки (плюс один из-за счетчика), резервируя память для нее в словаре
Вы можете воспользоваться словом STRING для создания строковых массивов. Вспомните наше определение слова МАРКИРОВКА в программе сортировки яиц, где мы применяли вложенные конструкции IF THEN. На этот раз сделаем сообщения о категории яиц одинакового размера (по восемь букв) и соединим их в одну строку с помощью единственного строкового литерала:CREATE "МАРКИРОВКА" ASCII " STRING Брак Мелкие Средние Крупные Оч.крупнОшибка"
Обращаясь к слову МАРКИРОВКА, мы получаем адрес данной строки. Можно вывести любое сообщение о категории яиц, вычислив смещение внутри строки. Например, если нужно выдать сообщение о категории 2, то добавляем единицу (чтобы проскочить байт со счетчиком), затем прибавляем 16(2*8) и выводим восемь символов имени:"МАРКИРОВКА" 1+ 16 + 8 TYPE
Теперь переопределим слово МАРКИРОВКА так, чтобы оно выбирало из стека номер категории от нуля до пяти и использовало его как индекс в нашем строковом массиве:: МАРКИРОВКА ( категория# -- ) 8 * "МАРКИРОВКА" + 8 TYPE SPACE ;
|
UPDATE |
( -- ) |
Блок, доступ к которому осуществлялся в последнюю очередь, отмечается как модифицируемый. Этот блок будет впоследствии переписан во внешнюю память, если его буфер потребуется для размещения другого блока или в результате выполнения слова FLUSH. |
|
SAVE-BUFFERS |
( -- ) |
Запись содержимого всех обновленных буферов в соответствующие блоки внешней памяти. У всех буферов погашается признак обновления, но они продолжают оставаться распределенными . |
|
FLUSH |
( -- ) |
Осуществляется SAVE-BUFFERS, затем происходит погашение признака обновления всех буферов. Используется при установке или смене накопителей внешней памяти. |
|
EMPTY-BUFFERS |
( -- ) |
Все блочные буфера отмечаются как пустые независимо от им содержания. Обновленные блоки во внешнюю память не записываются. |
|
BLOCK |
( u -- ) |
Занесение в стек адреса первого байта в блоке u. Если данного блока еще в памяти нет, то происходит его пересылка из внешней памяти в тот буфер, к которому дольше всех не было доступа. Если блок, занимающий данный буфер, обновлялся (то есть был модифицирован) , то перед считыванием блока u в буфер содержимое последнего будет переписано во внешнюю память. |
|
BUFFER |
( u -- a) |
Функции те же, что и у BLOCK, за исключением того, что сам блок из внешней памяти не считывается. |
|
TYPE |
( а количество - ) |
Происходит выдача заданного количества символов, начиная с заданного адреса, на текущее внешнее устройство |
|
-TRAILING |
( a u1 -- a u2) |
Удаление незначащих пробелов из строки с заданным адресом путем уменьшения значения счетчика от u1 (счетчик исходных байтов) до u2 (счетчик байтов, полученных в результате вычеркивания пробелов). |
|
>TYPE |
( a # -- ) |
То же самое, что и TYPE, за исключением того, что перед выдачей выводимая строка помещается в pad. Используется в мультипрограммных системах для вывода строк, находящихся в блоках на диске. |
|
MOVE |
( a1 a2 u -- ) |
По ячеечное копирование участка памяти длиной u байтов, начинающегося с адреса a1, в участок памяти, начинающийся с а2. Пересылка идет с al В сторону увеличения адресов. |
|
CMOVE |
( al a2 u -- ) |
Побайтное копирование участка памяти длиной u байтов, начинающегося с a1, в участок памяти, начинающийся с а2. Пересылка идет с а1 в сторону увеличения адресов. |
|
СМОVE> |
( a1 a2 u -- ) |
Копирование участка памяти длиной u байтов, начинающегося с адреса a1, в участок памяти, начинающийся с адреса а2. Копирование начинается с КОНЦА строки и продвигается в сторону уменьшения адресов. |
| BLANK |
( a u -- ) |
Заполнение участка памяти длиной u байт символам пробела в коде ASCII. |
|
KEY |
( -- с) |
Занесение на стек значения в коде ASCII очередного доступного символа на текущем устройстве ввода. |
|
EXPECT |
( а u --) |
Ожидание и символов (или нажатий клавиши RETURN) с клавиатуры и запоминание их в участок памяти, начинающийся с адреса a и продолжавшийся сторону увеличения адресов. На нажатие клавиши ЗАБОЙ осуществляется возврат курсора. |
|
SPAN |
( -- a) |
Содержится количество символов, полученных, словом EXPECT |
|
WORD |
( с -- а) |
Чтение слова, ограниченного заданным символом, из входного потока. Полученный фрагмент оформляется в виде строки со счетчиком и ее адрес помещается в стек. |
|
COUNT |
( a -- a+1 #) |
Преобразование адреса строки со счетчиком (длина которой находится в первом строки) в формат, соответствующий использования словом TYPE а именно: в стек заносится адрес начала текста строки и ее длина. |
|
>IN |
( -- a) |
Пользовательская переменная, содержания смещение обрабатываемого символа относительно начала входного потока. |
|
BLK |
( -- а) |
Пользовательская переменная, содержащая номер блока во внешней памяти, интерпретируемого в качестве входного потока. Если в BLK содержится нуль, то входной поток поступает из буфера входного текста. |
|
CONVERT |
( ud1 a1 -- ud2 а2) |
Начиная с адреса a1+1 (байт, содержащий длину, пропускается), CONVERT преобразует строку в двоичное значение, которое зависит от текущей системы счисления (значения BASE). Полученное значение накапливается в ud1, и остается на стеке как ud2. Процесс продолжается до тех пор, пока не встретится символ, который не может выть истолкован как цифра в текучей системе счисления. Адрес этого символа заносится на стек как а2. |
|
NUMBER |
( a -- d) |
Преобразование текста, начинающегося с адреса а+1, в двоичное значение с учетом текущей системы счисления (значения BASE). Строка может предваряться знаком минус, что делает полученное значение отрицательным. |
|
-TEXT |
( al # a2 -- ?) |
Сравнение двух строк длиной # , начинающийся с al и а2. Если сравнение успешное, на стек заносится ложь. Если нет, на стек заносится истина (положительное число, если двоичное представление строки1 > двоичного представления строки2, и отрицательное, если стр.1 < стр.2 ). |
|
-MATCH |
( d # s # -- а ?) |
Поиск фрагмента длиной #, начинающегося с адреса s (источник) в области памяти длиной # , начинающейся с адреса d (получатель). Если поиск завершился успешно, на стек помещается начало искомого фрагмента a заданной области памяти и ложь. В противном случае неправильный адрес и истина. |
| STRING | ( с - ) | Компиляция строкового литерала, ограниченного символом с, в словарь как строки со счетчиком. |
|
LIT" xxx" |
период-выполнения: ( -- a) |
Компиляция строкового литерала ххх, ограниченного двойной кавычкой. В период выполнения на стек помещается адрес строки со счетчиком. Используется только внутри определений. |