Jump to content

Текстовый исполнительный язык программирования

В 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

[ редактировать ]

выпускаются в двух вкусах:

  • числовые сравнения [6]
  • сравнение строк [7]

Чаще всего они использовались в контексте оператора управления 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 октября. Первый в мире полудуплексный полноэкранный редактор.
  1. ^ Введение в TEX , стр. 144. Возраст интерфейса — август 1978 г.
  2. ^ * Дональд Э. Кнут. The TeXbook ( Компьютеры и набор текста , Том A). Ридинг, Массачусетс: Аддисон-Уэсли, 1984. ISBN   0-201-13448-9 .
  3. ^ Honeywell DF72 Глава 3.1
  4. ^ Honeywell DF72 Глава 3.4
  5. ^ Honeywell DF72, стр. 3-16.
  6. ^ Honeywell DF72, стр. 3-18.
  7. ^ Honeywell DF72, стр. 3-19.
  8. ^ Honeywell DF72, стр. 3-16.
  9. ^ Honeywell DF72, стр. 3-21.
  10. ^ Honeywell DF72, стр. 3–22–3–30.
  11. ^ Honeywell DF72, стр. 4-2.
  12. ^ Honeywell DF72 стр. 4-6
  13. ^ Honeywell DF72, стр. 4-3.
  14. ^ Honeywell DF72 стр. 3-7
  15. ^ Honeywell DF72, стр. 3-10.
  16. ^ Honeywell DF72 Глава 6
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b6dca7aec86ba5c30226cf85ccf971e3__1693290780
URL1:https://arc.ask3.ru/arc/aa/b6/e3/b6dca7aec86ba5c30226cf85ccf971e3.html
Заголовок, (Title) документа по адресу, URL1:
Text Executive Programming Language - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)