Добро пожаловать в документацию для интерпретатора Functory! Этот интерпретатор предназначен для компиляции языка программирования Sinenkiy.
Для работы интерпретатора Functory требуется установка следующих зависимостей:
- F#
- .NET
- Скачайте архив с исходным кодом интерпретатора с GitHub: ссылка.
- Разархивируйте скачанный архив в удобном для вас месте.
- Зайдите во внутрь папки
./src
и открыть внутри неё консоль. - Напистаь в консоли
dotnet build -o bin/Release
- Далее программа интерпретатора появится в папке
.\src\bin\Release\
, а именноfunctory
илиfunctory.exe
.
Для компиляции программы на языке Sinenkiy выполните следующие шаги:
-
Создайте файл с исходным кодом вашей программы с расширением
.sin
. -
Запустите интерпретатор командой в консоли:
functory.exe ваш_файл.sin
(functory.exe расположен в
.\src\bin\Release\
) -
Результат работы программы выведется в консоль.
У нашего интерпретатора есть официальное расширение для Visual Studio Code. Для установки перейдите во вкладку Extensions
и введите название: FunctoryExtensionPack
или перейдите по ссылке.
В языке Sinenkiy достаточно простой синтаксис и вот его основные постулаты:
-
Все синтаксические функции языка должны разделяться
;
.После всех объявлений переменных.
val a = 5; val b = 6;
После конструкций 'If-Else', если она не находится внутри другой функции.
if a == b { val c = 5; } else { val c = 9; };
После конструкции 'print' и 'println'.
val a = 8; println (a); print (a);
После конструкции 'func(x)`.
val fact = func(x) { if x <= 1 { 1 } else { x * fact(x - 1) } };
Но НЕ после комментария!
^_^ Этот код задаёт а = 4 val a = 2 + 2;
-
Между оператором объявления переменной и самой переменной всегда должен быть пробел! Есть ряд случаев, где пробел не обязателен, например, где рядом есть знаки математических операций или
{}
. Они автоматически являются разделителями.Пример:
val __ab_oba1234 =5; val b = 6; println(b); print (b); if b == 6 { print (__ab_oba1234) };
Снизу показаны примеры, как НЕЛЬЗЯ писать!
vala=5; valb = 6; println b; print b; ifc = d {print a;};
-
Табуляции и лишние пробелы в коде не влияют на компиляцию, кроме случаев, описанных выше.
val g = 3; val c = -6;
Для объявления переменных необходимо написать val
, название переменной, знак =
, значение переменной.
Например:
val fpspfidh = 155;
val _yehAsd129 = 73638;
Значением переменной может быть число
, арифметическая операция
, переменная
, функция
, список
.
Например:
val a = -123;
val b = (a - 124) * 4;
val c = a;
val fact = func(x) {};
val g = fact(3);
val list = [a, b, c];
Комментарии могут начинаться с разных наборов символов - смайликов и идут до конца строки.
Вот примеры поддерживаемых знаков для комментария: ^_^
, //
.
Часть кода, который закоментирован в компиляции участвовать не будет.
Коментарии можно ставить в любой части строки.
>_< Например вот так.
val a = 2 + 2;
>_< val b = 5;
println (a); // Это комментарий
В этом случае val b = 5
, Например вот так.
, Это комментарий
не попадут в компиляцию.
В нетипезированном языке Sinenkiy поддерживаются такие "типы данных", как целые числа
, числа с плавающей точкой
, строки
, списки
.
Числа представляют собой обычные десятичные числа.
>_< Целые числа
val int = 4;
Числа с плавающей точкой представляют собой обычные десятичные числа. Разделителем между целой частью и дробной является точка.
>_< Числа с плавающей точкой
val float = 115.0001;
Строки представляют собой набор символов. Записываются внутри кавычек ""
. Этот "тип данных" используется только для вывода в функциях print
, println
.
>_< Строки
val string = "tolya";
Списки представляет собой упорядоченную коллекцию элементов. Элементы списка могут быть любого типа данных: числа
, числа с плавающей точкой
, строки
, другие списки
.
Элементы записываются через запятую внутри квадратных скобочек []
.
>_< Списки
val list1 = [int, string, float, list];
При работе со списками, можно пользоваться функциями списка, об этом подробнее в разделе с функциями.
Язык Sinenkiy поддерживает операции над числами, такие как сложение
, вычитание
, умножение
, деление
.
Все арифметические операции пишутся в одном синтаксическом стиле:
(число
операция число
)
Число
может быть как и просто числом:
-1
, 10.9
, 1212341.9999
, 0
Так и итогом арифметической операции:
(1 + 2)
, ((2 * 3.1) - 1)
, (((4.2 / 2) + 1) * 5)
Примеры:
val a = -2;
val b = a + -5;
val t = (-5 - -2) * -3;
val c = (a + b) * 2.3;
val g = (((((c + 1) + 2) + 3) + 4) + 5) + 6;
val f = (((c + g)));
Снизу показаны примеры, как НЕЛЬЗЯ писать!
val c = a + b * 2;
val g = c + 1 + 2 + 3 + 4 + 5 + 6;
Обычная операция сложения. Записывается как: (число
+ число
)
>_< Сложение
val a = -2 + 3;
val b = 1+2;
val c = a + b;
print(c);
Вывод: 4
Обычная операция вычитания. Записывается как: (число
- число
)
>_< Вычитание
val a = 2 - 1;
val b=5-2;
val c=a- b;
print(c);
Вывод: -2
Обычная операция умножения. Записывается как: (число
* число
)
>_< Умножение
val a = 2 * 1;
val b=5*2;
val c=a *b;
print(c);
Вывод: 20
Обычная операция деления. При делении на 0
интерпретатор выдаст ошибку.
>_< Кратное деление
>_< Будет 12
val a = 12 / 1;
>_< Будет 3
val b=6/2;
>_< Будет 4
val c=a / b;
print(c);
Вывод: 4
>_< Деление некратных чисел
>_< Будет 2.1666666...
val a = 13 / 6;
>_< Будет 4.5
val b=9/2;
>_< Будет 0
val c=a / b;
print(c);
Вывод: 0,481481
В нашем языке есть базовые функции вывода в консоль print
, println
, оператор условия If-Else
, операторы сравнения, оператор func(x)
, функция import
, функции списка.
Выводит значение переменной без переноса строки.
Если переменная равна true
, выводит 1
.
Если переменная равна false
, выводит 0
.
val tolya = 5;
print(tolya);
print(tolya);
Вывод:
55
Выводит значение переменной с переносом строки.
val tolya = 5;
println(tolya);
print(tolya);
Вывод:
5
5
Программа проверяет истинность условия, указанного после ключевого слова if
.
Если условие истинно (то есть возвращает true), выполняется блок кода в {...}
, следующий за if
.
Если условие ложно (то есть возвращает false), программа переходит к выполнению блока кода в {...}
, указанного после ключевого слова else
.
If
можно использовать без else
.
Пример:
val a = 5;
val b = 5;
if a > b { print(a) } else { print(b) };
if a == b { println(a) };
Оператор сравнения ==
возвращает true
- если числа равны, false
- в остальных случаях.
Оператор сравнения !=
возвращает true
- если числа не равны, false
- в остальных случаях.
Оператор сравнения >=
возвращает true
- если числа равны или первое число больше, false
- в остальных случаях.
Оператор сравнения <=
возвращает true
- если числа равны или первое число меньше, false
- в остальных случаях.
Оператор сравнения >
возвращает true
- если первое число больше, false
- в остальных случаях.
Оператор сравнения <
возвращает true
- если первое число меньше, false
- в остальных случаях.
Пример 1:
val a = 4;
val b = 3;
println(a == b);
Вывод: 1
Пример 2:
val a = 5;
val b = 3;
if a != b { print(a) } else { print(b) };
Вывод: 5
Создаёт функцию, которая может работать с несколькими параметрами.
Пример использования функции с несколькими параметрами:
val add = func(x, y, z) {
x + y + z
};
val a = add(1);
val b = а(2)
println(b(3));
Вывод: 6
Пример использования функции для создания факториала.
val fact = func(x) {
if x <= 1 {
1
} else {
x * fact(x - 1)
}
};
println(fact(fact(3)));
Вывод: 720
Считывает файл и позволяет получить доступ ко всем значениям из указанной внутри файла программы.
Записывается как: import "путь-к-файлу"
import "C:/Programs/fp-compiler-lab-functory/src/other.sin"
val fact2 = func(x) {
fact(fact(x))
};
val pow2 = func(x) {
x * x
};
println(pow2(3.3));
Вывод:
5
5
Функция head
возвращает голову списка.
val list = [1, 2, 3];
println(head(list));
Вывод: 1.0
Функция tail
возвращает хвост списка, тобишь всё кроме головы.
val printlist = func(_list) {
if is_empty(_list) {
} else {
println(head(_list));
printlist(tail(_list))
}
};
val list = [1, 2, 3];
printlist(tail(list));
Вывод:
2.0
3.0
Вот пример вывода элементов списка по отдельности.
>_< Списки
val list = [1, 2, 3];
println(head(list));
println(head(tail(list)));
println(head(tail(tail(list))));
Вывод:
1.0
2.0
3.0
Функция append
вставляет эллемент в начало списка. Сначала принимает список, потом элемент.
Записывается как: append(список, элемент);
val list = append([1, 2, 3, 4, 5], 9);
printlist(list);
Вывод:
9.0
1.0
2.0
3.0
4.0
5.0
Функция concat
соеденяет два списка в один.
Записывается как: concat(список, список);
val list = concat([1,2,3], [4,5,6]);
printlist(list);
Вывод:
1.0
2.0
3.0
4.0
5.0
6.0
Функция is_empty
проверяет, пустой ли список. Если пустой, возвращает true
, иначе false
.
Записывается как: is_empty(список);
val list = [1,2,3];
println(is_empty(list));
Вывод:
0
val list = [];
println(is_empty(list));
Вывод:
1
В случае возникновения ошибок компиляции, интерпретатор F# выводит сообщения об ошибках с указанием строки и места возникновения ошибки. Наш интерпретатор пока что не выводит ошибки.
Если у вас возникли вопросы или проблемы с интерпретатором, обратитесь к разработчикам по адресу kruyneg@ya.ru или откройте issue на GitHub.
интерпретатор Functory распространяется под лицензией MIT. Подробнее о лицензии можно узнать в файле LICENSE.
Версия 0.1 (5 мая 2024): Первый бета релиз интерпретатора Functory. Версия 1.0 (15 мая 2024): Полноценный первый релиз интерпретатора Functory.
Юрков Евгений Юрьевич - Главный разработчик интерпретатора
Козырев Пётр Андреевич - Разработчик интерпретатора
Мамонтов Егор Олегович - Специалист по технической документации
Комбаров Владислав Александрович - Разработчик расширения для VS Code