Текстовый исполнительный язык программирования
В 1979 году Honeywell Information Systems анонсировала новый язык программирования для своей разделения времени службы под названием TEX , аббревиатура от системы обработки текста Text Executive . TEX был языком сценариев первого поколения, разработанным примерно во времена AWK и первоначально использовавшимся Honeywell в качестве внутреннего инструмента автоматизации тестирования систем.
TEX расширил линейный редактор службы разделения времени (TSS) Honeywell программируемыми возможностями, что дало пользователю больше свободы в разработке простых в использовании расширений редактирования, а также написании сценариев для автоматизации многих других задач разделения времени, которые раньше выполнялись более сложными Программы TSS FORTRAN.
Обзор
[ редактировать ]TEX был подсистемой Honeywell Timesharing (TSS). Пользователи должны были ввести команду tex TSS , чтобы перейти в режим работы сеанса TEX. Выражения TEX можно вводить непосредственно в командной строке или запускать из файла сценария с помощью вызова команды TEX ⟨имя_файла⟩ .
Программы TEX представляют собой набор команд редактирования строк TSS, команд сеанса TSS и операторов TEX. Переменные TEX можно было вставлять в команды TSS и команды редактора строк TSS с помощью функции подстановки переменных TEX. Программы TEX были в первую очередь разработаны для расширения системы строкового редактора. Следовательно, в TEX не было концепции файлового ввода/вывода, полагаясь вместо этого на применение команд редактирования строки к рабочему файлу и сохранение по мере необходимости.
Ключевыми разработчиками TEX в Honeywell были Эрик Клеймонс и Ричард Киз, а Роберт Бемер , известный как отец ASCII и дедушка COBOL , выступал в качестве консультанта. [1]
TEX не следует путать с TeX — языком разметки набора текста, изобретенным Дональдом Кнутом .
Американское математическое общество также заявило права на товарный знак TeX, который был отклонен, поскольку на момент попытки (начало 1980-х годов) компания Honeywell зарегистрировала «TEX» (все заглавные буквы) для системы обработки текста «Text EXecutive». [2]
TEX-переменные
[ редактировать ]Все переменные [3] хранились в виде строк и при необходимости преобразовывались в целочисленные значения. Переменные с плавающей запятой, массивы или другие типы данных, распространенные в современных языках сценариев, не существовали в среде TEX.
Все переменные хранились в едином глобальном пуле переменных, которым пользователи должны были управлять, чтобы избежать конфликты имен переменных. В TEX не было возможности определения области видимости переменных. Имена переменных были ограничены 40 символами.
TEX предоставил несколько внутренних регистров только для чтения, называемых звездообразными функциями. [4] который менял состояние при выполнении определенных операций анализа строки TEX. Функции Star предоставляли средства для получения текущей даты и времени, результирующих строк в результате операции анализа строки разделения или сканирования или из уровня внутреннего вызова TEX и информации о сеансе TSS.
Максимальная длина строкового значения составляла 240 символов ASCII. Сюда входят промежуточные результаты при вычислении выражения TEX. Числовые строковые значения ограничены 62 цифрами в строке, включая (-) для отрицательных чисел. Числовые значения также нормализуются, при этом ведущие нули удаляются из строкового представления.
Несколько примеров использования переменных:
_ we can use quotes or other characters as delimiters as long as the string doesn't contain them _ and can use the comma operator to concat them together _ a="hello" b=/world/ c=a,/ /,b
_ the out statement prints "hello world" to the terminal without quotes _ out:c
_ Using TEX variables in a line editing command to find a line containing "hello" _ replacing the "hello" string with the "hello world" string _ rs:a:c
ТЕХ-операторы
[ редактировать ]В TEX есть три типа операторов: [5]
- арифметика
- логическое значение
- нить
При построении выражения TEX все пробелы должны быть сжаты, за исключением строковых литералов. Обычно операторы TEX разделяются пробелами.
_ NOTE: In the "d=" statement, there are no spaces between the commas _ or the variables a="hello" b=" " c="world" d=a,b,c out:d
_ In contrast, a space is needed to separate the 'if' from its expression and _ the expression from the next TEX command to conditionally execute _ if a:eqs:"hello" out:a
Арифметические операторы TEX
[ редактировать ]поддерживает только базовые арифметические операции с целыми числами:
- префикс номера унарного знака (+/-)
- дополнение (+),
- вычитание (-),
- умножение (*) и
- разделение (/)
до 16 уровней круглых скобок.
Некоторые примеры:
a=1 b=-2 c=3*(a-b)/(2*2+(4+1))
Логические операторы TEX
[ редактировать ]выпускаются в двух вкусах:
Чаще всего они использовались в контексте оператора управления IF .
Список доступных операторов числового сравнения:
- :eq: или :eqn: возвращает t как true, если два значения численно равны
- :ge: или :gen: возвращает t как true, если первое значение численно равно второму значению или превышает его.
- :le: или :len: возвращает t как true, если первое значение численно равно или меньше второго значения.
- :gt: или :gtn: возвращает t как true, если первое значение численно больше второго значения.
- :lt: или :ltn: возвращает t как true, если первое значение численно меньше второго значения.
- :ne: или :nen: возвращает t как true, если первое значение численно не равно второму значению.
Список доступных операторов сравнения строк:
- :eqs: возвращает t как true, если значения двух строк идентичны по символам, регистру и длине.
- :ges: возвращает t как true, если первая строка больше или равна второй строке по регистру и длине символов.
- :les: возвращает t как true, если первая строка меньше или равна второй строке по регистру и длине символов.
- :gts: возвращает t как true, если первая строка больше или равна второй строке по регистру и длине символов.
- :lts: возвращает t как true, если первая строка меньше второй строки по регистру и длине символов.
- :nes: возвращает t как true, если первая строка НЕ равна второй строке по регистру и длине символов.
На строковые логические операторы влияет режим TEX CASE . В режиме CASE такие строки, как «ABC» и «abc», считались равными (перед сравнением TEX преобразовывал «ABC» в «abc»). В режиме NOCASE строка «abc» будет считаться большей, чем строка «ABC», на основании значения кодовой точки ASCII , поскольку значение «a» больше, чем значение кодовой точки ASCII «A».
Логический оператор NOT был представлен символом циркумфлекса (^). [8]
Некоторые примеры логических операторов в действии:
if name:eqs:"luke" out:"May the force be with you!" if ^age:gtn:500 out:"Heh, you can't be Yoda!"
TEX не предоставлял соединителей and / or для создания более сложных логических выражений. Вместо этого программистам приходилось использовать вложенные if операторы для соединений и блок операторов if...do Something для обработки соединений или :
_ an example of an and construct if a:eqs:'a' if b:eqs:'b' goto !its_true goto !its_false _ an example of an or construct if a:eqs:'a' goto !its_true if b:eqs:'b' goto !its_true if c:eqs:'c' goto !its_true goto !its_false !its_true out:"It's true!" goto !next_block !its_false out:"It's false!" goto !next_block !next_block ...do something...
Строковые операторы TEX
[ редактировать ]Конкатенация строк в TEX обеспечивалась оператором-запятой:
a="hello"," "," world"
TEX предоставил несколько операторов разделения строк: [9]
- разделение строки слева и сохранение левой части ('])
- разделение строки слева и сохранение правой части (]')
- разделение строки справа и сохранение левой части ('[)
- разделение строки справа и сохранение правой части ([')
Некоторые примеры разделения строк:
a="hello world" b=a']5 c=a]'5 out:"It's a strange new ",c," but ",b," anyways!"
TEX предоставил несколько операторов сканирования/анализа строк: [10]
- сканирование строки слева для заданной подстроки и сохранение левой части ('>)
- сканирование строки слева для заданной подстроки и сохранение правой части (>')
- сканирование строки справа на наличие заданной подстроки и сохранение левой части ('<)
- сканирование строки справа для заданной подстроки и сохранение правой части (<')
Некоторые примеры сканирования/анализа строк:
a="hello world" b=a'>" "
out:b
ТЕКС-этикетки
[ редактировать ]Все метки операторов TEX имели префикс (!). [11] Метки операторов игнорировались, если на них не ссылался переход. [12] или позвоните [13] заявление. Одной из примечательных особенностей TEXа была возможность вызывать или переходить к меткам в других файлах. В сочетании с режимом TEX SUBS это означало, что TEX мог создавать новые сценарии посредством редактирования строк, сохранять, а затем вызывать или переходить динамически к меткам в этих сценариях.
Файл mypgm.tex :
!hello out:"hello world" return !hello2 out:"hello world again" exit (end-of-file marker)
Пример вызова по метке:
call /mycat/mypgm.tex!hello
В приведенном выше примере TEX будет обрабатывать файл /mycat/mypgm.tex в поисках метки !hello (*). TEX будет продолжать обработку файла до тех пор, пока не будет выполнен оператор возврата или оператор выхода или не будет достигнут конец файла.
Пример перехода по метке:
goto /mycat/mypgm.tex!hello2
В следующем примере TEX обработает файл /mycat/mypgm.tex в поисках метки !hello2 (*). TEX будет продолжать обработку до тех пор, пока не будет достигнут оператор выхода или конец файла. Ошибка будет выдана, если оператор возврата был выполнен и не было активных вызовов CALL.
(*) TEX не проверял наличие повторяющихся меток в одном и том же файле , следовательно, выполнение было непредсказуемым, если они присутствовали.
ТЕХ-замены
[ редактировать ]TEX предоставляет команды SUBS и NOSUBS для активации или деактивации замены переменных для операторов TEX или команд TSS.
xx=/out:"Hello World"/ subs ? ?xx? nosubs ?xx?
В приведенном выше примере переменная xx содержит в качестве значения оператор вывода TEX. Команда subs указывает, что (?) является символом замены для всех будущих операторов программы. После обработки первого ?xx? строке TEX заменит команду out:"Hello World" на ?xx? а затем выполните полученный оператор. Команда nosubs отключает замены для последующих операторов, поэтому TEX выдает ошибку при попытке выполнить второй ?xx? линия.
TEX-обходы
[ редактировать ]Помимо замены переменных, TEX поддерживал косвенное обращение к переменным. Считалось, что переменные с префиксом символа подчеркивания (_) содержат имя переменной в качестве своего содержимого, поэтому TEX будет использовать косвенное обращение для получения значения. TEX ограничил косвенность до 64 уровней, чтобы избежать возможного зацикливания.
В качестве примера:
a="b" b="c" c="hello world" _ here the out:__a would print "hello world" to the terminal, _ since two underscore prefix of a means a >> b >> c out:__a
ТЕКС-вход/выход
[ редактировать ]В сеансах Honeywell Timesharing использовалась концепция рабочего файла. Чтобы отредактировать существующий файл, вам сначала нужно сделать его рабочим с помощью старой команды. Чтобы создать новый файл, вам сначала нужно создать его с помощью новой команды. После завершения изменений вы либо сохраните (для новых файлов), либо пересохраните рабочий файл. По сути, одновременно для редактирования может быть открыт только один файл.
Программы TEX были в первую очередь разработаны для расширения системы строкового редактора. Следовательно, в TEX не было концепции ввода/вывода файлов, вместо этого полагаясь на внесение изменений в рабочий файл с помощью команд редактирования строки и сохранение по мере необходимости.
Однако TEX предоставил команды ввода/вывода, ориентированные на терминал:
- in -- распечатать приглашение и делать паузу, пока не будет введен текст, сохраняя его в переменной *in star
- out — распечатать сообщение
Простой пример использования in и out :
in:"What is your name?" out:"Hi ",*in
Звездные функции TEX
[ редактировать ]как средство доступа к результатам/побочным эффектам функций подсистемы TEX или для представления терминальных кодов ASCII. [14]
Список звездных переменных следующий:
- *account — номер учетной записи пользователя, связанный с текущим идентификатором пользователя.
- *cl - текущая строка текущего редактируемого файла
- *lcl - длина значения *cl
- *clvl — текущая глубина звонков
- *date - текущая дата в формате ГГ-ММ-ДД.
- *eof - T , если он расположен после последней строки текущего файла или когда текущего файла нет.
- *in — содержит последний ответ на in или int TEX. выполнение команды
- *lin - длина *дюйма
- *left или *l — строка слева от сканирования или разделения. выполнения команды
- *lleft или *ll — длина *left
- *middle или *m — средняя строка после сканирования или разделения. выполнения команды
- *lmiddle или *lm - длина *middle
- *right или *r — правая строка после сканирования или разделения. выполнения команды
- *lright или *lr — длина *right
- *null — представляет нулевую строку
- *random — содержит случайно выбранную цифру от 0 до 9.
- *rmdr — остаток последней операции деления
- *snumb — системный номер последнего запуска пакетного задания.
- *svmd - команды TEX для восстановления режимов TEX на момент последнего межфайлового вызова или перехода
- От *sw00 до *sw35 — проверяется TSS 36-битное слово переключения , где 1 бит возвращает значение T , а 0 бит возвращает значение F.
- *time - текущее время в формате чч:мм:сс всегда с точностью до секунды.
- *userid — текущий идентификатор пользователя
TEX ASCII/коды терминалов
[ редактировать ]Коды терминалов были преобразованы в переменные типа «звезда» для удобства использования в программах TEX. [15]
- *ноль - ноль
- *soh - начало заголовка
- *stx — начало текста
- *etx — конец текста
- *eot - конец передачи
- *enq — запрос
- *ack — подтвердить
- *колокольчик - колокольчик
- *bs — возврат назад
- *ht — горизонтальная вкладка
- *lf — перевод строки
- *vt — вертикальная вкладка
- *ff — подача формы
- *cr — возврат каретки
- *так - отойди
- *si - сдвиг
- *dle - выход из канала передачи данных
- *dc1 - управление устройством 1
- *dc2 — управление устройством 2
- *dc3 - управление устройством 3
- *dc4 - управление устройством 4 (стоп)
- *nak — отрицательное подтверждение
- *syn - синхронный холостой ход
- *etb - конец блока передачи
- *можно - отменить
- *em - конец среды
- *суб - замена
- *esc — уйти
- *fs - разделитель полей
- *gs - разделитель групп
- *rs - разделитель записей
- *us — разделитель единиц измерения
- *del - удалить
Команды
[ редактировать ]TEX был построен на основе редактора строк TSS , поскольку такие команды редактора строк можно было использовать в программе TEX. Программы TEX могут иметь:
- Команды редактирования строки TSS
- ТЕХ-команды
- Операторы изменения режима TEX
- Команды подсистемы TSS
Команды редактирования строки TSS
[ редактировать ]Общий формат команды был:
verb:<search_expr>;<repeat_cnt>;<occurrence_cnt>:<replacement_string>
⟨search_expr⟩ может содержать диапазон , как в F:/hello/,/world/, чтобы найти все строки, которые начинаются со строки «hello», а также содержат строку «world».
TEX предоставил стандартные команды редактирования файлов на основе строк:
- P : распечатать текущую строку
- F : переход вперед по текущему файлу построчно.
- B : перемещение назад по текущему файлу построчно.
- A : добавить после текущей строки
- I : вставить перед текущей строкой
- R : заменить текущее выражение предоставленным выражением
- D : удалить текущую строку
- копировать : скопировать текущую строку
- вырезать : скопировать и удалить текущую строку
- вставить : вставить то, что было вырезано или скопировано перед текущей строкой.
Каждую команду можно изменить с помощью числового повторяющегося значения или звездочки (*):
- P;999 : напечатать следующие 999 строк с текущей позиции.
- P;* : распечатать все строки от текущей позиции до конца файла.
- F;999 : перейти на 999 строк вперед от текущей позиции.
- F;* : перейти в конец файла
- B;999 : перейти на 999 строк назад от текущей позиции.
- B;* : перейти к первой строке файла
Команды можно дополнительно модифицировать с помощью строки или выражения, соответствующего строке:
- F:/xxx/;999 переход вперед на строку, начинающуюся с 999-го вхождения /xxx/
- B:/xxx/;999 переход назад на строку, начинающуюся с 999-го вхождения /xxx/
- I:/xxx/;999:/yyy/ вставить строку yyy перед следующими 999 строками, начинающимися с /xxx/
- R:/xxx/;999;/yyy/ замените следующие 999 строк, начинающихся с /xxx/, на строку /yyy/
- D:/xxx/;999 удалить следующие 999 строк, начинающиеся с /xxx/
Для строкового режима буква S. была добавлена Всякий раз, когда в строке обнаруживался /xxx/, редактирование применялось:
- FS:/xxx/;999 переход к 999-му вхождению строки /xxx/
- IS:/xxx/;999:/yyy/ вставьте строку /yyy/ перед следующими 999 появлениями /xxx/
- RS:/xxx/;999:/yyy/ замените следующие 999 вхождений строки /xxx/ на /yyy/
- DS:/xxx/;999 удалить следующие 999 вхождений строки /xxx/
Наконец, команды можно дополнительно изменить с помощью V , чтобы включить режим проверки, и с помощью O, чтобы указать режим строки n-го вхождения:
- RVO:/xxx/;99;999:/yyy/ замените 999-е вхождение строки /xxx/ на /yyy/ и повторите ее 99 раз.
Есть еще несколько менее используемых команд редактирования:
- mark – для включения файлов в файлы, когда оператор .mark ⟨filename⟩ найден в текущих или впоследствии включенных файлах (рекурсивная операция)
- befl – вставить перед текущей строкой (обычно для вставки после текущей строки использовалась команда «A»)
- trul ⟨col⟩ – обрезать крайние левые столбцы текущего файла
- trur ⟨col⟩ – обрезать крайние правые столбцы текущего файла
Во всех форматах команд редактирования /xxx/ или /yyy/ или 999 можно заменить переменной TEX. Кроме того, значение 999 можно заменить звездочкой (*), чтобы обозначить все вхождения.
ТЕКС-команды
[ редактировать ]В TEX не предусмотрены команды для числового или условного цикла или переключения случаев, как это принято в современных языках сценариев. Их нужно было создать с использованием if , меток и команд перехода . Например, чтобы удалить повторяющиеся строки из файла, можно использовать:
!ELIM_DUPS a=*cl f;1 _ !NEXT_LINE if *eof out:"task complete" return b=*cl if a:eqs:b d;1 goto !NEXT_LINE a=b f;1 goto !NEXT_LINE
ТЕХ-команды:
- вызовите ⟨filepath⟩ ! ⟨label⟩ – вызов подпрограммы в текущей программе или в другом файле. вызов завершается при остановке или возврате
- очистить ⟨имя_переменной⟩ – удалить именованную переменную из пула или использовать *, чтобы удалить все переменные
- перейти к ⟨путь к файлу⟩ ! ⟨label⟩ – перейти к указанному файлу и метке
- ercall ⟨путь к файлу⟩ ! ⟨label⟩ – вызвать подпрограмму при ошибке в предыдущей команде
- следовательно, ⟨путь к файлу⟩ ! ⟨label⟩ – перейти к процедуре при ошибке в предыдущей команде
- if ⟨expression⟩ – если условное, выражение имеет форму <переменная|значение>:op:<переменная|значение> , где op — одна из операций компаратора, упомянутых ранее.
- in: ⟨expression⟩ – распечатать выражение и дождаться ввода. Сохраните ввод в *in переменной
- int: ⟨expression⟩ – распечатать выражение и дождаться ввода конкретно от терминала. Сохраните ввод в переменной *in .
- *null – возврат каретки с терминала без ввода, используемый для завершения режима вставки в программе TEX. Никакие другие команды не могут находиться в одной строке.
- стоп – остановить программу TEX
- _ – строка примечаний
- return – возврат из вызова подпрограммы
- out: ⟨expression⟩ – вывести выражение на терминал
- outt: ⟨expression⟩ – принудительно вывести выражение (и весь предыдущий вывод, который еще не сброшен) на терминал
- сканирование: ⟨operand-a⟩ : ⟨operand-b⟩ – сканировать ⟨operand-a⟩ слева направо в поисках ⟨operand-b⟩ и анализировать ⟨operand-a⟩ , помещая результаты в *left , *middle и * правой переменные звезды, и если *match равно T , то совпадение найдено.
- scann: ⟨operand-a⟩ : ⟨operand-b⟩ – сканировать ⟨operand-a⟩ слева направо в поисках ⟨operand-b⟩ и анализировать ⟨operand-a⟩ , помещая результаты в *left , *middle и * правой переменные звезды, и если *match равно T , то совпадение найдено. сканирование ⟨operand-b⟩ было ограничено одним символом или классом символов (*lc=строчные буквы, *uc=прописные буквы, *n=числа, *a=буквы(*lc+*uc), *an=буквы и цифры(* а+*н))
- scanr: ⟨operand-a⟩ : ⟨operand-b⟩ – сканировать ⟨operand-a⟩ справа налево в поисках ⟨operand-b⟩ и анализировать ⟨operand-a⟩ , помещая результаты в *left , *middle и * правой переменные звезды, и если *match равно T , то совпадение найдено.
- scannr: ⟨operand-a⟩ : ⟨operand-b⟩ – сканировать ⟨operand-a⟩ справа налево в поисках ⟨operand-b⟩ и анализировать ⟨operand-a⟩ , помещая результаты в *left , *middle и * правой переменные звезды, и если *match равно T , то совпадение найдено. scannr ⟨operand-b⟩ был ограничен одним символом или классом символов (*lc=строчные буквы алфавита, *uc=прописные буквы, *n=числа, *a=буквенные(*lc+*uc), *an=буквенно-цифровые(* а+*н))
- разделить: ⟨operand-a⟩ : ⟨operand-b⟩ – разделить ⟨operand-a⟩ в позиции ⟨operand-b⟩, начиная с начала ⟨operand-a⟩, помещая результаты в *left , *middle и *right звездные переменные
- Splitr: ⟨operand-a⟩ : ⟨operand-b⟩ – разделить ⟨operand-a⟩ в позиции ⟨operand-b⟩ , начиная с конца ⟨operand-a⟩, помещая результаты в *left , *middle и *right звездные переменные
- subs ⟨subs_character⟩ – активирует режим subs, в котором TEX будет сканировать пары <subs_character>, оценивая выражение и помещая его в строку перед выполнением строки. Режим SUBS отключен NOSUBS
- трассировка — активировать режим трассировки, в котором строки отображаются до выполнения. Режим трассировки отключен NOTRACE.
- vari — отображать все переменные и их значения, включая переменные-звездочки
Операторы изменения режима TEX
[ редактировать ]Режимы TEX определяли, как будут работать другие команды TEX. [16] Переменная *svmd содержала текущее состояние всех режимов TEXа в виде TEX-команд для восстановления режимов. У каждого режима была обратная команда для выключения режима, которую можно было сделать в любой момент.
- subs ⟨char⟩ / nosubs — активировать режим subs, в котором TEX будет искать пары ⟨char⟩ , оценивая выражение и помещая его в строку перед выполнением строки.
- трассировка / notrace – активировать режим трассировки, при котором строки отображаются до выполнения.
- case/nocase — преобразовать все строки в нижний регистр перед операциями сравнения
- октл ⟨char⟩ / nooctl — определяет восьмеричный префиксный символ (например, октл % , а затем rs:/BELL/:/%007/ )
- маска ⟨char⟩ / nomask — определяет символ маски для сопоставления с любым символом в строке поиска.
- cols ⟨col⟩ / nocols — определяет окно столбцов, в котором ограничен поиск строк.
Команды ТСС
[ редактировать ]Хотя это выходит за рамки этой статьи, наиболее часто используемые команды TSS :
- NEW – новый файл (т.е. пустой файл; очищает рабочую область редактора)
- OLD – старый файл перенесен в рабочую область редактора.
- СОХРАНИТЬ – сохранить новый файл (имя файла не может существовать)
- RESAVE – повторно сохранить рабочую область редактора в существующий файл.
Примеры ТЕХ
[ редактировать ]Этот код был взят из приключенческой игры на основе TEX, написанной командой скаутов-исследователей из GE Post 635, Скенектади, штат Нью-Йорк, примерно в 1980 году. Приключенческая игра была первой из нескольких популярных текстовых онлайн-приключенческих игр, доступных в службе GE Timesharing. Скауты решили создать собственную приключенческую игру с использованием TEXа. В оригинальной приключенческой игре для навигации по Колоссальной пещере использовались две словесные команды . Показанный ниже анализатор обрабатывал простые двухсловные команды, такие как «идти на запад» или «двигаться вправо» , и преобразовывал их в дельты x,y для позиционирования и направленной ориентации в игре.
Разбор двухсловных команд Adventure:
...
_ force a clear screen on the televideo terminal !init out:*esc,":" _ clear program variables rmdr=*null del=0 dir="n" xlocn=1 ylocn=1 return
_ _______________________________________________________________ _ _ The PARSER subroutine interprets your input commands and tries to _ pre-process them prior to returning to your program. _ !parser qry=*cr,*lf,"-->" sntc=*null call !ask1 ergo !unkn_cmd verb=ans vdel=0 goto !$ans$_cmd _ !walk_cmd del=2 call !move_to return !run_cmd del=4 call !move_to return !fly_cmd del=6 call !move_to return !swim_cmd del=2 call !move_to return ... !unkn_cmd return
!move_to call !ask3 if ans:eqs:*null goto !to_$dir$ ercall !to_same call !to_$ans$ _ !to_locn xlocn=xlocn+xdel ylocn=ylocn+ydel return _ !to_f !to_forward !to_ahead !to_same goto !to_$dir$ _ !to_b !to_backward goto !inv_$dir$ _ !to_r !to_right goto !rt_$dir$ _ !to_l !to_left goto !lt_$dir$ _ !inv_south !rt_northwest !lt_northeast !to_n !to_north dir="north" xdel=0 ydel=del return _ !inv_west !rt_northeast !lt_southeast !to_e !to_east dir="east" xdel=del ydel=0 return _ !inv_north !rt_southeast !lt_southwest !to_s !to_south dir="south" xdel=0 ydel=-del return _ !inv_east !rt_southwest !lt_northwest !to_w !to_west dir="west" xdel=-del ydel=0 return
_ adjust delta speed if these words are spotted as in "go very fast" !to_very vdel=vdel+1 goto !to_same !to_fast del=del+vdel vdel=0 goto !to_same !to_slow del=del-vdel vdel=0 goto !to_same
_ ______________________________________________________________ _ _ The ASK subroutines get your terminal input and break it up depending _ on the spaces. ask1 falls into ask2 and ask2 falls into ask3 then returns _ _ rmdr holds remainder of input line, sntc holds remainder of current command sentence _ sentences are terminated with a period. ans holds the current word being processed _ !ask1 if rmdr:eqs:*null in:qry rmdr=*in sntc=*null !ask2 if sntc:eqs:*null scan:rmdr:"." sntc=*l rmdr=*r]'1 !ask3 scan:sntc:" " ans=*l sntc=*r return
Бросок кубика:
_ _______________________________________________________________ _ _ The DICE subroutine rolls the dice for you and returns the answer _ in the variable called DICE. _ _ Input to the DICE subroutine is via the DICE variable as shown below : _ _ 1d6 - roll the 6-sided die once _ 3d8 - roll the 8-sided die 3 times _ d% - roll the 100-sided die once (percentage roll) _ !dice if dice:eqs:"d%" dice="1d100" scan:dice:"d" i=*l j=*r dice=0 !dice_1 k=*random if j:gt:9 k=k,*random k=k/j dice=dice+*rmdr+1 i=i-1 if i:gt:0 goto !dice_1 clear i clear j clear k return
Коды экрана телевидео:
_ _______________________________________________________________ _ _ The following routines allow you to easily draw pictures on the _ the Televideo 950 terminal. _ _ xyplot: positions the cursor _ _ gr: turns graphics mode on _ _ nogr: turns graphics mode off _ _ clear: clears the screen _ _ load: used by xyplot to load the xytbl _ !xyplot ercall !load xytbl=xytbl cx=(xytbl]'(x-1))']1 cy=(xytbl]'(y-1))']1 out:*ESC,"=",cy,cx,z return _ _ !load xytbl=" !",/"/,"#$%&'()*+,-./" xytbl=xytbl,"0123456789:;<=>?",*AT,"ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_" xytbl=xytbl,"`abcdefghijklmnopqrstuvwxyz{|}~",*DEL return _ _ !gr nosubs out:*ESC,"$" subs $ $*SVMD$ return _ _ !nogr out:*ESC,"%" return _ _ !clear out:*ESC,":" return
Примечательные особенности TEXа
[ редактировать ]Наиболее примечательной особенностью TEXа был режим SUBS, позволяющий значениям переменных пересекаться и становиться исполняемым кодом. Это позволяло программисту на лету создавать новые переменные для использования в последующих выражениях TEX в стиле LISP . TEX также позволял программистам создавать сценарии «на лету» посредством редактирования строк, сохраняя содержимое в файл для последующего выполнения как часть текущей программы с использованием операторов межфайлового вызова и перехода . Однако в большинстве случаев эти функции использовались для предоставления в коде простых динамических операторов перехода , как показано в примере парсера приключенческой игры. Какие еще виды конструкций искусственного интеллекта можно было бы разработать, так и не были полностью изучены.
Пример создания переменных на лету и последующего использования их для перехода между файлами .
_ incorporate x,y,z into the global variable pool cmd="x=1 y=2 z=3" subs ? ?cmd?
_ next we modify mycat/mypgm_1_2.tex to say "hello world" we are writing some code to _execute later in our script _ old mycat/mypgm_1_2.tex r:*cl:/!label_3 out:'Hello World'/ resave mycat/mypgm_1_2.tex
_ lastly we subs in x,y,z and then evaluate the goto mypgm_1_2!label_3 which does an interfile goto _ goto mycat/mypgm_?x?_?y?.tex!label_?z?
Приведенная выше программа TEX иллюстрирует создание динамического сценария, а затем его выполнение посредством замены, редактирования файла и перехода между файлами . В действительности, написание программ было возможно, хотя и никогда не делалось. В приведенном выше примере файл mycat/mypgm_1_2.tex будет выполнен по адресу label_3 и выведет «hello world» .
Ссылки
[ редактировать ]- Руководство пользователя TEX (DF72) — Honeywell Information Systems, авторские права 1979 г.
- Краткий справочник TEX – Honeywell Information Systems, авторские права 1979 г.
- Каталог программного обеспечения (AW15 Rev05), Honeywell Information Systems, Copyright 1979, Раздел 4 — Серия 600/6000, Серия 60/Уровень 66, стр. 4-42 Исполнительный процессор TEX
- Р.В.Бемер, «Введение в язык TEX - Часть I», журнал Interface Age, том 3, № 8, 144–147, август 1978 г.
- Р.В.Бемер, «Введение в язык TEX - Часть II», журнал Interface Age, том 3, № 9, 124–127, сентябрь 1978 г.
- Р.В.Бемер, «Введение в язык TEX - Часть III», журнал Interface Age, том 3, № 10, 126–131, октябрь 1978 г.
- Р.В.Бемер, «Экранный редактор на основе TEX», Proc. Форум HLSUA XXXI, 158–160, 1980 г., 12–15 октября. Первый в мире полудуплексный полноэкранный редактор.
- ^ Введение в TEX , стр. 144. Возраст интерфейса — август 1978 г.
- ^ * Дональд Э. Кнут. The TeXbook ( Компьютеры и набор текста , Том A). Ридинг, Массачусетс: Аддисон-Уэсли, 1984. ISBN 0-201-13448-9 .
- ^ Honeywell DF72 Глава 3.1
- ^ Honeywell DF72 Глава 3.4
- ^ Honeywell DF72, стр. 3-16.
- ^ Honeywell DF72, стр. 3-18.
- ^ Honeywell DF72, стр. 3-19.
- ^ Honeywell DF72, стр. 3-16.
- ^ Honeywell DF72, стр. 3-21.
- ^ Honeywell DF72, стр. 3–22–3–30.
- ^ Honeywell DF72, стр. 4-2.
- ^ Honeywell DF72 стр. 4-6
- ^ Honeywell DF72, стр. 4-3.
- ^ Honeywell DF72 стр. 3-7
- ^ Honeywell DF72, стр. 3-10.
- ^ Honeywell DF72 Глава 6