- Starlight Sky
Особенности нашего функционального языка: он ленивый, вычисления не будут делаться, пока не попросят; он не чувствителен к пробелам и табуляциям.
Реализованные функции:
- Именованные переменные (
let
) - Рекурсия
- Ленивое вычисление
- Функции
- Замыкания
- Комментарии
- Библиотечные функции: ввод-вывод файлов
- Списки
- Библиотечные функции: списки
- Стандартная библиотека
Для запуска собственных програм .mma
, необходимо скачать последний релиз из списка релизов, и запустить интерпретатор командой через консоль (windows):
./*PATH TO INTERPRETER*/Main.exe *PATH TO .mma FILES*
Либо самостоятельно собрав проект из исходных файлов, и также запустить, подав на вход аргументами командной строки пути к интерпретируемомым файлам.
⚠️ Важно: При запуске небходимо подавать файлы программ.mma
в том порядке, в котором находятся зависимости, например при использовании стандартной библиотеки, сначала подать на вход её, а затем файл, который будет её использовать
Допустимо использование флага tracing=true
для вывода отладочной информации (должен идти первым аргументом)
./*PATH TO INTERPRETER*/Main.exe tracing=true *PATH TO .mma FILES*
Также в комплекте поставляется стандартная библиотека, которую можно компилировать вместе со своими файлами standart_library.mma
. Её более подробное описание есть ниже.
Расширение - файл mmaextention-1.1.0.vsix
.
Для его установки во вкладке Extentions
>> Install from VSIX
>> файл расширения.
В языке присутствуют операции:
- сложения (
add(float, float)
) - вычитания (
sub(float, float)
) - умножения (
mul(float, float)
) - деления (
div(float, float)
)
А также, операции сравнения:
- равенства (
eq(_, _)
для строк и чисел типаfloat
) - неравенства (
neq(_, _)
для строк и чисел типаfloat
) - больше (
gt(float1, float2)
-float1 > float2
) - меньше (
lt(float1, float2)
-float1 < float2
) - больше или равно (
gte(float1, float2)
-float1 >= float2
) - меньше или равно (
lte(float1, float2)
-float1 <= float2
).
Переменные в языке определяются словом detect
как показано на примере ниже:
detect _fl_var = 13
printfn _fl_var
detect x = printfn "Hello world!"
x
Комментарии в языке определяются двумя символами *
, обозначающие начало и конец области:
detect _fl_var = 13 *
COMMENT example
printfn _fl_var <--- that will not printed
*
printfn _fl_var
Для написания функции необходимо воспользоваться ключевым словом lambda
. Для создания функции необходимо сделать патерну: lambda name_of_function [arguments, for, your, function] = {your code}
.
Для вызова функции необходимо воспользоваться знаком $
. Соответственно вызов функции имеет патерн: $ func_name [list, of, arguments]
. Пример:
lambda factorial [_x] = { if eq( _x, 1 ) => 1 else mul(_x, $ factorial [sub( _x, 1)]) }
printfn $ factorial [7]
printfn $ factorial [8]
В нашем языке представлены списки называемые catalog
(каталоги). Элементы внутри каталога разделяются при помощи |
. В каталоге могут находится любые сущности.
Пример каталога:
Для каталогов реализованы базовые операции, позволяющие делать все что угодно:
catalog_name сfirst
- возвращает первый элемент списка
printfn catalog (1 | 2 | x | catalog (5 | 10) | "Hi!") cfirst
catalog_name сtail
- возвращает хвост списка
detect list = catalog (1 | 2 | x | catalog (5 | 10) | "Hi!")
printfn list ctail
catalog_name_1' <-> 'catalog_name_2
- конкатенация каталогов.
detect list = catalog (1 | 2 | x | catalog (5 | 10) | "Hi!") <-> catalog (a | b | c)
printfn list
Или так
printfn catalog (1 | 2 | x | catalog (5 | 10) | "Hi!") <-> catalog (a | b | c)
element' ->> 'catalog_name
- добавление элемента в список.
printfn 4 ->> catalog(-5 | 10 | 2)
Для создания условий в язык введены if
, else
, =>
. Для строительства условного оператора необходимо придерживаться синтаксиса: if
conditions
=>
code_if_conditions_true
else
code_if_conditions_false
.
lambda check [x] = { if eq(x, 1 ) => printfn 1 else printfn 2 }
$ check [10]
Для вывода данных существует две функции print
и printfn
. Функции могут выводить string
, float
, catalog
, bool
в случае попытки вывести что-то иное, существует обработка ошибок.
Для операций с файлами существуют команды ReadFromFile
и WriteToFile
. В аргументах функции принимают: ReadFromFile path/to/file
и WriteToFile path/to/file string
. Пример синтаксиса работы с файлами:
detect x = ReadFromFile "tests.mma"
printfn x
WriteToFile "tests.mma" "Hello World!"
detect x = ReadFromFile "tests.mma"
printfn x
Вы можете найти другие примеры написанные на языке S_S
в папке примеров, а также их можно запустить с помощью интерпретатора.
Для упрощения работы с языком, написана стандартная библиотека.
catalog_search_by [catalog, function, start_value]
- поиск в списке последнего элемента, удволетворяющего фунции
Пример использования :
detect x = catalog (1 | 2 | 3 | 55)
lambda test [a, b] = {
if lt(a, b) => true
else false
}
printfn $ test[0, x cfirst]
printfn $ catalog_search_by [x, test, 0]
factorial [n]
- нахождение факториала числа
Пример использования :
printfn $ factorial [5]
pow [2, 10]
- возведение числа в степень
Пример использования :
printfn $ pow [2, 10]
filter [function, catalog]
- составление нового списка, где элемнты удволетворяют условию function
Пример использования :
lambda less_5 [x] = { lt(x, 5) }
printfn $ filter [less_5, catalog (1 | 2 | 10)]
sum_catalog [catalog]
- нахождение суммы каталога
Пример использования :
printfn $ sum_catalog [catalog(0 | 2 | 4 | 6)]
catalog_fold [catalog, funtion, acc]
- свёртка каталога
Пример использования :
lambda mult [a, b] =
{
mul(a, b)
}
printfn $ catalog_fold [catalog(1 | 2 | 4 | 6), mult, 1]
map [funcion, catalog]
- получение нового каталога, где к каждому элементу исходного применена функция
Пример использования :
lambda square [x] = { mul(x, x) }
printfn $ map [square, catalog (1 | 2 | 10)]
at_index [catalog, ind]
- поиск элемента по индексу
Пример использования :
printfn $ at_index [catalog (1 | 52 | 10), 1]
get_length [catalog]
- поиск длины списка
Пример использования :
printfn $ get_length [catalog (1 | 52 | 10 | true | x)]
Создатель | Обязанности |
---|---|
Михаил Губарев | Создание интерпретатора и структуры AST |
Максим Заславцев | Создание парсера и синтаксиса языка |
Андрей Забелкин | Расширение для VS code, документация |
Эссе на тему "Приёмы функционального программирования, как мы их использовали при выполнении курсовой, и как будем использовать в дальнейшей жизни" расположено тут.