ТОМ2: функции: различия между версиями
ASBer (обсуждение | вклад) м |
ASBer (обсуждение | вклад) м (→Назначение) |
||
Строка 5: | Строка 5: | ||
Пример вызова фукции: | Пример вызова фукции: | ||
Дай мяч Маше | Дай мяч Маше | ||
+ | |||
+ | Строка кода может содержать несколько функций, вызываемых последовательно. При этом результат одной функции может являться аргументом для другой функции. | ||
+ | |||
+ | Подбор функций, подчиненность их в строке и порядок вызова определяется парсером самостоятельно. | ||
==Синтаксис== | ==Синтаксис== |
Версия 13:41, 24 января 2014
Назначение
Функции в ТОМе используются в командной строке и в коде игры. В отличие от других языков функции ТОМа не имеют имён и подбираются исключительно по аргументам.
Пример вызова фукции:
Дай мяч Маше
Строка кода может содержать несколько функций, вызываемых последовательно. При этом результат одной функции может являться аргументом для другой функции.
Подбор функций, подчиненность их в строке и порядок вызова определяется парсером самостоятельно.
Синтаксис
fn_type ( arg_list ) { code }
Где:
- fn_type - тип функции: expression (выражение), action (действие), fact (факт);
- arg_list - список аргументов;
- code - код тела функции, разделённый на секции.
список аргументов
arg_list
Синтаксис:
arg_type [arg_name] [#arg_key] [, arg_type [arg_name] [#arg_key]] ...
Аргументы в списке разделяются запятой или точкой с запятой.
Описание аргумента состоит из типа, имени и ключа, обязательным является только тип, остальные элементы могут быть опущены.
arg_type
Тип влияет на подбор значений на роль аргумента функции. В качестве типа может быть указано одно из следующего:
- Тип значения: bool, string, number, course, spcvalue, object, attribute, class, location, word, preposition, and-list, or-list.
- Класс значения. Пример: "предмет", "существо" и т.п.
- Имя объекта. Для объектных значений, имеющих имена, в качестве типа можно указывать имя конкретного объекта.
- Произвольный литерал - должен в точности совпасть со словом, введенным игроком. Пример: "трах-тибидох"
arg_name
Имя переменной, которой будет передано значение аргумента в контексте выполнения функции.
Если имя переменной не указано, значение в функцию не передаётся, но по-прежнему влияет на подбор функций.
arg_key
Ключ, которому должно соответствовать значение аргумента.
Пример: #ВпЕч - значение должно находиться в винительном падеже единственного числа.
В состав ключа могут входить шаблоны '!' и '*'.
- * - подходит любое свойство ключа;
- ! - в ключе не должно быть указанного свойства.
Пример: #*п!е - у значения должен быть любой падеж, и не должно быть отрицания.
Если ключ не указан, проверка значения на соответствие ключу не проводится.
Типы функциий
Строка кода (команды) в ТОМе обрабатывается в 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 //по умолчанию никуда нельзя пройти }