simple interpretator of math expressions on javascript
Реализован на javascript с поддержкой возможности реализации функций на javascript.
Поддерживаются такие операторы, как: +, -, *, ^(возведение в степень), % (целочисленное деление), &&, ==, >=, <=, >, <, !=, ||. А так же тернарный оператор.
Пример:
13 + (5 - (12+2)^2)
Константы: pi, e, true, false, null
Функции: sin(x), cos(x), tan(x), log(x), min(x, y), max(x, y), length(x), not(x), call([args], var(x, y))
Функция not - Логическое отрицание
Функция var(name, value) - создание переменной name со значением value
Функция call - рекурсивный вызов текущей функции или лямбды
Пример расчета n-го числа Фибоначи
var('b', 15)
{n | n<3 ? 1 : call(n-1) + call(n-2)}(b)
Функция call здесь ссылается на лямбду
Имеют следующий синтаксис
{n|n * (n > 1 ? call(n-1) : 1)}(b)
До вертикальной черты (|) через запятую перечисляются аргументы, после возвращаемое значение. Результатом может быть другая лямбда. Аргументы функций и лямбд обладают ленивостью, то есть значение аргумента будет вычислено в момент обращения к нему внутри тела функции
По аналогии с javascript, функции и лямбды как переменные
(12>4 ? min : max)(13,17)
Из Haskell был заимствован оператор $ для скрытия закрывающих скобок:
13 + $ -12 + 6 + min $ 10, 12 соответствует 13 + ( -12 + 6 + min(10, 12))
Чтобы избежать необходимость закрытия парных кавычек в литерных константах, был реализован дополнительны синтаксис. @abc соответсвует строчной константе "abc". Поэтому допускается создание переменных таким образом var(@abc, "Hello world!")