Язык 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.