ТОМ2: функции: различия между версиями

Материал из IFВики
Перейти к навигации Перейти к поиску
м (список аргументов)
м (список аргументов)
Строка 32: Строка 32:
  
 
[[ТОМ2: Ключ|Ключ]], которому должно соответствовать значение аргумента.  
 
[[ТОМ2: Ключ|Ключ]], которому должно соответствовать значение аргумента.  
 +
 
Пример: #ВпЕч - значение должно находиться в винительном падеже единственного числа.
 
Пример: #ВпЕч - значение должно находиться в винительном падеже единственного числа.
 +
 
В состав ключа могут входить шаблоны '!' и '*'.
 
В состав ключа могут входить шаблоны '!' и '*'.
 
* * - подходит любое свойство ключа;
 
* * - подходит любое свойство ключа;
 
* ! - в ключе не должно быть указанного свойства.
 
* ! - в ключе не должно быть указанного свойства.
 
Пример: #*п!е - у значения должен быть любой падеж, и не должно быть отрицания.
 
Пример: #*п!е - у значения должен быть любой падеж, и не должно быть отрицания.
 +
 
Если ключ не указан, проверка значения на соответствие ключу не проводится.
 
Если ключ не указан, проверка значения на соответствие ключу не проводится.
  

Версия 13:48, 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м этапах. На этапе парсинга происходит перебор вариантов, поэтому код, участвующий в парсинге, может вызываться множество раз. Выполнение же строки происходит лишь при условии ее однозначного разбора и выполняется только 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 //по умолчанию никуда нельзя пройти
}