Стеллецкий В. Рефал/2 |
Встроенные рефал-функции (машинные процедуры)
(в процессе написания)
* в этой (ADD) и последующих арифметических функциях предполагаются операнды – целые числа "любой" размерности (ограничение – размер виртуальной памяти компьютера), представленные как комбинация макроцифр. Т.е. в DOS-реализации в 216-ричной системе счисления.
вверх
ввод/вывод
Описывемая версия рефала работает с четырьмя файлами
При работе с файлами используется общий буфер длиной 32760 байт, называемый далее "X+LX". Это значение является ограничением на длину входных/выходных строк.
Файл X выводится из этого же буфера со смещения 2000. Таким образом он не может быть больше 30760 байт, зато функции работы с ним имеют прямой доступ к этому буферу, и могут заполнять его в любой порядке, например, сначала сформировать строку, а только затем перед ней указать ее длину. Получается, что при использовании файла X ограничение на длины строк других файлов уменьшается, до 2000 символов. Длина выводимой части файла X определяется первым символом, оставшимся в поле зрения при выходе из программы на рефале.
Стандартные входной и выходной потоки могут быть связаны с файлами при помощи перенаправлений (<, >, >>) в командной строке запуска рефала.
вверх
G - чтение символа из файла F
Дает очередной символ файла F (включая управляющие 0A, 0D, 1A и т.п.). Пустой выход определяет конец файла (или ошибку чтения :-( ).
Буфером X+LX функция G не пользуется!
Построчный ввод см. функцию G0A.
вверх
G0A - чтение строки из файла F (через X+LX) с 0A на заду
Эта функция рассматривает файл F как текстовый, и читает с текущего места в файле строку символов (до символа 0A или конца файла). Символы 0D и 1A при этом опускаются. Пустой выход определяет конец файла (или ошибку чтения :-( ).
Функция G0A использует буфер X+LX!
Посимвольный ввод см. функцию G.
вверх
W - вывод в stdout (через X+LX) без 0A на заду
Выводит в стандартный выходной поток символы из своей области определения. У макроцифр (чисел) используется только младший байт. Это дает возможность генерировать выходные символы арифметическими операциями. Строка выходного потока может быть сформирована несколькими обращениями к функции W.
Функция W использует буфер X+LX!
Построчный вывод см. функцию P.
вверх
P - печать строки в stdout (через X+LX) с 0A на заду
Выводит в стандартный выходной поток строку из своей области определения. Выводимая строка автоматически дополняется в конце признаком конца строки (символы 0D0A). У макроцифр (чисел) используется только младший байт. Это дает возможность генерировать выходные символы арифметическими операциями.
Функция P использует буфер X+LX!
Посимвольный вывод см. функцию W.
вверх
GI - чтение строки из входного потока (через X+LX) с 0A на заду
Эта функция читает очередную строку символов (до символа 0A или конца файла) из входного потока. Символы 0D и 1A при этом опускаются, а символ 0A из входного потока в прочитанную строку почему-то не записывается. Пустой выход определяет конец файла (или ошибку чтения :-( ). Поэтому в таком файле пустая строка может быть спутана с концом файла.
Функция GI использует буфер X+LX!
вверх
WX1 - запись в файл X строки символов
Эта функция заносит строку символов в буфер вывода файла X. Первый символ определяет смещение в этом буфере. Выводимая строка начинается со второго символа поля зрения функции.
вверх
WX2 - запись в файл X двухбайтового двоичного числа
Эта функция заносит в буфер вывода файла X двухбайтовое двоичное число (сначала младший байт). Первый символ определяет смещение в этом буфере. Выводимое число определяется вторым символом поля зрения функции.
вверх
OPEN - открытие файла
Эта функция получает строку символов:
Результатом работы функции является последовательность символов, определяющая открытый файл. В случае невозможности открытия возникает ситуация невозможности отождествления.
вверх
CLOSE - закрытие файла
Эта функция получает последовательность символов, определяющую файл,
открытый функцией OPEN.
Функция возвращает пустую строку.
вверх
GET - чтение символа из файла
Эта функция получает очередной символ из файла,
открытого функцией OPEN.
При достижении конца файла возвращает пустую строку.
Примером чтения файла может служить функция fr:
fr (ef)=k/rf/(ef)k/GET/ef.. en=k/fr/(k/OPEN/'r'en.). rf (ef)=k/CLOSE/ef. (ef)ei=eik/rf/(ef)k/GET/ef..Функция fr получает строкой символов en имя файла, открывает его для чтения функцией OPEN и начинает цикл чтения, выполняемый функцией rf, которая по окончании файла закрывает файл функцией CLOSE.
вверх
PUT - запись последовательности символов в файл
Эта функция получает выражение в скобках - последовательность символов, определяющую файл,
открытый функцией OPEN, и следующую за ней строку символов для вывода в файл.
Функция возвращает пустую строку.
Пример записи в файл:
fw (en)ea=k/wf/(k/OPEN/'w'en.)(ea). wf wf(ea)eb=k/PUT/wfea .k/wf/wfeb. (ef)=k/CLOSE/ef.Здесь функция fw получает en - имя записываемого файла и ea - записываемую информацию. Она открывает файл функцией OPEN и обращается к функции wf.
Функция wf после записи всей информации закрывает файл функцией CLOSE.
Для построчной записи текстовых файлов может использоваться приведенная ниже функция wft, отличающаяся от функции wf выводом в конце каждой строки разделителей 0x0D0A, представленных макроцифрами /13/ и /10/:
fwt (en)es=k/wft/(k/OPEN/'w'en.) es . wft wf(ea)eb=k/PUT/wfea/13//10/.k/wft/wfeb. (ef)=k/CLOSE/ef.Для обращения к wft использована функция fwt. Она в es получает набор выводимых строк, каждая из которых взята в скобки.