ТОМ2: функции: различия между версиями
ASBer (обсуждение | вклад) м |
ASBer (обсуждение | вклад) м (→Типы функций) |
||
Строка 1: | Строка 1: | ||
{{содержание справа}} | {{содержание справа}} | ||
− | ==Типы | + | '''Функции''' |
+ | ==Синтаксис== | ||
+ | ''fn_type'' ( ''arg_list'' ) { ''code'' } | ||
+ | '''Где:''' | ||
+ | *''fn_type'' - тип функции: ''expression'', ''action'', ''fact''; | ||
+ | *''arg_list'' - список аргументов; | ||
+ | *''code'' - исполняемый код функции, разделённый на секции. | ||
+ | |||
+ | |||
+ | ==Типы функциий== | ||
Строка кода (команды) в ТОМе обрабатывается в 2 этапа: | Строка кода (команды) в ТОМе обрабатывается в 2 этапа: |
Версия 13:28, 24 января 2014
Функции
Синтаксис
fn_type ( arg_list ) { code }
Где:
- fn_type - тип функции: expression, action, fact;
- arg_list - список аргументов;
- code - исполняемый код функции, разделённый на секции.
Типы функциий
Строка кода (команды) в ТОМе обрабатывается в 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 //по умолчанию никуда нельзя пройти }