TeoPlow / TeoBlow.github.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Документация для интерпретатора Functory

Введение

Добро пожаловать в документацию для интерпретатора Functory! Этот интерпретатор предназначен для компиляции языка программирования Sinenkiy.

Установка

Зависимости

Для работы интерпретатора Functory требуется установка следующих зависимостей:

  • F#
  • .NET

Установка

  1. Скачайте архив с исходным кодом интерпретатора с GitHub: ссылка.
  2. Разархивируйте скачанный архив в удобном для вас месте.
  3. Зайдите во внутрь папки ./src и открыть внутри неё консоль.
  4. Напистаь в консоли dotnet build -o bin/Release
  5. Далее программа интерпретатора появится в папке .\src\bin\Release\, а именно functory или functory.exe.

Использование

Для компиляции программы на языке Sinenkiy выполните следующие шаги:

  1. Создайте файл с исходным кодом вашей программы с расширением .sin.

  2. Запустите интерпретатор командой в консоли:

    functory.exe ваш_файл.sin

    (functory.exe расположен в .\src\bin\Release\)

  3. Результат работы программы выведется в консоль.

Расширения

У нашего интерпретатора есть официальное расширение для Visual Studio Code. Для установки перейдите во вкладку Extensions и введите название: FunctoryExtensionPack или перейдите по ссылке.

Синтаксис

Основы синтаксиса

В языке Sinenkiy достаточно простой синтаксис и вот его основные постулаты:

  1. Все синтаксические функции языка должны разделяться ;.

    После всех объявлений переменных.

        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;
    
  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;};
    
  3. Табуляции и лишние пробелы в коде не влияют на компиляцию, кроме случаев, описанных выше.

        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, функции списка.

Функция print

Выводит значение переменной без переноса строки.

Если переменная равна true, выводит 1.

Если переменная равна false, выводит 0.

val tolya = 5;
print(tolya);
print(tolya);

Вывод: 55

Функция println

Выводит значение переменной с переносом строки.

val tolya = 5;
println(tolya);
print(tolya);

Вывод:

5
5

Оператор условия If-Else

Программа проверяет истинность условия, указанного после ключевого слова 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

Оператор func(x)

Создаёт функцию, которая может работать с несколькими параметрами.

Пример использования функции с несколькими параметрами:

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 "путь-к-файлу"

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

About

License:MIT License