Краткое описание:
В системе есть три элемента: очередь команд, стек параметров и список переменных. Код представляется в виде слов(команд), разделенных пробелами, табуляцией или переводом строки.
Интерпретатор обрабатывает команды из очереди. Большинство команд действуют на стек. Переменные добавлены для удобства.
Переменные не имеют типа и не требуют объявления. Переменная начинает существовать с момента первого присвоения.
Иногда значение должно быть числовым. Для этого оно должно быть следующего вида:
целаячасть.дробнаячасть
Дробная часть может отсутствовать. Точка может присутствовать даже без дробной части. Перед числом может быть минус, но никак не плюс.
Команды:
Код [ ] - содержимое записывается в стек. Внутри допустимы любые символы. Предполагается что это будущий набор команд - квадратные скобки внутри проходят проверку на правильность. Имена переменных для операции присваивания нужно записывать в таких скобках (но можно и в кавычках).
Строка " " - содержимое записывается в стек. Внутри допустимы любые символы кроме кавычек. Предполагается, что это просто строка. Никаких проверок нет.
Арифметические операции +,-,*,/ - принимают два числа из стека в качестве параметров. В стек помещают результат.
Очистка ; - очищает стек.
Вызов call - транслирует содержимое вершины стека в последовательность команд и помещает в начало очереди команд (таким образом следующая команда будет именно из этой новой последовательности).
Выбор if - забирает из стека три параметра. В порядке вынимания из стека: блок "иначе", блок "если", значение. Если значение не равно 0, то выполняет блок "если", иначе - блок "иначе".
Цикл while - берет с вершины стека тело цикла. Перед каждой итерацей берет значение с вершины стека и проверяет. Если это не 0, то выполняет тело цикла. Иначе выходит из цикла.
Операции сравнения =,!=,>=,<=,>,< - сравнивают два значения с вершины стека. Если хотя бы одно из них не число, то производится сравнение строк. Если значения равны, в стек кладется 1, иначе - 0.
Операция присвоения := - берет из стека значение и имя переменной. Присваивает переменной с этим именем значение.
Конкатенация . - присоединяет значение в вершине стека к предыдущему.
Вывод msg - забирает значение из вершины стека и выводит его на экран. После этого переводит строку.
Копирование dup - помещает в стек значение в его вершине, сохраняя старое.
Обмен swap - меняет местами два верхних значения в стеке.
Разделение \ - забирает с вершины стека число и строку. От конца строки отделяет количество символов, равное этому числу, и помещает полученные части строки в стек.
Повторение repeat - забирает с вершины стека количество повторений и тело цикла и исполняет тело цикла количество раз, равное количеству повторений.
Циклические сдвиги rol, ror - забирают с вершины стека число и циклически сдвигают верхние элементы стека, количество которых равно взятому числу. При этом ror сдвигает элементы по направлению к вершине стека.
Циклические сдвиги rola, rora - аналогичны rol и ror, но не принимают параметров и сдвигают весь стек.
Получить код символа ? - берет с вершины стека символ и помещает в стек код ASCII этого символа.
Получить символ # - берет с вершины стека число и помещает в стек символ с кодом ASCII, равным этому числу по модулю 256.
Длина len - помещает в стек количество символов в строке на вершине стека.
Получить количество count - помещает в стек количество элементов стека.
Удаление drop - удаляет элемент на вершине стека.
Отличные от этих слова сначала проверяются на принадлежность к числам, потом - к переменным. В обоих случаях значение числа или переменной помещается в стек.
(Внимание! Следующая запись (без кавычек) не имеет смысла: "var_name 1 :=". Правильно: "[var_name] 1 :=" (без кавычек))
Все остальные слова выдадут ошибку.
Классические конструкции:
Присваивание:
Код
[var_name] value :=
Отрицание:
Код
0 swap -
Получение указателя:
Код
[pointer] [var_name] :=
Обращение по указателю (получение значения в var_name):
Код
pointer call
Объявление функции:
Код
[foo] ["Hello, world!" msg] :=
Вызов функции:
Код
foo call
Примеры:
Привет, мир!
Код
"Hello, world!" msg
Факториал с помощью рекурсии
Код
[fact] [dup 1 - dup 1 = [] [fact call *] if] :=
5 fact call
msg
5 fact call
msg
Факториал с помощью цикла
Код
[i] 5 :=
i 1 [[i] i 1 - := i * i 1 !=] while
msg
i 1 [[i] i 1 - := i * i 1 !=] while
msg
Число Фиббоначи
Код
[fib] [dup 1 > [1 - dup 1 - fib call swap fib call +] [] if] :=
9 fib call
msg
9 fib call
msg
Куайн
Код
[s] ["[ s ] [" s "] := s call msg" . .] := s call msg
Программа запускается из командной строки с одним параметром: именем файла исходного кода. Можно перетащить файл с исходным кодом на значок программы.
Скачать Release Candidate 2
История версий:
- Release Candidate 1
+ появился язык - Release Candidate 2
+ новые команды \, repeat, rol, ror, rola, rora, ?, #, len, count, drop
+ проверки на пустоту стека
* улучшена система ошибок