ТОМ: язык программирования

Материал из IFВики
Версия от 17:02, 27 октября 2008; ASBer (обсуждение | вклад) (Вложенные объекты)
Перейти к навигации Перейти к поиску

Справочник по языку программирования платформы ТОМ.

страничка в разработке...

Содержание

Типы данных

Основные типы

Значения основных типов данных могут участвовать в выражениях и присваиваться переменным и свойствам объектов.

number

Число. Числовым типом может быть представлено любое целое число. Над данными числового типа действуют основные арифметические операции.

bool

Логический тип данных. Может принимать значение "да" (true) или "нет" (false). Над данными логического типа действуют операции булевой алгебры.

object

Объект. Объектным типом может быть представлен любой существующий объект. Значения этого типа предоставляют доступ к свойствам и методам объекта.

Помимо ссылки на объект, объектный тип данных несет дополнительную информацию о количестве объектов (.num) и о положении объекта (.pos).

Объектные переменные возвращаемые парсером, дополнительно несут информацию о том каким словом был назван объект в команде (.str) и в какой форме находится это слово (.key).

string

Строка. Строковым типом может быть представлена любая последовательность символов, в том числе и пустая. В выражениях строка заключается в двойные кавычки - "это строка".

key

Лингвистический ключ - строка специального формата. В лингвистических операциях может применяться без кавычек.

lexeme

Лексема - строка специального формата

null

Пустое значение. Обращение к несуществующим свойствам, функциям и переменным всегда возвращает null. В логических операциях null выполняет роль 3го логического значения "неизвестно". Все остальные операции с null всегда возвращают null.

Производные типы

Значения производных типов встречаются в выражениях, но при этом не могут быть присвоены переменным или свойствам объектов.

object.form

Объект с указанными аспектом и формой

object.item

Группа объектов, принадлежащих другому объекту, с указанными аспектом и формой

Преобразование типов

При использовании в операции данных различных типов, интерпретатор пытается привести правый операнд к типу левого операнда.


Например:

5 + "5" == 5 + 5 == 10

"5" + 5 == "5" + "5" == "55"

Операторы

=

Оператор "=" используется:


  • Для присвоения значений:

Синтаксис: A = Б

где: A - переменная или свойство, Б - значение или вычисляемое выражение

результат: переменной (свойству) А присваивается значение Б.


  • Для определения строчных синонимов:

Синтаксис: "А" = "Б" = "В"

где: А, Б, В - строки, не содержащие пробелов

результат: при парсинге строки Б и В подменяются строкой А


  • Для определения объектов-синонимов:

Синтаксис: A = Б

где: А и Б - объекты

результат: объект Б становится синонимом объекта А.

+, -, *, /

Математические операторы


==, !=-<>, >, <, >=, <=

Операторы сравнения значений


Логические операции

! / не

Логическое отрицание

не true = false

не false = true

не null = null


| / or / или

Логическое сложение

true или true = true

true или false = true

true или null = true

false или true = true

false или false = false

false или null = null

null или true = true

null или false = null

null или null = null


& / and / и

Логическое умножение

true и true = true

true и false = false

true и null = null

false и true = false

false и false = false

false и null = false

null и true = null

null и false = false

null и null = null

Лингвистические операторы

Для синтеза текста в выражениях используются операторы:

~, *, :

Оператор :

Оператор используется для указания аспекта объекта. В качестве аспекта может использоваться имя любого текстового свойства этого объекта. По умолчанию используется свойство title.

Пример:

unique Test //создаем объект и задаем текстовые свойства
.title = "тестов% объект%; Мр; Ип; Ип=ы,; Рп=ого,а;"
.description = "описание тестового объекта"
.add_property = "дополнительное свойство"

Выводим аспекты объекта:

%{Test:title} 
%{Test:description}
%{Test:add_property}

На экран выводится:

тестовый объект
описание тестового объекта
дополнительное свойство

Оператор *

Оператор используется для согласования формы объекта с лингвистическим ключом или другим объектом.

Оператор ~

Оператор используется для выделения части лингвистического ключа.

Конструкции языка

if-else / если-иначе

for / цикл

break / прервать

continue / продолжить

while / пока

break / прервать

continue / продолжить

switch-case / выбор-случай

Команды языка

%

Вывод текста на экран. Текстом считается вся строка после знака %.

%Тест //на экран будет выведен текст "Тест"

debug / отладка

  • debug on / отладка вкл - включает режим отладки;
  • debug off / отладка выкл - выключает режим отладки;
  • debug "message" / отладка "сообщение" - в режиме отладки выводит сообщение на экран.

run / запустить

  • run "file name" / запустить "имя файла" - запускает на исполнение указанный файл.
run "help.txt" //очистка данных, выполнение модуля help.txt

При этом происходит потеря всех текущих данных.

include / загрузить

  • include "file name" / загрузить "имя файла" - загружает и выполняет указанный файл.
include "help.txt" //выполнение модуля help.txt поверх существующих данных

Используется для модульной организации кода.

return / возврат

Переменные

Интерпретатор использует не типизированные переменные. Любой переменной можно присвоить значения любого типа.

Переменная, определенная в методе объекта, существует до конца выполнения метода.

Неинициализированная переменная имеет значение null.

var / переменная

Синтаксис: var X

Синтаксис: переменная X

Результат: создана переменная X, значение переменное равно null.


Синтаксис: var X = 0

Синтаксис: переменная X = 0

Результат: создана и инициализирована переменная X.

Константы

null / пусто

  • Используется в выражениях. Задает пустое значение.

true, yes / истина, да

  • Используется в выражениях. Задает истинное логическое значение.

false, no / ложь, нет

  • Используется в выражениях. Задает ложное логическое значение.

Объекты

Свойства объекта

Вложенные объекты

Объект может содержать в себе множество вложенных объектов. Смысловая интерпретация вложения одного объекта в другой может быть различной и зависит как от категорий объектов так и от замысла автора игры. Обращение к вложенным объектам осуществляется через специальное свойство .item

Корзинка.item //возвращает все объекты внутри корзинки
Корзинка.item.num //возвращает количество объектов внутри корзинки
Корзинка.item[3] //возвращает 3й объект в корзинке

Для вложенных объектов предусмотрен фильтр по аспекту

Корзинка.item:пирожок //возвращает все объекты, для которых определено свойство .пирожок
Корзинка.item:пирожок.num //возвращает количество пирожков внутри корзинки
Корзинка.item:пирожок[1] //возвращает 1й пирожок из корзинки

Методы объекта

Категории объектов

Все объекты в системе делятся на несколько предопределенных категорий. Каждая категория выполняет свою роль. Различия в поведении объектов разных категорий заложены на уровне платформы. Одни и те же операции для различных категорий выполняются по-разному.

location / локация

Объекты категории location используются для организации пространства игры. При входе персонажа в локацию автоматически отображается наименование (.title) и описание (.description) локации.

Пример:

location комната //создаем новую локацию
.title = "маленькая комната" //задаем наименование
.description = "это светлое и уютное помещение." //задаем описание

или

локация комната //создаем новую локацию
.наименование = "маленькая комната" //задаем наименование
.описание = "это светлое и уютное помещение." //задаем описание

unique / уникальное

class / класс

counting / счетное

mental / мыслимое

action / действие

action - специальная категория объектов, предназначенная для описания команд, распознаваемых парсером.

Шаблоны

Синонимы в шаблоне
Переменные в шаблоне

Шаблон может включать в себя переменные различных типов. Переменная задается специальным знаком и именем после знака. После имени переменной может быть указан аспект и лингвистический ключ. Например:

.шаблон = "осмотреть @Объект:Предмет*ВпЕч"

где:

  • @ - символ, указывающий тип переменной;
  • Объект - имя переменной;
  • Предмет - аспект объекта;
  • ВпЕч - лингвистический ключ.


В шаблоне возможно использование следующих типов переменных:

  • @ - объекты, присутствующие в текущей локации;
  • ~ - объекты, присутствующие в локации и подходящие для действия, но не упомянутые в команде напрямую;
  • & - объекты, независимо от их местонахождения;
  • # - числовая переменная;
  • $ - строковая переменная.
перегрузка системных команд

проверки

Методы объектов action используются в качестве проверок и вызываются парсером в процессе обработки анализируемой команды.

Проверка считается проваленной, если возвращает непустое строковое значение. Парсер выводит эту строку как сообщение об ошибке.

Использование методов в качестве проверок имеет некоторые принципиальные отличия:

  • Все переменные, определенные в проверяемом шаблоне, доступны во время выполнения проверки, независимо от того, указаны ли они в аргументах метода.
  • Все проверки работают в общем контексте. Т.e. переменная, созданная при выполнении проверки, доступна во всех проверках, выполняемых позже.
  • При наследовании объекта action от класса, методы класса также используются в качестве проверок. При перегрузке метода класса в наследнике, в качестве проверки последовательно выполняются и метод наследника и метод класса.
Проверки переменных

Метод объекта action, имя которого совпадает с именем переменной в шаблоне, и который имеет один аргумент, совпадающий с этой же переменной, является проверкой для значений этой переменной.

action Осмотреть //создаем действие осмотреть
.pat = "осмотреть @Предмет" //добавляем шаблон с переменной "Предмет"
.Предмет(Предмет) //добавляем проверку для переменной "Предмет"
{ if(Предмет==pers)
    return "ты не можешь себя увидеть!" //сообщение об ошибке
}
комбинационные проверки
порядок выполнения проверок

Предопределенные объекты

global / глобал

global - системный объект. Используется для хранения глобальных переменных и функций. Создается при старте системы.

global.title содержит наименование системы "ТОМ"

global.description - номер версии и прочую информацию.

Свойства и методы global доступны в контексте других объектов как глобальные функции и переменные.

pers / перс

pers - системная переменная, указывающая на объект, управляемый игроком.

Персонажем может быть только уникальный объект.

При старте системы pers == global


Управление персонажем:

unique GG //создаем уникальный объект

pers = GG //передаем управление на объект GG

pers.title = "главный герой" //меняем свойство GG

this / это

Во время выполнения метода, this указывает на объект, которому принадлежит выполняемый метод.

actor / актер

actor указывает на объект, от имени которого выполняется действие. actor не изменяется при вызове методов других объектов. По умолчанию значения всех относительных свойств возвращаются относительно объекта actor.

act / акт

act указывает на объект категории action и соответствует действию, выполняемому в данный момент. act имеет смысл в методах, вызываемых парсером и после парсера. Во всех остальных случаях значение act равно null.

Свойства объектов

Относительные свойства объектов

Предопределенные свойства объектов

.name / имя

Возвращает программное имя объекта.

(только для чтения)

.loc / .лок

Возвращает локацию, в которой находится объект.

Для уникальных объектов локация всегда определена. Для прочих категорий - зависит от обстоятельств.

(только для чтения)

.pos / .поз

(только для чтения)

.cls / .класс

Синтаксис: O.cls

Где: O - любой объект.

Возвращает объект, являющийся классом для объекта O.

Если класс не задан, O.cls возвращает null.

Для смены класса, свойству объекта .cls необходимо присвоить новое значение:

O.cls = С

Где: C - объект категории class.

.typ / .тип

Синтаксис: X.typ

Где: X - любое значение.

Возвращает строковое значение соответстующее типу значение X.

(только для чтения)

.ctg / .категория

Синтаксис: O.ctg

Где: O - любой объект.

Возвращает строковое значение соответстующее категории объекта O.

(только для чтения)

.str / .строка

(только для чтения)

.num / .число

(только для чтения)

.obj / .объект

(только для чтения)

.key / .ключ

(только для чтения)

.syn / .синоним

(только для чтения)

.lex / .лексема

(только для записи)

.pat / .шаблон

Cвойство используется для установки парсерных шаблонов для объекта категории action. Количество шаблонов для одного действия не ограничено.

(только для записи)

Пример

action осмотреть //создаем действие "осмотреть"
.pat = "осмотреть" //задаем 1й шаблон
.pat = "осмотреть @объект" //задаем 2й шаблон
.pat = "осмотреть @какой @объект" //задаем 3й шаблон

.item / .элемент

.title / .наименование

.description / .описание

.menu_name / .заголовок_меню

Обработка событий

Для каждого объекта можно задать реакцию на события, которые с ним происходят.

Нижеописанные методы выполняют обработку событий:

.ChkMoveObj( ) / .ПроверкаПеремещенияОбъекта( )

Метод вызывается перед попыткой перемещения объекта. В этом методе можно разместить проверки на возможность перемещения. Если метод возвратит true - перемещение выполняется, если false - отменяется.

.BefMoveObj( ) / .ПередПеремещениемОбъекта( )

Метод вызывается перед перемещением объекта.

.AftMoveObj( ) / .ПослеПеремещенияОбъекта( )

Метод вызывается после перемещения объекта.

.background( ) / ФоновыеДействия( )

Метод используется для описания фоновых действий.

После каждого хода вызывается для объекта global, локации, в которой находится pers, и для всех объектов, находящихся в той же локации что и pers, за исключением самого объекта pers.

.persbackground( ) / ФоновыеДействияПерсонажа( )

Метод используется для описания фоновых действий объекта pers.

После каждого хода вызывается только для объекта pers.

Функции

rnd() / шанс()

menu() / меню()

set() / сет()

Теги

ТОМ поддерживает вставку управляющих тегов в выводимый текст. Теги обрабатываются на стороне интерфейсной оболочки. Различные оболочки могут поддерживать различные наборы тегов. Для механизмов ядра ТОМа теги абсолютно прозрачны и ни как не влияют на его работу. Также есть несколько служебных тегов вставляемых в текст автоматически.

Теги TOMа

Ниже описаны теги, автоматически вставляемые ТОМом в выводимый текст в специальных случаях:

<location></location>

При входе персонажа в локацию автоматически отображается название локации и её описание. Название локации при этом заключается в тег:

<location>Название локации</location>

Опираясь на этот тег, название локации в интерфейсной оболочке может быть выделено цветом или помещено в специальное поле.

<menu></menu>, <menu_item></menu_item>

Для локаций автоматически генерируется строка меню. Строка меню включает специальные теги и имет следующий формат:

<menu>Заголовок меню: 
<menu_item>1 элемент меню</menu_item>, 
<menu_item>2 элемент меню</menu_item>,
<menu_item>3 элемент меню</menu_item></menu>

Используя эти теги, интерфейсная оболочка может формировать меню в виде набора кнопок, списком или другим образом.

Теги оболочки ConTOM

Интерфейсная оболочка ConTOM обрабатывает теги:

  • <location></location> - выделяет наименование локации цветом.
  • <menu></menu> - выделяет строку меню цветом.
  • <pause> - приостанавливает вывод текста до нажатия любой кнопки.
  • <font color=Color> - изменяет цвет шрифта. Color должен быть из списка: black, navy, green, teal, maroon, purple, olive, silver, gray, blue, lime, aqua, red, fuchsia, yellow или white.
  • </font> - возвращает серый цвет шрифта.

Все прочие теги консольной оболочкой игнорируются и не влияют на ее работу.

Системные команды

help, помощь, ?

run, start, запустить, загрузить

save, сохранить

load, восстановить

undo, отмена

restart, заново