ТОМ2: функции: различия между версиями
ASBer (обсуждение | вклад) м (→Action (Действие)) |
ASBer (обсуждение | вклад) м (→Fact (Факт)) |
||
Строка 87: | Строка 87: | ||
X = 3 | X = 3 | ||
− | '''Пример | + | '''Пример функции факта:''' |
fact(нельзя_пройти, локация, локация) | fact(нельзя_пройти, локация, локация) | ||
{ == check == | { == check == |
Версия 08:45, 15 мая 2013
ТИПЫ ФУНКЦИЙ В ТОМ2
Строка кода (команды) в ТОМе обрабатывается в 2 этапа:
- Парсинг
- Выполнение строки
Вычисления и выполнение различных секций функций могут происходить как на 1м, так и на 2м этапах. На этапе парсинга происходит перебор вариантов, поэтому код, участвующий в парсинге, может вызываться множество раз. Выполнение же строки происходит лишь при условии ее однозначного разбора и выполняется только 1 раз.
Любая строка, обработанная без ошибок, всегда возвращает значение, являющееся результатом её выполнения.
В программном языке ТОМ2 есть 3 типа функций:
- Выражения
- Действия
- Факты
Зачем нужно деление функций на три типа:
Разбор команд на естественном языке требует проведение вычислений уже на этапе парсинга, когда смысл строки еще не понятен. Для этого необходимо по разному обрабатывать функции изменяющие и не изменяющие состояние игры. Изменение состояния игры допустимо только после однозначного разбора строки.
Expression (Выражение)
Выражения вычисляются на этапе разбора (парсинга) строки и не приводят к изменениям состояния игры.
Выражения могут входить в состав других сложных выражений, фактов или действий.
В качестве результата возвращается вычисленное значение выражения. Если вся строка является одним выражением, то вычисленное значение будет финальным результатом всей строки.
Примеры выражений:
цвет стен количество людей в комнате некто, взявший 3 рубля 2 + 2 X + 3 X.type
Пример функции выражения:
// атрибуты expression(attribute Atr, object Ob) { == parsing == if :Ob.key != :Atr.key then fail, "несогласовано" Ok == execute == if :Ob.:Atr then return :Ob fail, "тут такого нет" }
Action (Действие)
???
Действия изменяют состояние игры.
Действия не могут входить в состав других действий, фактов или выражений, за исключением условных конструкций.
На этапе парсинга определяется необходимое действие и подготавливаются его аргументы.
Выполнение действий происходит после однозначного разбора строки.
Примеры действий:
покрась стены в зелёный цвет возьми 3 рубля run test.txt
Пример функции действия:
action(иди act*Пф, location напр*Ап) { == check == if loc = напр then fail, "ты уже здесь" if нельзя_пройти loc :напр then fail, "туда нет прохода" Ok == execute == goto :напр }
Fact (Факт)
Факты применяются в качестве условий или вопросов, а так же как утверждения:
Если цвет стен зеленый, то … // условие Цвет стен зеленый? // вопрос Цвет стен зеленый. // утверждение
Факты могут входить в состав логических выражений, а также как условия в состав условных конструкций.
На этапе парсинга строки происходит проверка факта. Результат проверки - всегда логическое значение. Для условий результат проверки влияет на дальнейшее выполнение условной конструкции, для вопросов результат проверки является финальным результатом строки, для утверждений результат не важен.
После однозначного разбора строки с утверждением происходит выполнение этого утверждения (в нашем примере стенам будет присвоен зелёный цвет). Выполнение утверждения изменяет состояние игры.
Примеры фактов:
Цвет стен зеленый в комнате 5 человек X = 3
Пример функции факта:
fact(нельзя_пройти, локация, локация) { == check == yes //по умолчанию никуда нельзя пройти }