Lit (Лит) - Это язык программирования, компилируемый в JSON.
- Должен быть один, и только один оператор на каждой строке.
- Некоторые операторы (типа writestr и writenum) могут писаться раздельно (т.е. write ... str, write ... num).
- Операторы могут находиться в любом месте строке.
Память в Lit'е своеобразна. Есть три зарезервированных 'стека' памяти: main, outstr и outnum. main нужен для непосредственно самой программы, outstr для вывода строк и outnum для вывода чисел. Два последних 'стека' очищаются после выполнения каждой строки
Есть также и временная память. С ней и взаимодействует большинство операторов. Временная память НЕ зависит от текущего, выбранного стека памяти.
В Lit'е есть лишь три типа данных: Number, String (преобразуется в Number), Identifier (Идентификатор)
Операторов в Lit'е довольно много и их достаточно для большинства задач:
| Название | Необходимые аргументы | Типы аргументов | Предназначение |
|---|---|---|---|
| declare | Название нового стека памяти | Identifier | Объявляет новый стек памяти |
| sleep | Количество секунд | Number | Ждёт указанное количество секунд |
| tpop | ALL/Адреса | Identifier/Number.. | Выталкивает значения из текущего стека памяти во временную память по адресам/все, если указан ALL |
| pull | ALL/Адреса | Identifier/Number.. | Берёт значения из текущего стека памяти во временную память по адресам/все, если указан ALL |
| add | Адрес 1/Адрес 2 | Number, Number | Берёт значения из временной памяти по адресам и складывает их, добавляя результат во временную память вместо аргументов |
| sub | Адрес 1/Адрес 2 | Number, Number | Берёт значения из временной памяти по адресам и вычитает одно из другого, добавляя результат во временную память вместо аргументов |
| mul | Адрес 1/Адрес 2 | Number, Number | Берёт значения из временной памяти по адресам и перемножает их, добавляя результат во временную память вместо аргументов |
| div | Адрес 1/Адрес 2 | Number, Number | Берёт значения из временной памяти по адресам и делит одно на другое, добавляя результат во временную память вместо аргументов |
| mod | Адрес 1/Адрес 2 | Number, Number | Берёт значения из временной памяти по адресам и добавляет остаток от деления во временную память вместо аргументов |
| inp | Сообщение при вводе/Ничего | String/None | Ждёт ввод пользователя, после чего записывает его во временную память. Пытается преобразовать в int'ы, если не получается - пишет ввод посимвольно, кодируя каждый символ в UTF-8 |
| mergewith | Стек1/THIS, Стек2/THIS | Identifier, Identifier | Добавляет в стек2 значения из стека 1. Кл. слово THIS обозначает текущий стек |
| rawmergewith | Стек1/THIS, Стек2/THIS | Identifier, Identifier | Перетаскивает в стек2 значения из стека 1. Кл. слово THIS обозначает текущий стек |
| mforward | Стек, Адреса/ALL | Identifier, Number../Identifier | Добавляет значения из текущего стека в указанный, по адресам/все, если указан ALL |
| forward | Стек, Адреса/ALL | Identifier, Number../Identifier | Добавляет значения из временной памяти в указанный стек, по адресам/все, если указан ALL |
| push | (Стек, Адреса/ALL)/(SOFT, Адреса) | (Identifier, Number..)/(Identifier, Number..) | Перетаскивает значения из временной памяти в текущий стек (убирая их из временной памяти) по адресам/все, если указан ALL; с SOFT просто добавляет значения из временной памяти в стек по адресам, ALL не поддерживается |
| cloneto | Стек1, Стек2 | Identifier, Identifier | Копирует память первого стека во второй, с полной заменой |
| tdel | Адреса/ALL | Number.., Identifier | Удаляет значения из временной памяти по адресам/все, если указан ALL |
| mdel | Адреса/ALL | Number.., Identifier | Удаляет значения из текущего стека по адресам/все, если указан ALL |
| ddel | Стек | Identifier | Удаляет стек памяти |
| writestr | Строка | String | Пишет строку во временную память, кодируя каждый символ в UTF-8 |
| writenum | Числа | Number | Пишет число во временную память |
| mark | Что угодно | - | Делает ничего |
| pair | Адреса+Значения | Number.. | Добавляет во временную память значения по адресам попарно (т.е. 0 1 2 pair 33 34 35 запишет во временную память 33 по адресу 0, 34 по адресу 1, 35 по адресу 2) |
| run | Подпрограмма | Identifier | Запускает подпрограмму по названию (Подробнее ниже) |
| pycall | Любая Python операция | String | Выполняет указанную операцию, если возвращаемый тип dict, list, int, str или None |
| equit | - | - | Выход из программы |
| lif | Адрес на число, которое 0/1 | Number | Если значение по адресу равно 1, то выполнение программы продолжится, если равно нулю, то следующий оператор будет пропущен |
| use | Стек | Identifier | Переключает текущий стек на указанный |
| goto | Строка | Number | Переходит на указанную строку кода |
В Lit'е есть так же и логические операторы, некоторые из них интуитивно понятны. Все из них принимают два адреса, участвующие в сравнении (Исключение: '!'. Он принимает лишь 1 адрес, функционирует так же, как и во многих других языках)
| Название |
|---|
| >= |
| <= |
| == |
| != |
| > |
| < |
Для сравнения строк же есть отдельные операторы: ='= и !'=, равен и не равен соответственно
='= Принимает начальный адрес текущего стека памяти и строку, и сравнивает их !'= Работает как ='= + !
Собрать код, написанный на Lit'е можно несколькими способами:
python lit.py -d файл.litДля непосредственного запускаpython lit.py -c файл.litЗапустить программу и создаст .json файл, который можно также запустить:python lit.py -r файл.jsonpython lit.py -b файл.litДля сборки кода на Lit в .json файл
Для того, чтобы можно было использовать оператор run, нужно собрать несколько файлов с кодом Lit, после чего их слинковать:
python lit.py -l файл1.json файл2.json..
Все файлы, кроме файл1.json - удалятся для того, чтобы не засорять место. Теперь можно использовать оператор run, в котором первый аргумент - это название файла без расширения.