Типы функций в ТОМ2

Строка кода (команды) в ТОМе обрабатывается в 2 этапа:
1. Парсинг.
2. Выполнение строки.
Вычисления и выполнение различных секций  функций могут происходить как на 1м, так и на 2м этапах. На этапе парсинга происходит перебор вариантов, поэтому код, участвующий в парсинге, может вызываться множество раз. Выполнение же строки происходит лишь при условии ее однозначного разбора и выполняется только 1 раз.
Любая строка, обработанная без ошибок, всегда возвращает значение, являющееся результатом её выполнения.

В программном языке ТОМ2 есть 3 типа функций:
• Выражения
• Действия
• Факты

Примеры выражений:
цвет стен
количество людей в комнате
некто, взявший 3 рубля
2 + 2
X + 3
X.type
Примеры действий:
покрась стены в зелёный цвет
возьми 3 рубля
run test.txt
Примеры фактов:
Цвет стен зеленый
в комнате 5 человек
X = 3

Выражения вычисляются на этапе разбора (парсинга) строки и не приводят к изменениям состояния игры.
Выражения могут входить в состав других сложных выражений, фактов или действий.
В качестве результата возвращается вычисленное значение выражения. Если вся строка является одним выражением, то вычисленное значение будет финальным результатом всей строки.

Действия изменяют состояние игры.
Действия не могут входить в состав других действий, фактов или выражений, за исключением условных конструкций.
На этапе парсинга определяется необходимое действие и подготавливаются его аргументы.
Выполнение действий происходит после однозначного разбора строки.

Факты применяются в качестве условий или вопросов, а так же как утверждения:
Если цвет стен зеленый, то …– условие;
Цвет стен зеленый? – вопрос;
Цвет стен зеленый. – утверждение;
Факты могут входить в состав логических выражений, а также как условия в состав условных конструкций.
На этапе парсинга строки происходит проверка факта. Результат проверки - всегда логическое значение. Для условий результат проверки влияет на дальнейшее выполнение условной конструкции, для вопросов результат проверки является финальным результатом строки, для утверждений результат не важен.
После однозначного разбора строки с утверждением происходит выполнение этого утверждения (в нашем примере стенам будет присвоен зелёный цвет). Выполнение утверждения изменяет состояние игры.


Зачем это нужно.
Разбор команд на естественном языке требует проведение вычислений уже на этапе парсинга, когда смысл строки еще не понятен. Для этого необходимо по разному  обрабатывать функции изменяющие и не изменяющие состояние игры. Изменение состояния игры допустимо только после однозначного разбора строки.