Согласен с поправкой. Перечитал сегодня свой пост и понял: я только ввожу людей в заблуждение (sorry Det, если уже пришлось потратить своё время, пытаясь меня понять). Изначально выбранная аналогия с переменными/значениями не совсем верная. Движок q3 различает понятия команд и переменных (параметров), поэтому я только вношу лишнюю неразбериху. Гораздо корректнее (как это делают в большинстве квейковских faq-ов) говорить в контексте термина "алиас" и ассоциированных с ним набором команд. Так что решил я подкорректировать свои "измышлизмы" и ниже выкладываю исправленную версию. Т.к. я уже не могу редактировать своё вышесозданное сообщение, то просьба к админам: плиз, снесите в небытие мой субботний пост от 04:39, чтобы глаза не мозолил.
Добавлено (01.02.2009, 04:00)
---------------------------------------------
Итак, исправленный пост:
Quote (det)
Я хочу понять работу например следующих строк...
Начну с "лирики"...
Раз уж вы, det, программировали, то вам, наверное, известно, что в некоторых языках (как правило скриптовых) существуют специальные префиксы (и/или постфиксы) для того, чтобы интерпретатор мог отличить переменную от другой лексемы. Для примера можно взять виндошный cmd.exe. Создание переменной там почти такое же как и создание оной в консоли q3 или tremulous. Итак, запускаем cmd.exe и потихоньку начинаем "шаманить":
Отлично, переменная создана. Теперь попробуем распечатать её значение:
В ответ командный интерпретатор послушно выведет нам "myVar", а не "test", что явно не соответствует изначальному замыслу. Ага, точно: мы кое-что забыли! Поправляем:
Вот теперь порядок, вывели на экран значение переменной myVar. Похожая ситуация в консоли в треме. Требуется специальное ключевое слово "vstr" для того, чтобы отличить алиас от обычных команд или просто лексем. Например, вы создаёте алиас "ping" (можно сразу прямо в консоли):
Code
set ping "echo Hi server!!!"
А теперь наберите в консоли "ping" и нажмите ввод. Появится сообщение, вроде: "usage: ping [server]", т.е. вызвалась встроенная команда ping, а не ваш алиас. Но если вы наберёте "vstr ping", то выполнится заданная алиасом команда echo и вы увидите сообщение "Hi server!!!". Таким образом, встречая в скриптах совокупность
Code
vstr<пробел>ИМЯ_АЛИАСА
просто мысленно заменяйте это сочетание на последовательность команд, заданных для этого алиаса (обычно командой set или seta). Кстати, если ваше имя алиаса не совпадает с именем команды или переменной, то можно посмотреть его текущее "значение" (т.е. набор ассоциированных с алиасом команд) просто набрав имя алиаса в консоли и нажав enter. Либо ещё проще: наберите несколько первых символов имени вашего алиаса и нажмите tab.
Добавлено (01.02.2009, 04:00)
---------------------------------------------
Теперь от лирики можно перейти к разбору скрипта:
Code
1 bind p "vstr pingpong"
2 set ping "echo ping; set pingpong vstr pong"
3 set pong "echo pong; set pingpong vstr ping"
4 vstr pong
1-ая строчка "байндит" клавишу "p" на алиас pingpong (в нашем случае его значение будет динамически изменяться). Т.е. всякий раз при нажатии "p" будет выполняться командный текст, заданный для этого алиаса (в строчке может быть несколько команд, тогда они разделяются символом ";"). Самого алиаса ещё пока нет.
2-ая и 3-я создают соотв-нно алиасы ping и pong.
А теперь давайте сразу обратимся к 4-ой строчке, так м.б. проще раскручивать, хотя на деле, запуская команду /exec для вашего мини-скриптика, выполнение будет идти последовательно от 1-ой к 4-ой строчке. "vstr pong" означает выполнение того, что задано для алиаса pong, т.е. полностью эквивалентно тому, если бы вы набрали в консоли:
Code
echo pong; set pingpong vstr ping
... и нажали enter.
Что здесь происходит? Не забываем: мы ещё в 4-ой строчке. Вначале на экран выводится сообщение "pong", а затем создаётся алиас pingpong. В него заносится последовательность команд, заданная для алиаса ping, а именно: "echo ping; set pingpong vstr pong". Т.е. просто ассоциируется набор команд и ничего не выполняется. Спустя некоторое время вы таки решили нажать клавишу "р", и это эквивалентно тому, как если бы вы набрали и выполнили в консоли "echo ping; set pingpong vstr pong", т.е. по нажатию клавиши "p" вы вывели на экран уже другое сообщение ("ping") и присвоили алиасу pingpong иное значение (иную последовательность команд), а именно: "echo pong; set pingpong vstr ping" (при следующем нажатии клавиши "p" именно эти команды и выполнятся командным интерпретатором).
Подводя итоги, можно заметить нехитрую закономерность работы этого скриптика: при каждом нажатии "р" печатается текущее хранимое сообщение "ping" или "pong" и алиасу pingpong поочерёдно присваивается то значение алиаса ping, то значение алиаса pong.