program — выражение на маленьком скобочном языке. Вычислите его и верните целое число.
Выражение — это одно из:
- целое число, возможно отрицательное, например 7 или -12;
- имя переменной — строчная латинская буква, за которой могут идти строчные буквы и цифры;
- (add e1 e2) — сумма значений e1 и e2;
- (mult e1 e2) — произведение значений e1 и e2;
- (let v1 e1 v2 e2 ... vk ek body) — по очереди присваивает переменной v1 значение e1, затем v2 значение e2 и так далее (каждое следующее выражение уже видит предыдущие присваивания), а потом возвращает значение body. Пар «имя — выражение» хотя бы одна.
Каждый let открывает собственную область видимости: присваивания внутри него не видны снаружи. Когда встречается имя переменной, её значение берётся из ближайшей объемлющей области, где она задана.
Слова add, mult и let никогда не используются как имена переменных. Все токены разделены ровно одним пробелом, выражение всегда корректно.program="(add 3 (mult 4 5))" → 23
Сначала 4 · 5 = 20, затем 3 + 20 = 23.
program="(let a 5 (add a (let a 10 (mult a 2))))" → 25
Внутренний let заводит своё a = 10, поэтому (mult a 2) даёт 20. Снаружи a по-прежнему равно 5, и ответ 5 + 20 = 25.
program="(let n 2 n (mult n n) n (add n -1) n)" → 3
Присваивания идут по порядку: n = 2, затем 2 · 2 = 4, затем 4 − 1 = 3.
program="(add 3 (mult 4 5))"
23
«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 91 тест на сервере, включая скрытые.