Стеллецкий В.
Рефал/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 - открытие файла

Эта функция получает строку символов:

первый символ определяет способ открытия файла r - файл открывается для чтение
w - файл открывается для запись
a - файл открывается для дозаписи
остальная часть строки (со второго символа) определяет имя открываемого файла (возможно с указанием пути)
Во всех случаях файл открывается в двоичной моде.

Результатом работы функции является последовательность символов, определяющая открытый файл. В случае невозможности открытия возникает ситуация невозможности отождествления.

 

 

 

 

 

 

 

 

 

 

 

 


вверх

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 получает набор выводимых строк, каждая из которых взята в скобки.