ТОМ: язык программирования: различия между версиями

Содержимое удалено Содержимое добавлено
мНет описания правки
 
(не показано 119 промежуточных версий 2 участников)
Строка 1:
Справочник по языку программирования платформы [[ТОМ]].
 
Страничка заморожена. Все особенности ТОМа, не описанные ниже, являются недокументированными.
страничка в разработке...
 
{{Содержание справа}}
Строка 34:
 
=====key=====
ЛингвистическийМорфологический ключ - строка [[ТОМ: ЛингвистическийМорфологический ключ|специального формата]]. В лингвистических операциях может применяться без кавычек.
 
=====lexeme=====
Строка 42:
Пустое значение.
Обращение к несуществующим свойствам, функциям и переменным всегда возвращает null.
В логических операциях null выполняетэквивалентно рользначению 3го логического значения "неизвестно"false.
В операциях сравнения null не равен ни одному значению, кроме себя самого.
Все остальные операции с null всегда возвращают null.
 
Строка 49 ⟶ 50 :
 
====object.form====
Объект с указанными аспектом и формой. При присвоении преобразуется в строку, содержащую наименование объекта в требуемой форме.
 
====object.item====
Строка 104 ⟶ 105 :
 
=== Логические операции ===
Значение null в логических операциях эквивалентно false.
====! / не====
Логическое отрицание
 
====!, not, не (логическое отрицание)====
не true = false
 
не! falsetrue = truefalse
 
не! nullfalse = nulltrue
 
! null = true
 
====|, /||, or /, или (логическое сложение)====
Логическое сложение
 
true или|| true = true
 
true или|| false = true
 
truefalse или|| nulltrue = true
 
false или|| truefalse = truefalse
 
====&, &&, and, и (логическое умножение)====
false или false = false
 
falsetrue или&& nulltrue = nulltrue
 
true && false = false
null или true = true
 
false && true = false
null или false = null
 
false && false = false
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
 
===Лингвистические операторы===
Строка 166 ⟶ 144 :
Пример:
unique Test //создаем объект и задаем текстовые свойства
.{ title = "тестов% объект%; Мр; Ип; Ип=ы,; Рп=ого,а;"
. description = "описание тестового объекта"
. add_property = "дополнительное свойство"
}
 
Выводим аспекты объекта:
Строка 202 ⟶ 181 :
====Оператор ~====
Оператор используется для выделения части лингвистического ключа.
 
===Парсерные операторы===
Парсерные операторы позволяют передать объекту произвольную строку, которая далее анализируется парсером и обрабатывается подобно команде, введенной игроком.
 
Все парсерные операторы имеют одинаковый синтаксис:
Obj x Str
где:
*Obj - значение с типом объект,
*Str - значение с типом строка,
*x - один из следующих парсерных операторов:
==== > фраза диалога====
Оператор ">" используется для вставки в диалог фразы Str от имени Obj.
При этом фраза обрабатывается подобно фразе введенной игроком.
Т.е. другие персонажи могут отреагировать на произнесенную фразу запрограммированным для них образом.
 
==== < действие====
Оператор "<" предписывает объекту Obj выполнить команду Str.
Строка Str может содержать любую понятную (или не понятную) парсеру команду.
Команда будет обработана парсером аналогично команде, введенной игроком.
По умолчанию, если Obj не управляется игроком, сообщения парсера на экран не выводятся.
 
 
 
==Конструкции языка==
Строка 257 ⟶ 258 :
 
Результат: создана и инициализирована переменная X.
 
===Глобальные переменные===
Глобальные переменные на самом деле являются свойствами объекта global.
После объявления свойства global как:
global.X = 5
доступ к этому свойству возможен как к обычной переменной:
X = 55
var Y = X
В отличии от локальных переменных, глобальные переменные могут иметь относительные значения также как свойства объектов.
 
 
 
====global.secret====
Переменная предназначенна для передачи "секретного" сообщения между модулями игры.
Это единственная переменная, которая сохраняет свое значение при рестарте, при загрузке новой игры или при загрузке модуля игры.
 
 
 
==Константы==
===null / пусто===
*ИспользуетсяКонстанта используется в выражениях. Задает пустое значение.
 
===true, yes / истина, да===
*ИспользуетсяКонстанта используется в выражениях. Задает истинное логическое значение.
 
===false, no / ложь, нет===
*ИспользуетсяКонстанта используется в выражениях. Задает ложное логическое значение.
 
===frontend===
*Константа используется в выражениях. Возвращает строку с именем используемого интерфейса (исполняемого файла). Например "constom.exe" или "Milena.exe".
 
==Специальные контекстные значения==
===this===
''(только для чтения)''
 
Во время выполнения метода this указывает на объект, которому принадлежит выполняемый метод.
 
===act===
===actor===
===talker===
===addressee===
===told===
===addressed===
 
==Объекты==
Строка 278 ⟶ 312 :
===Свойства объектов===
Свойство объекта - это переменная, связанная с объектом. Все данные объекта хранятся в его свойствах. Доступ к свойствам осуществляется по их имени.
Синтаксис:
obj.prop = х //присваивает свойству 'prop' значение 'x'
var x = obj.prop //читает значение свойства 'prop'
 
Где:
====Относительные свойства объектов====
*obj - любой объект
*prop - имя свойства объекта
 
====Относительные значения свойств====
Помимо основного значения свойства объектов могут содержать относительные значения.
 
Синтаксис:
obj.prop = х //присваивает 'x' как основное значение свойства 'prop'
//все относительные значения свойства уничтожаются
obj.prop[] = х //присваивает 'x' как основное значение свойства 'prop'
//все относительные значения свойства сохраняются
obj.prop[i] = х //присваивает 'x' как относительное значение свойства 'prop' для 'i'
obj.prop = null //уничтожает основное и все относительные значения свойства 'prop'
obj.prop[] = null //уничтожает основное значениe свойства 'prop'
obj.prop[i] = null //уничтожает относительное значениe свойства 'prop' для 'i'
var x = obj.prop //читает значение свойства 'prop' для актера. Эквивалентно x = obj.prop[actor]
var x = obj.prop[] //читает основное значение свойства 'prop' независимо от actor
var x = obj.prop[i] //читает относительное значение свойства 'prop' для 'i'
 
Где:
*obj - любой объект
*prop - имя свойства объекта
*i - числовоe или строковое значение, либо объект
 
 
Основные отличия от массивов:
*нет такого понятия как размер массива;
*могут быть "дыры" в заполнении. Например, если значение .prop[3] не задано, то x = obj.prop[3] вернет основное значение obj.prop;
*индекс i может быть не только числом, но и строкой, а также объектом;
*если значение задано относительно класса, оно будет действовать для всех его элементов.
 
 
Пример использования:
class гном
{ ... }
unique великан
{ ... }
unique вход_в_шахту
{ //описание
описание = "Круглая дыра в скале"
описание[гном] = "Вход в шахту. Сделан гномами и для гномов" //действует для всех гномов
описание[великан] = "Маленькая мерзкая дыра в скале. Тебе туда не залезть. Пахнет гномами."
//флаги
можно_пройти[гном] = да //действует для всех гномов
можно_пройти[великан] = нет
}
 
===Элементы объекта===
Строка 297 ⟶ 382 :
 
Корзинка.item:пирожок[1] //возвращает 1й пирожок из корзинки
 
Также возможно согласование вложенных объектов:
Корзинка.item*Пп //возвращает перечень предметов из корзинки в предложном падеже.
 
===Методы объектов===
Строка 315 ⟶ 403 :
Пример:
location комната //создаем новую локацию
.{ title = "маленькая комната" //задаем наименование
. description = "это светлое и уютное помещение." //задаем описание
}
или
локация комната //создаем новую локацию
.{ наименование = "маленькая комната" //задаем наименование
. описание = "это светлое и уютное помещение." //задаем описание
}
Локация может содержать в себе другие локации, уникальные и счетные объекты, мыслимые объекты. Для [[TOM: язык программирования#Элементы объекта|элементов локации]] подразумевается что они находятся в этой локации.
 
Строка 353 ⟶ 443 :
=====Переменные в шаблоне=====
Шаблон может включать в себя переменные различных типов.
Переменная задается специальным знаком и именем роли после знака. После имени роли переменной может быть указан аспект и лингвистический ключ.
Например:
.шаблон = "осмотреть @Объект:Предмет*ВпЕч"
где:
*@ - символ, указывающий тип переменной;
*Объект - имя роли переменной;
*Предмет - аспект объекта;
*ВпЕч - лингвистический ключ.
Строка 375 ⟶ 465 :
Пример:
action NoSave
.{ шаблон = "save=сохранить"
}
Мышонок.NoSave( ){ %сохранение запрещено! }
Строка 394 ⟶ 485 :
Метод объекта action, имя которого совпадает с именем переменной в шаблоне, и который имеет один аргумент, совпадающий с этой же переменной, является проверкой для значений этой переменной.
action Осмотреть //создаем действие осмотреть
.{ pat = "осмотреть @Предмет" //добавляем шаблон с переменной "Предмет"
. Предмет(Предмет) //добавляем проверку для переменной "Предмет"
{
{ if(Предмет==pers)
if (Предмет == pers)
return "ты не можешь себя увидеть!" //сообщение об ошибке
return "ты не можешь себя осмотреть!" //сообщение об ошибке
}
}
 
Строка 406 ⟶ 499 :
phrase - специальная категория, предназначенная для описания диалоговых фраз, распознаваемых парсером.
 
 
===event / событие===
event - специальная категория, предназначенная для описания произошедших событий, распознаваемых парсером.
 
==Предопределенные объекты==
Строка 426 ⟶ 518 :
Персонажем может быть только уникальный объект.
 
При старте системы значением переменной pers ==является объект global.
 
 
Управление персонажем:
 
====Смена персонажа====
unique главный_герой //создаем уникальный объект
{
//... описание главного героя
}
pers = главный_герой //передаем управление на новый объект
 
Если смена персонажа приводит к изменению текущей локации, для новой локации вызывается обработчик события OnEnter().
===this / это===
Во время выполнения метода, this указывает на объект, которому принадлежит выполняемый метод.
 
===actor / актер===
actor указывает на объект, от имени которого выполняется действие.
actor не изменяется при вызове методов других объектов.
По умолчанию значения всех относительных свойств возвращаются относительно объекта actor.
 
===act / акт===
act указывает на объект категории action и соответствует действию, выполняемому в данный момент.
act имеет смысл в методах, вызываемых парсером и после парсера. Во всех остальных случаях значение act равно null.
 
==Предопределенные свойства==
[[Изображение:TOM_prop.gif]]
==Специальные поля значений==
===Свойства всех типов===
Для любого [[TOM: язык программирования#Типы данных|типа данных]] возможен доступ к дополнительным полям.
 
(Но не для всех типов данных эти поля имеют смысл).
 
====.typ / .тип====
''(только для чтения)''
 
Строка 460 ⟶ 543 :
Работает для всех типов данных.
 
====.str / .строка====
''(только для чтения)''
 
Строка 472 ⟶ 555 :
 
 
====.num / .число====
''(только для чтения)''
 
Строка 482 ⟶ 565 :
 
 
====.obj / .объект====
''(только для чтения)''
 
Возвращает "чистый" объект без примеси количества и положения.
 
====.key / .ключ====
''(только для чтения)''
 
 
====.pos / .поз====
''(только для чтения)''
 
Строка 503 ⟶ 586 :
Для прочих значений .pos возвращает null.
 
===СвойстваСпециальные свойства объектов===
====.name / .имя====
Возвращает программное имя объекта.
 
''(только для чтения)''
 
====.loc / .лок====
Возвращает локацию, в которой находится объект.
 
Строка 518 ⟶ 601 :
 
 
====.cls / .класс====
Синтаксис: O.cls
 
Строка 533 ⟶ 616 :
Где: C - объект категории class.
 
====.ctg / .категория====
Синтаксис: O.ctg
 
Строка 542 ⟶ 625 :
''(только для чтения)''
 
====.synlex / .синоним=лексема===
''(только для чтения)''
 
====.lexpat / .лексема=шаблон===
''(только для записи)''
 
====.pat / .шаблон====
Cвойство используется для установки [[TOM: язык программирования#Шаблоны|парсерных шаблонов]] для объектов категорий action, phrase и event.
Количество шаблонов для одного объекта не ограничено.
Строка 556 ⟶ 636 :
Пример
action осмотреть //создаем действие "осмотреть"
.{ pat = "осмотреть" //задаем 1й шаблон
. pat = "осмотреть @объект" //задаем 2й шаблон
. pat = "осмотреть @какой @объект" //задаем 3й шаблон
}
 
====.item / .элемент====
Свойство .item предоставляет доступ к [[TOM: язык программирования#Элементы объекта|вложенным объектам]].
 
====.title / .наименование====
 
===menu_name / заголовок_меню===
====.description / .описание====
 
====.menu_name / .заголовок_меню====
==Сообщения парсера==
Сообщения парсера хранятся в предопределенных глобальных переменных.
ТОМ инициализирует их при старте, затем они могут быть переопределены в любое время. Более того, свойства с этими же именами могут быть прописаны для актера, для действия или фразы, а также для объекта.
При возникновении ошибки парсер ищет необходимое сообщение для объекта относительно действия, если не найдено - для действия относительно актера, если не найдено - для актера, и затем в объекте global.
 
Для парсерных сообщений зарезервированы следующие имена:
===is_not_recognized===
*Это сообщение парсер выводит когда введенную команду не удалось сопоставить ни с одним шаблоном действий или фраз.
> подумай о сыре
Это предложение непонятно!
 
===number_is_expected===
*Это сообщение выводится когда в шаблоне команды указана числовая переменная, а игрок ввел слово. Например, ''первый'' вместо 1, или ''пара'' вместо 2.
> возьми несколько горошин
Необходимо указать число.
 
===unknown_word===
*Это сообщение выводится когда в команде использовано слово, не соответствующие ни одному объекту в игре, или написанное с ошибками.
> возьми горохи из мешка
Слово <горохи> мне неизвестно.
 
===incorrect_form===
*Это сообщение выводится когда слово в команде стоит в форме, не соответствующей форме, заданной в шаблоне команды.
> возьми горохом из мешка
"горохом" - слово в неверной форме.
 
===object_not_found===
*Это сообщение выводится когда найденный парсером объект находится вне текущей локации, при том что в шаблоне команды указано его обязательное присутствие.
> осмотри филина
Филин отсутствует.
 
===unusable_object===
* Это сообщение выводится когда найденный парсером объект не обладает свойством, указанном в шаблоне, или не принадлежит к классу, указанному в шаблоне.
> брось крота
Дядюшка-крот не годится для этого действия.
 
===too_difficult_statement===
*Это сообщение выводится в случае, если парсинг команды требует перебора вариантов, количество которых превышает разумные пределы.
 
===object_select===
*Это сообщение выводится при устранении неопределенности перед списком неоднозначно распознанных объектов:
> взять еду
Непонятно, что имелось в виду: малина в траве,
стручок гороха на грядке, стручок гороха в траве,
сушеные горошины в траве или малина на кустах;
 
===сan_not_execute===
*Это сообщение выводится когда введенная команда распознана, но для актера не задан метод для ее выполнения.
> Крот, осмотри мешок
Побойтесь бога! Крот слеп от рождения!
 
===no_reply===
*Это сообщение выводится когда введенная строка распознана как фраза, но никто из присутствующих в локации на неё не ответил.
> расскажите мне про лес!
Мышонку никто не ответил...
 
==Предопределенные методы объектов==
Строка 576 ⟶ 712 :
===menu() / меню()===
 
===.ChkMoveObj( ) / .ПроверкаПеремещенияОбъекта( )===
Метод вызывается перед попыткой перемещения объекта.
В этом методе можно разместить проверки на возможность перемещения.
Если метод возвратит true - перемещение выполняется, если false - отменяется.
 
===.BefMoveObj( ) / .ПередПеремещениемОбъекта( )===
Метод вызывается перед перемещением объекта.
 
===.AftMoveObjOnEnter( ) / .ПослеПеремещенияОбъектаНаВход( )===
Обработчик события вызывается в случае когда персонаж, управляемый игроком, входит в локацию.
Вызов происходит после перемещения персонажа в локацию, но до события AftMoveObj( ).
 
Также этот обработчик вызывается при переключении управления на другого персонажа, если персонажи находятся в различных локациях.
 
Метод OnEnter( ) должен быть определен для локации, но вызывается от имени управляемого персонажа.
 
===AftMoveObj( ) / ПослеПеремещенияОбъекта( )===
Метод вызывается после перемещения объекта.
 
===.background( ) / ФоновыеДействия( )===
Метод используется для описания фоновых действий.
 
После каждого хода вызывается для объекта global, локации, в которой находится pers, и для всех объектов, находящихся в той же локации что и pers, за исключением самого объекта pers.
 
===.persbackground( ) / ФоновыеДействияПерсонажа( )===
Метод используется для описания фоновых действий объекта pers.
 
Строка 598 ⟶ 742 :
 
==Функции==
===Преобразование типов===
===rnd() / шанс()===
===Работа со строками===
===set() / сет()===
===Прочие функции===
====rnd() / шанс()====
Синтаксис: rnd( )
* Функция возвращает логическое значение ''да'' или ''нет'' с вероятностью 50/50.
 
 
Синтаксис: rnd(X)
- где X - число больше нуля.
* Функция возвращает случайное число в диапазоне от 1 до X включительно.
 
====set() / сет()====
====input() / ввод()====
====media() / медиа()====
 
==Теги==
Строка 610 ⟶ 767 :
===Теги TOMа===
Ниже описаны теги, автоматически вставляемые ТОМом в выводимый текст в специальных случаях:
 
 
'''<location></location>'''
 
При входе персонажа в локацию автоматически отображается название локации и её описание.
Название локации при этом заключается в тег:
<location>Название локации</location>
Опираясь на этот тег, название локации в интерфейсной оболочке может быть выделено цветом или помещено в специальное поле.
 
 
Строка 630 ⟶ 779 :
Используя эти теги, интерфейсная оболочка может формировать меню в виде набора кнопок, списком или другим образом.
 
===Теги оболочки ConTOMConstom===
Интерфейсная оболочка ConTOM обрабатывает теги:
*<location></location> - выделяет наименование локации цветом.
*<menu></menu> - выделяет строку меню цветом.
*<pause> - приостанавливает вывод текста до нажатия любой кнопки.
*<clear> - очищает экран.
*<nowiki><font color=Color></nowiki> - изменяет цвет шрифта. Color должен быть из списка: black, navy, green, teal, maroon, purple, olive, silver, gray, blue, lime, aqua, red, fuchsia, yellow или white.
*<nowiki></font></nowiki> - возвращает серый цвет шрифта.
Строка 671 ⟶ 821 :
===exit, quit, выход===
Команда закрывает приложение без сохранения данных.
 
[[Категория:Документация ТОМ]]