Единицей компиляции Рефала-6b является модуль.
Модуль на Рефале-6b занимает ровно один текстовый файл. Не существует никаких дополнительных синтаксических конструкций, ограничивающих модуль.
Входные точки.
Функция, являющаяся входной точкой, должна предваряться ключевым словом $ENTRY. В одном из модулей запускаемой программы должна иметься входная точка REFGO , которой будут переданы оставшиеся параметры вызова, заключенные в скобки.
$ENTRY REFGO {
e1 = <PROUT "Hello world!">
<PROUT "Run parameters: " e1 >;
};
Если создать файл trefgo.ref содержащий приведенный текст, то его компиляция и запуск выглядят следующим образом:
C:\refal > refal -c trefgo
C:\refal > refal trefgo prm1 prm2 prm3
Hello world!
Run parameters: (prm1)(prm2)(prm3)
Внешние ссылки.
Если в модуле имеется обращение к функциям, описанным в других
модулях, то в этом модуле такие функции должны быть объявлены как
внешние ссылки, а в модулях, где они описаны - как входные точки.
Объявление внешних ссылок выглядит следующим образом:
$EXTERN внешняя-ссылка-1,
внешняя-ссылка-2
, ...;
Вместо ключевого слова $EXTERN может быть использовано $EXTERNAL.
Объявление внешних ссылок должно быть сделано ранее их использования.
$EXTERN внешняя-ссылка-1,
внешняя-ссылка-2
, ...;
Предложений $EXTERN в модуле может быть несколько, но каждая внешняя функция может быть объявлена только один раз.
Объявление ящиков.
Ящики, используемые в программе должны быть объявлены, объявление делается с помощью ключевых слов $BOX или $EXTBOX :
$BOX ящик-1, ящик-2, ...;
или
$EXTBOX ящик-1, ящик-2, ...;
Первый вариант объявляет локальные ящики, второй вариант объявляет глобальные ящики. Имя локального ящика будет распознано в модуле, где он объявлен как имя ящика, но локальные ящики с одинаковыми именами в разных модулях будут ссылаться на разные ящики.
Если ящики с одинаковыми именами будут объявлены в разных модулях как глобальные, то они будут ссылаться на один и тот же ящик.
В Рефале-6b отсутствует сборка мусора. Содержимое ящика будет сохраняться, пока на него существует хотя бы одна ссылка. Само определение ящика уже создает ссылку на ящик в самом модуле, которая будет удалена, если будет удален модуль с помощью функции DELETE.
Если внутри ящиков возможны ссылки на другие ящики, то могут
возникнуть
циклические ссылки, которые могут привести к тому, что ссылок на ящики
из поля зрения и загруженных модулей нет, но ящики ссылаются друг на
друга (или просто на себя) и эти ящики постепенно забивают память.
Чтобы избежать этого достаточно записать в ящик пустое содержимое, когда
ящик уже не нужен.
Так делает например функция DELETE, которая
записывает пустое содержимое в определения всех функций, объявленных
внутри описываемого модуля. Скомпилированные функции хранятся в ящиках,
а рекурсия подразумевает циклические ссылки.
Функция LOAD.
<LOAD имя-скомпилированного-модуля >
В имени скомпилированного модуля расширение .rsx можно опустить.
Эта функция загружает указанный модуль и связывает точки входа в модулях и внешние ссылки. Точки входа проверяются на повторные. Если какая-либо внешняя ссылка остается неразрешенной, — то это не является ошибкой. Ошибка будет диагностирована только в момент обращения к функции, которая объявлена внешней, но отсутствует в объявленных входных точках загруженных модулей. Это позволяет загружать модули только перед тем, как к ним происходит реальное обращение.
Функция DELETE.
<DELETE имя-скомпилированного-модуля >
В имени скомпилированного модуля расширение .rsx можно опустить.
Эта функция удаляет указанный модуль из памяти. Обращение ко входным точкам в удаленном модуле вызовет сообщение об ошибке.
Функция NEW.
<NEW>
или <NEW слово>
или <NEW слово таблица>
Первый вариант функции NEW создает новый пустой непоименованный ящик и возвращает символ-ссылку.
Второй вариант функции NEW создает новый пустой поименованный ящик с указанным словом в качестве имени и возвращает символ-ссылку.
Третий вариант функции NEW проверяет имеется ли ящик с данным именем в таблице, создает новый пустой поименованный ящик с указанным словом в качестве имени, если его нет и записывает его в таблицу и возвращает символ-ссылку на вновь созданный ящик или на обнаруженный в таблице.
Функция GTR.
<GTR символ-ссылка >
Здесь аргумент функции — это имя ящика или символ-ссылка,
сгенерированный функцией NEW.
Эта функция выдает содержимое ящика в качестве результата. Ящик
становится пустым.
Функция WTR.
<WTR символ-ссылка выражение >
Эта функция заменяет содержимое ящика на выражение. Старое
содержимое уничтожается. Результат — пустое выражение
Функция CPR.
<CPR символ-ссылка >
Эта функция выдает в качестве результата копию содержимого ящика.
Рефал-6b поддерживает целочисленную арифметику. Целое число в Рефале-6b — это символ. Число может быть положительным или отрицательным и содержать любое количество десятичных позиций.
Функции NUMB и SYMB.
<NUMB десятичное-представление-числа >
Функция NUMB превращает последовательность литер, являющихся
представлением десятичного числа, возможно со знаком, в символ-число.
<SYMB символ-число >
Функция SYMB превращает символ-число в соответствующую
последовательность литер, являющихся представлением десятичного числа,
знак '+' для положительных чисел опускается.
Функция ADD.
<ADD символ-число-1 символ-число-2 >
Функция ADD складывает два целых числа и возвращает результат в виде
символа-числа.
Функция SUB.
<SUB символ-число-1 символ-число-2 >
Функция SUB вычитает второе число из первого и возвращает результат в
виде символа-числа.
Функция MUL.
<MUL символ-число-1 символ-число-2 >
Функция MUL перемножает два целых числа и возвращает результат в виде
символа-числа.
Функции целочисленного деления.
<DIV делимое делитель >
Функция DIV делит нацело первое число на второе и возвращает результат
в виде символа-числа.
<MOD делимое делитель >
Функция MOD делит нацело первое число на второе и возвращает остаток от
деления в виде символа-числа.
<DIVMOD делимое делитель >
Функция DIVMOD делит нацело первое число на второе и возвращает частное
и остаток от деления в виде двух символов-чисел.
Функция RANDOM.
<RANDOM верхняя-граница >
Функция RANDOM генерирует целое случайное число в интервале 0 -
верхняя-граница
-1.
Если верхняя-граница превосходит 32768, то будет
использоваться 32768.
Если верхняя-граница отсутствует, то будет также
использоваться 32768.
Функция SRANDOM.
<SRANDOM инициализатор >
Функция SRANDOM инициализирует генератор случайных чисел. Для разных
значений инициализатора последующие вызовы функции RANDOM
генерируют разные случайные последовательности. Если предварительного
вызова SRANDOM нет, то функция RANDOM гененерирует ту же
последовательность, как если бы функция SRANDOM была бы предварительно
вызвана с аргументом 1.
Функция LESS.
<LESS символ-1 символ-2 >
<LESS (выражение-1) выражение-2 >
Функция LESS сравнивает два аргумента и возвращает аргументы с атомом T или F перед ними. T означает истину, F - ложь.
Сравнение символов:
Сравнение термов:
Сравнение выражений:
Функция TYPE.
<TYPE выражение >
Функция TYPE определяет тип первого терма аргумента и выдает символ,
обозначающий тип, и затем исходный аргумент.
Символ, обозначающий тип первого терма:
Символ | Тип первого символа аргумента |
---|---|
D | Цифра 0-9 |
L | Прописная латинская буква A-Z |
l | Строчная латинская буква a-z |
N | Символ-число |
F | Символ-атом |
R | Символ-ссылка |
S |
Пробел, сюда входят те литеры, на которых функция языка C
isspace(c) возвращает "истину", в соответствии с описанием языка C это литеры: ' ' (0x20) пробел '\t' (0x09) горизонтальная табуляция (TAB) '\n' (0x0a) перевод строки (LF) '\v' (0x0b) вертикальная табуляция (VT) '\f' (0x0c) перевод страницы (FF) '\r' (0x0d) возврат каретки (CR) |
O |
Другой символ |
B |
Скобки |
* | Пустой аргумент |
Функция CHR.
<CHR выражение >
Функция CHR превращает все символы-числа на верхнем уровне скобочной
структуры в символы-литеры с кодом, соответствующим данному
символу-числу.
Используется остаток от деления числа, представленного символом-числом
на 256.
Функция ORD.
<ORD выражение >
Функция ORD превращает все символы-литеры на верхнем уровне скобочной
структуры в символы-числа со значением, соответствующим коду
символа-литеры.
Функция LOWER.
<LOWER выражение >
Функция LOWER превращает все заглавные символы-литеры на верхнем уровне
скобочной структуры в строчные символы-литеры.
Функция UPPER.
<UPPER выражение >
Функция UPPER превращает все строчные символы-литеры на верхнем уровне
скобочной структуры в заглавные символы-литеры.
Функция EXPLODE.
<EXPLODE атом >
Функция EXPLODE превращает атом (составной символ) в цепочку литер,
составляющих тело атома.
Функция IMPLODE.
<IMPLODE цепочка литер >
Функция IMPLODE превращает цепочку литер в атом с телом состоящим из
цепочки литер.
Функция FIRST.
<FIRST символ-число выражение >
Функция FIRST отделяет от начала выражения указанное число термов и
заключает их в скобки.
Функция LAST.
<LAST символ-число выражение >
Функция LAST отделяет от конца выражения указанное число термов и заключает остаток (который в начале выражения) в скобки.
Функция LENW.
<LENW выражение >
Функция LENW помещает перед выражением длину выражения в термах.
Функция GETENV.
<GETENV выражение >
Функция GETENV возвращает значение переменной окружения, имя которой
задано аргументом. В имени переменной могут использоваться только
символы-литеры.
Функция SETENV.
<SETENV (выражение-1)выражение-2 >
Функция SETENV устанавливает значение переменной окружения. Имя
переменной задано "выражением-1", Значение переменной задано
"выражением-2". В имени и значении переменной могут использоваться
только символы-литеры.
Функция ENVIRON.
<ENVIRON >
Функция ENVIRON возвращает список значений переменных окружения в виде
(переменная1=значение1)(переменная2=значение2)... .
Функция EXITCD.
<EXITCD символ-число >
Функция EXITCD запоминает код возврата который будет выдан в случае
нормального завершения программы. Символ-число должен быть числом от 0
до 9999, т.е. коротким числом без знака. Если было выполнено несколько
вызовов функции EXITCD, то запоминается максимальный код возврата.
Функция EXIT.
<EXIT символ-число или пусто >
Функция EXIT немедленно прекращает выполнение программы. Код возврата
будет максимальным из предыдущих вызовов функции EXITCD и указанного в
функции EXIT.
Функция PRINT.
<PRINT выражение >
Функция PRINT выводит выражение в sdtout и добавляет перевод строки.
Результатом замены становится исходное выражение.
Функция PROUT.
<PROUT выражение >
Функция PROUT
так же, как и PRINT выводит выражение в sdtout с переводом строки, но
результатом замены становится пустое выражение.
Функция PROUTN.
<PROUTN выражение >
Функция PROUTN аналогична PROUT, но не добавляет перевод строки.
Функция CARD.
<CARD подсказка >
Функция CARD выводит подсказку в sdtout и вводит строку из stdin.
Предназначена в основном для организации диалога.
Результат: введенная строка как последовательность объектных знаков или
число 0, если достигнут конец файла stdin (нажата клавиша Ctrl-D при
вводе с консоли).
Функция OPEN.
<OPEN режим канал имя-файла
>
Функция OPEN открывает канал для ввода или вывода в указанный файл.
режим может быть:
'r' — файл открывается для ввода;
'w' — файл открывается для вывода;
'a' — файл открывается для добавления;
канал — целое число от 3 до 20.
Функция CLOSE.
<CLOSE
канал >
Функция
CLOSE
закрывает
канал.
Функция GET.
<GET канал >
Функция GET вводит строку из указанного канала. Канал должен быть
предварительно открыт для чтения.
Если достигнут конец файла, то результатом функции GET будет число 0.
< Функция PUT.>
<PUT канал выражение
>
Функция PUT выводит выражение в указанный канал. Канал должен быть
предварительно открыт для вывода или добавления.
Результатом замены вызова функции PUT будет выводимое выражение
Функция PUTOUT.
<PUTOUT канал
выражение
>
Функция PUTOUT аналогична функции PUT, но ее результат замены — пустое
выражение.
Функция INPEXP.
<INPEXP канал таблица>
Функция INPEXP вводит один синтаксический элемент из указанного
канала. Синтаксический элемент - это либо терм, либо строка в
кавычках или апострофах. Если при вводе встречается поименованная
ссылка вида *слово, то проверяется, есть ли поименованная
ссылка с тем же именем в таблице, и, если есть, то старая ссылка
копируется в результат, иначе создается новый поименованный ящик.
Таблица в вызове функции INPEXP может отсутствовать, тогда изображения
символов-ссылок (слова со звездочкой впереди) во входном потоке
запрещены.
Результат замены — очередной введенный
синтаксический
элемент
или пусто, если достигнут конец
файла.
Функция OUTEXP.
<OUTEXP канал выражение>
Функция OUTEXP выводит выражение в указанный канал. Выведенное
выражение может быть затем введено функцией INPEXP терм за термом.
Последовательность введенных термов совпадет с последовательностью
термов, составляющих выведенное выражение, если правильно организовать
работу с таблицами.
Результат замены — пустое выражение.
Функция READKEY.
<READKEY>
Функция READKEY
читает клавишу с клавиатуры, результат - один или несколько коротких
чисел. Первый знак читается с блокировкой (ожиданием нажатия) затем
прочитываются все знаки, поскольку некоторые клавиши, - например
функциональные, генерируют несколько знаков. Какие именно знаки
генерирует нажатие на определенную клавишу - зависит от операционной
системы.
Функция CLRSCR.
<CLRSCR>
Функция CLRSCR очищает экран.
Функция ERASE.
<ERASE имя файла>
Функция ERASE удаляет указанный файл.
Функция SETLOCALE.
<SETLOCALE локаль>
Функция SETLOCALE устанавливает текущую локаль.
Эта функция эквивалентна системной функции языка C setlocale.
Пустой аргумент эквивалентен setlocale(NULL).
Иначе вызывается setlocale(локаль).
Результат замены - установленная локаль.
Функция TIME.
<TIME формат>
Функция выдает текущее время, форматированное в соответствии с аргументом.
Эта функция соответствует системной функции языка C strftime
для текущего времени.
Если аргумент пуст, то выдается время в коротком формате для текущей локали.
Функция TIMEN.
<TIMEN>
Функция выдает три числа: время в секундах с начала эпохи (1970-01-01 00:00:00 +0000 (UTC)), остаток времени в миллисекундах и локальную зону как сдвиг в минутах относительно UTC.