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

Материал из IFВики
Перейти к навигации Перейти к поиску
м (Fact (Факт))
м
Строка 1: Строка 1:
 
{{содержание справа}}
 
{{содержание справа}}
'''ТИПЫ ФУНКЦИЙ В ТОМ2'''
+
==Типы функций==
  
 
Строка кода (команды) в ТОМе обрабатывается в 2 этапа:
 
Строка кода (команды) в ТОМе обрабатывается в 2 этапа:
Строка 18: Строка 18:
 
Разбор команд на естественном языке требует проведение вычислений уже на этапе парсинга, когда смысл строки еще не понятен. Для этого необходимо по разному обрабатывать функции изменяющие и не изменяющие состояние игры. Изменение состояния игры допустимо только после однозначного разбора строки.
 
Разбор команд на естественном языке требует проведение вычислений уже на этапе парсинга, когда смысл строки еще не понятен. Для этого необходимо по разному обрабатывать функции изменяющие и не изменяющие состояние игры. Изменение состояния игры допустимо только после однозначного разбора строки.
  
== Expression (Выражение) ==
+
=== Expression (Выражение) ===
 
Выражения вычисляются на этапе разбора (парсинга) строки и ''не приводят к изменениям состояния игры''.
 
Выражения вычисляются на этапе разбора (парсинга) строки и ''не приводят к изменениям состояния игры''.
  
Строка 44: Строка 44:
 
  }
 
  }
  
== Action (Действие) ==
+
=== Action (Действие) ===
 
???
 
???
  
Строка 70: Строка 70:
 
  }
 
  }
  
== Fact (Факт) ==
+
=== Fact (Факт) ===
 
Факты применяются в качестве условий или вопросов, а так же как утверждения:
 
Факты применяются в качестве условий или вопросов, а так же как утверждения:
 
  Если цвет стен зеленый, то … // условие
 
  Если цвет стен зеленый, то … // условие

Версия 13:13, 24 января 2014

Типы функций

Строка кода (команды) в ТОМе обрабатывается в 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 //по умолчанию никуда нельзя пройти
}