Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Staq
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
gamecreator
Это простой стековый интерпретируемый язык. Изначально задумывался как скриптовый язык для Мегамейза.
Краткое описание:
В системе есть три элемента: очередь команд, стек параметров и список переменных. Код представляется в виде слов(команд), разделенных пробелами, табуляцией или переводом строки.
Интерпретатор обрабатывает команды из очереди. Большинство команд действуют на стек. Переменные добавлены для удобства.
Переменные не имеют типа и не требуют объявления. Переменная начинает существовать с момента первого присвоения.
Иногда значение должно быть числовым. Для этого оно должно быть следующего вида:
целаячасть.дробнаячасть
Дробная часть может отсутствовать. Точка может присутствовать даже без дробной части. Перед числом может быть минус, но никак не плюс.

Команды:
Код [ ] - содержимое записывается в стек. Внутри допустимы любые символы. Предполагается что это будущий набор команд - квадратные скобки внутри проходят проверку на правильность. Имена переменных для операции присваивания нужно записывать в таких скобках (но можно и в кавычках).

Строка " " - содержимое записывается в стек. Внутри допустимы любые символы кроме кавычек. Предполагается, что это просто строка. Никаких проверок нет.

Арифметические операции +,-,*,/ - принимают два числа из стека в качестве параметров. В стек помещают результат.

Очистка ; - очищает стек.

Вызов 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

Факториал с помощью цикла
Код
[i] 5 :=
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

Куайн
Код
[s] ["[ s ] [" s "] := s call msg" . .] := s call msg


Программа запускается из командной строки с одним параметром: именем файла исходного кода. Можно перетащить файл с исходным кодом на значок программы.
Скачать Release Candidate 2

История версий:
  1. Release Candidate 1
    + появился язык
  2. Release Candidate 2
    + новые команды \, repeat, rol, ror, rola, rora, ?, #, len, count, drop
    + проверки на пустоту стека
    * улучшена система ошибок
tolich
Наверняка мощный ЯП, жаль, интерпретатор нагло требует какую-то "MSVCR90.DLL".
gamecreator
тебе показалось
FBX
запустил "факториал", только выводится какая-то точка после цифры (
gamecreator
это часть числа.

Добавлено ([mergetime]1275540048[/mergetime]):
в интерпретаторе они конвертятся в double и назад
FBX
хмхм а может предусмотреть отдельно целочисленные операции для 8, 16 и 32-разрядных как бы?
gamecreator
а, собственно, зачем (кроме логических)?
FBX
переполнение, деление нацело или с остатком. Ну и логические. Плюс - вещественные допускают погрешности. Причем тут они какие-то жесткие очень - например факториал от 60..
gamecreator
вообще-то 60! - это
83209871127413901442763411832233643807541726063612459524492776964096000000000000
00
ты хочешь чтобы я реализовал длинную арифметику?
FBX
да зачем длинную... просто целочисленную обычную
gamecreator
ну у тебя же претензии к факториалу 60
sergroj
Для Megamaze лучше использовать Lua.
Berserker
Для всего в мире лучше использовать Lua!
gamecreator
sergroj, добавь поддержку Lua в реальность.
Flashback
gamecreator, плес, составь описание для сайта МутноСофта без спойлеров и тэга кода, а то при рипе кода страницы все остальные страницы на сайте слетают.
gamecreator
да спойлеры это для форума. их можно смело убирать. а код просто выделить отступом и шрифтом.

кстати, название языка в следующей версии может измениться.
gamecreator
вышла новая версия

Добавлено ([mergetime]1277053149[/mergetime]):
подробности в первом сообщении темы
Guevara-chan
Хм, ну вот и название появилось - может уже можно приступить к реализации идеи с анонсами ?
gamecreator
Анонс номер 1: будут коменты и считывание данных, а может даже и файлы
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.