Интерпретатор каррирования и композиции
Задача по программированию с проверкой онлайн
- Сложность
- Сложная
- Языки
- Python
- JavaScript
- TypeScript
- Java
- Go
- Темы
- Функции и замыкания
- Разбор и проверка данных
- Исключения
Вычислите выражение expression маленького функционального языка. Выражение — это число (целое, возможно с минусом: -7) или имя встроенной функции, за которым может идти несколько применений в скобках: f(a, b)(c)…; аргументы — снова выражения. Значение — либо целое число, либо функция. У каждой встроенной функции есть арность (число аргументов):
add,sub(первый минус второй),mul,max— арность 2, аргументы — числа;neg(смена знака),inc(+1) — арность 1, аргумент — число;id— арность 1, возвращает аргумент как есть (число или функцию);compose(f, g)— арность 2,fиg— функции; результат — функция арности 1:x ↦ f(g(x));twice(f)— арность 1,f— функция; результат — функция арности 1:x ↦ f(f(x));flip(f)— арность 1,f— функция; результат — функция арности 2:(a, b) ↦ f(b, a).
Применение функции к аргументам каррировано: если аргументов меньше, чем осталось до арности, получается частично применённая функция, которая запоминает их; если ровно столько — функция вызывается; если больше — функция вызывается на нужном числе первых аргументов, а её результат применяется к остальным. Аргументы и применения вычисляются слева направо.
Если результат — число, верните его десятичную запись; если функция — строку <fn/k>, где k — сколько аргументов ей ещё не хватает. Если число применяют к аргументам, если функция попала туда, где нужно число, или число — туда, где нужна функция, сообщите об ошибке: бросьте исключение, в Go верните error. Выражение синтаксически корректно, скобки не бывают пустыми, все числа помещаются в 32-битное целое.
Пример: "compose(inc, mul(2))(5)" → "11".
Источник: задача CodeShare