Skip to content

Latest commit

 

History

History
68 lines (62 loc) · 6.91 KB

File metadata and controls

68 lines (62 loc) · 6.91 KB

Документация

Язык ORsharp является полностью функциональным, и все сущности в нем являются функциями. В языке отсутствуют операторы (даже if и while представлены обычными встроенными функциями).

Тело программы состоит из последовательности операций разделенных запятыми (и именно корневое выражение должно вернуть число, которое и будет кодом возврата интерпретатора), всего операций три:

  • Комментарий
    Все что заключено между двумя символами решеток (#) является комментарием (возможны многострочные) и данный текст будет игнорирован интерпретатором. В функциональных языках комментарии особенно важны для описания "Что тут вообще происходит?!" Пример:
    # Рекурсивно вычисляем корень числа #
  • Выражение
    Выражения представляют из себя последовательность функций (подробнее - ниже) разделенных пробелом. Пример:
    print 5
  • Переменная
    Состоит из имени и "присваиваемого" ей выражения. Пример:
    pi = 3
  • Присваивание
    Состоит из имени и присваиваемого ей выражения. Отличие от переменной в том, что тут мы присваиваем уже вычисленное значение. Пример:
    pi = plus 3 4

Что такое выражение? Выражение это последовательность функций разделенных пробелом, при этом первая функция в последовательности называется опорной, а остальные - ее аргументами. При этом опорной функции на вход подается первый аргумент, а выход пары {опорная функция, аргумент} = {новая опорная функция}. Данную операцию следует повторять до тех пор пока список аргументов не станет пустым. Последняя опорная функция и есть результат выражения. Иными словами - опорная функция принимая на вход аргумент заменяет себя и этот аргумент новой опороной функцией.

Есть несколько типов функций которые можно встретить в выражении:

  • Число
    Целое число (может быть отрицательным). Пример:
    42
  • Выражение
    В качестве аргумента (или опорной функции) можно встретить другое выражение заключенное в скобки. Пример:
    mul (plus 5 8) (plus 1 3)
  • Строка
    На данный момент используется только для печати. Пример:
    "hello world"
  • Встроенная функция
    В языке уже присутствует ряд встроенных основных функций (подробнее - ниже). Пример:
    print
  • Пользовательская функция
    Есть возможность создавать собственные функции от нескольких аргументов. Функция состоит из аргументов перечисленных через запятую и операций. Пример:
    (x, y -> d = div x y, minus x (mul d y))

Ленивые аргументы

Ленивый аргумент это аргумент который передается как дерево которое нужно вычислить, а не как уже готовый результат, благодаря такому подходу нам не нужно вычислять аргумент который может не пригодиться в теле функции (и если такое требование звучит абсурдно в императивных ЯП, в функциональном вполне нормальная ситуцация). По умолчанию в ORsharp все аргументы передаются как ленивые, но если есть необходимость, аргумент можно вычислить перед его передачей взяв аргумент в скобки перед которыми будет знак '!'. Пример: mul n (factorial !(minus n 1)). Особенно это актуально в рекурсивных функциях, где зачастую аргумент функции может принимать в итоге "километровые" выражения, занимая слишком много памяти. Также отметим, что благодаря ленивым аргументам возможна реализация if как функции, а не оператора. В таком случае функция принимает условие, и в зависимости от его истинности делает опороной либо if либо else часть.

Встроенные функции

  • bigger (x, y)
    Вернет 1 если x>y, иначе - 0
  • break (x)
    Остановит while цикл и вернет из цикла x
  • div (x, y)
    Вернет целочисленное деление x/y
  • equal (x, y)
    Вернет 1 если x==y, иначе - 0
  • if (x, y, z)
    Вернет y если x!=0, иначе вернет z
  • input (_)
    Вернет число считанное с консоли
  • minus (x, y)
    Вернет разность x-y
  • mul (x, y)
    Вернет произведение x*y
  • or (x, y)
    Вернет 1 если x!=0 или y!=0. Если x!=0, проверки y не будет.
  • plus (x, y)
    Вернет сумму x+y
  • print (x)
    Выводит на печать x
  • sleep (x)
    Откладывает дальнейшее выполнение на x миллисекунд
  • while (x)
    Передает в функцию от одного аргумента x числа начиная с 1 с шагом 1. Итерация будет прекращена как только функция x вернет функцию break. Результатом while будет аргумент переданный в break.