Текстовый исполнительный язык программирования - Text Executive Programming Language
В 1979 году Honeywell Information Systems анонсировала новый язык программирования для своих совместное времяпровождение названная служба TEX, акроним для Текст Исполнительный система обработки текста. TEX был языком сценариев первого поколения, разработанным во времена AWK и первоначально использовалась Honeywell как средство автоматизации внутреннего тестирования систем.
TEX расширил Служба разделения времени Honeywell (TSS) строковый редактор с программируемыми возможностями, который давал пользователю большую свободу в разработке простых в использовании расширений редактирования, а также писать сценарии для автоматизации многих других задач с разделением времени, которые раньше выполнялись более сложными программами TSS FORTRAN.
Обзор
TEX была подсистемой Honeywell TSS. Пользователи войдут в TSS команда 'текс ' изменить на TEX сеансовый режим работы. TEX выражения можно вводить непосредственно в командной строке или запускать из файла сценария через TEX команда ПОЗВОНИТЬ filename.
TEX программы представляют собой набор TSS команды редактирования строки, TSS команды сеанса и TEX заявления. TEX переменные могут быть вставлены в TSS команды и TSS команды редактора строки через TEX функция замены переменных. TEX программы были в первую очередь разработаны для расширения системы строкового редактора. Вследствие этого, TEX не имел концепции ввода / вывода файла, полагаясь вместо этого на применение команд редактирования строки к рабочему файлу и сохранение по мере необходимости.
Ключевые разработчики TEX в Honeywell были Эрик Клэмонс и Ричард Киз с Роберт Бемер, известный как отец ASCII и дедушка КОБОЛ, выступая в качестве консультанта.[1]
TEX не следует путать с TeX язык разметки для набора, изобретенный Дональд Кнут.
В Американское математическое общество также потребовал торговая марка для TeX, который был отклонен, потому что в то время, когда это было испробовано (начало 1980-х), "TEX" (все заглавные буквы) был зарегистрирован Honeywell для системы обработки текста "Text EXecutive".[2]
Переменные
Все переменные хранились в виде строк и при необходимости преобразовывались в целочисленные значения. Переменные с плавающей запятой, массивы или другие типы данных, общие для текущих языков сценариев, не существовали в TEX Окружающая среда.
Все переменные хранились в едином глобальном пуле переменных, которым пользователи должны были управлять, чтобы избежать конфликтов именования переменных. Возможности переменной области видимости в TEX. Имена переменных были ограничены 40 символами.
TEX предоставил несколько внутренних регистров только для чтения, называемых звездные функции или звездные переменные которые изменили состояние, когда определенные TEX были выполнены операции синтаксического анализа строки. Звездные функции предоставил средства для получения текущей даты и времени, результирующих строк из Трещина или сканировать операции синтаксического анализа строк, TEX уровень внутреннего звонка и TSS информация о сеансе.
Максимальная длина строкового значения составляла 240 символов ASCII. Сюда входят промежуточные результаты при оценке TEX выражение. Числовые строковые значения ограничены 62 цифрами в строке, включая (-) для отрицательных чисел. Числовые значения также нормализуются, если начальные нули удаляются из строкового представления.
Некоторые примеры использования переменных:
_ мы можем использовать кавычки или другие символы в качестве разделителей, если строка не содержит их a = "hello" _ здесь мы используем символ / в качестве разделителя (обычная практика, особенно если в строке есть "char) b = /Мир/
_ здесь мы объединяем строки вместе с помощью оператора конкатенации запятой c = a, / /, b
_ оператор out выведет на терминал "hello world" без кавычек: c
_ здесь мы используем переменную TEX в команде редактирования строки, чтобы найти строку, начинающуюся с "hello world" hello = "hello world" f: hello
_ здесь мы заменяем строку "hello" на строку "hello world" rs: a: c
Операторы
TEX имеет три типа операторов:
- арифметика
- логический
- строка
При строительстве TEX выражение, все пробелы должны быть сжаты, кроме строковых литералов. Как правило, spacedelimit TEX заявления.
_ в операторе "d =" нет пробелов между запятыми или переменными a = "hello" b = "" c = "world" d = a, b, c out: d
_ пробел отделяет 'if' от выражения и выражение из следующей команды TEX для условного выполнения, если a: eqs: "hello" out: a
Арифметика
TEX поддерживает только базовые целочисленные арифметические операции:
- префикс унарного знакового числа (+/-)
- сложение (+),
- вычитание (-),
- умножение (*) и
- деление (/)
до 16 уровней скобок.
Вот несколько примеров:
а = 1 б = -2 с = 3 * (а-б) / (2 * 2 + (4 + 1))
Булевы операторы
TEX Булевы операторы бывают двух видов:
- числовые сравнения
- сравнение строк
Чаще всего они использовались в контексте ЕСЛИ заявление о контроле.
Список доступных числовых логических операторов в TEX находятся:
- : экв: или : eqn: возвращает t для истины, если два значения численно равны
- : ge: или : gen: возвращает t для истины, если первое значение численно равно или больше второго значения
- : le: или : len: возвращает t для истины, если первое значение численно равно или меньше второго значения
- : gt: или : gtn: возвращает t для истины, если первое значение численно больше второго значения
- : lt: или : ltn: возвращает t для истины, если первое значение численно меньше второго значения
- : ne: или : nen: возвращает t для истины, если первое значение численно не равно второму значению
Список доступных строковых логических операторов:
- : eqs: возвращает t для истины, если значения двух строк идентичны по символам, регистру и длине
- : ges: возвращает t для истины, если первая строка больше или равна второй строке в регистре и длине символов
- : les: возвращает t для истины, если первая строка меньше или равна второй строке в регистре и длине символов
- : gts: возвращает t для истины, если первая строка больше или равна второй строке в регистре и длине символов
- : lts: возвращает t для истины, если первая строка меньше, чем вторая строка в регистре и длине символов
- : nes: возвращает t для истины, если первая строка НЕ равна второй строке в регистре и длине символов
На логические строковые операторы влияют TEX КЕЙС Режим. Под КЕЙС режиме такие строки, как 'ABC' и 'abc', считались равными (TEX преобразовал 'ABC' в 'abc' перед сравнением). Под NOCASE режиме, строка 'abc' будет считаться больше, чем строка 'ABC' на основе ASCII значение кодовой точки для 'a' является большим значением, чем значение кодовой точки 'A' ASCII.
Логическое НЕ Оператор был представлен символом циркумфлекса (^).
Некоторые примеры булевых операторов в действии:
if name: eqs: "luke" out: "Да пребудет с тобой сила!" if ^ age: gtn: 500 out: "Хех, ты не можешь быть Йодой!"
TEX не предоставил и или или коннекторы для создания более сложных логических выражений. Вместо этого программистам пришлось использовать вложенные если заявления для и соединений и блок если ... сделать что-нибудь заявления для обработки или соединения:
_ пример и построить if a: eqs: 'a' if b: eqs: 'b' goto! its_true goto! its_false _ пример или построить 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: "Это правда!" goto! next_block! its_false out: "Это ложь!" goto! next_block! next_block ... сделать что-нибудь ...
Строковые операторы
Конкатенация строк в TEX был предоставлен оператором запятой:
a = "привет", "", "мир"
TEX предоставил несколько операторов разделения строк:
- разделение строки слева и сохранение левой части ('])
- разделение строки слева и сохранение правой стороны (] ')
- разделение строки справа и сохранение левой части ('[)
- разделение строки справа и сохранение правой стороны ([')
Некоторые примеры разделения строк:
a = "hello world" b = a '] 5 c = a]' 5 out: "Странно новый", c, "но", b, "в любом случае!"
TEX предоставляет несколько операторов сканирования / синтаксического анализа строк:
- сканирование строки слева для данной подстроки и сохранение левой части ('>)
- сканирование строки слева для данной подстроки и сохранение правой стороны (> ')
- сканирование строки справа для данной подстроки и сохранение левой стороны ('<)
- сканирование строки справа для данной подстроки и сохранение правой стороны (<')
Некоторые примеры сканирования / синтаксического анализа строк:
a = "привет, мир" b = a '> "" out: b
Этикетки
Все TEX метки операторов имеют префикс (!). Ярлыки операторов в целом игнорировались, если на них не указывалось перейти к или вызов заявление. Одна примечательная особенность TEX была способность вызов или перейти к метки в других файлах. В сочетании с TEX ПОДПИСКИ режим означал, что TEX может создавать новые сценарии с помощью редактирования строки, сохранять, а затем вызов или перейти к метки в этих скриптах динамически.
В mypgm файл:
! hello out: "hello world" return! hello2 out: "hello world again" exit (маркер конца файла)
Вызов по примеру этикетки:
звоните / mycat / mypgm! привет
В приведенном выше примере TEX обработает файл / mycat / mypgm в поисках метки! hello (*). TEX продолжит обработку файла до тех пор, пока вернуть заявление или выход оператор был выполнен или был достигнут конец файла.
Перейти к по примеру этикетки:
goto / mycat / mypgm! привет2
В следующем примере TEX обработает файл / mycat / mypgm в поисках метки! hello2 (*). TEX будет продолжать обработку до тех пор, пока выход заявление или конец файла достигнут. Будет выдана ошибка, если вернуть Оператор был выполнен, и активных вызовов не было.
(*) TEX не проверял наличие повторяющихся меток в одном файле, следовательно, исполнение было непредсказуемым.
Замены
TEX предоставляет ПОДПИСКИ и NOSUBS команды для активации или деактивации подстановки переменных для последующего TEX заявления или TSS команды.
xx = / out: "Hello World" / subs? ? xx? nosubs? xx?
В приведенном выше примере хх переменная содержит TEX оператор вывода в качестве его значения. В подводные лодки Команда указывает, что (?) является символом подстановки для всех будущих операторов программы. После обработки первого ? xx? линия, TEX заменит в out: "Hello World" команда для ? xx? а затем выполните полученный оператор. В Nosubs команда отключает замены для последующих операторов и поэтому TEX выдает ошибку при попытке выполнить второй ? xx? линия.
Косвенные указания
Помимо подстановки переменных, TEX поддерживается косвенное обращение к переменной. Считалось, что переменные с префиксом подчеркивания (_) содержат имя переменной в качестве своего содержимого, и поэтому TEX будет использовать косвенное обращение для получения значения. TEX ограниченное косвенное обращение до 64 уровней, чтобы избежать возможного зацикливания.
Например:
a = "b" b = "c" c = "hello world" _ здесь out выводит на терминал "hello world", _ поскольку __a == _b == c и так команда стала из: c. из: __ a
Ввод, вывод
Сессии с разделением времени в Honeywell имели концепцию рабочего файла. Чтобы отредактировать существующий файл, вы должны сначала сделать его рабочим файлом с помощью старый команда. Чтобы создать новый файл, вы должны сначала создать его через новый команда. После внесения изменений вы либо спасти (для новых файлов) или повторно сохранить рабочий файл. Обычно для редактирования может быть открыт только один файл.
TEX программы были в первую очередь разработаны для расширения системы строкового редактора. Вследствие этого, TEX не имел понятия о вводе / выводе файлов, полагаясь вместо этого на внесение изменений в рабочий файл с помощью команд редактирования строки и сохранение по мере необходимости.
Однако, TEX предоставлял ориентированные на терминал команды ввода / вывода:
- в - распечатать приглашение и сделать паузу, пока текст не будет введен, сохраняя его в *в звездная переменная
- вне - распечатать сообщение
Простой пример с использованием в и вне:
в: "Как тебя зовут?" out: "Привет", * in
Звездные переменные и функции
TEX предоставлена звездные переменные как средство доступа к результатам или побочным эффектам TEX системные функции или для представления оконечных кодов ASCII.
Список звездные переменные следует:
- *учетная запись - номер учетной записи пользователя, связанный с текущим идентификатором пользователя
- * cl - текущая строка текущего редактируемого файла
- * lcl - длина значения * cl
- * clvl - текущая глубина звонков
- *Дата - текущая дата в виде ГГ-ММ-ДД
- * eof - Т если расположен после последней строки текущего файла или если текущий файл отсутствует
- *в - содержит последний ответ на в или int TEX выполнение команды
- * лин - длина *в
- *осталось или * l - левая строка из сканировать или Трещина выполнение команды
- * левый или * ll - длина *осталось
- * средний или * м - средняя струна из сканировать или Трещина выполнение команды
- * lmiddle или * lm - длина * средний
- *правильно или *р - правая строка из сканировать или Трещина выполнение команды
- * светлый или * lr - длина *правильно
- *значение NULL - представляет собой пустую строку
- * случайный - содержит произвольно выбранную цифру от 0 до 9
- * rmdr - остаток от последней операции деления
- * пренебрежительно - системный номер последнего запущенного пакетного задания
- * svmd - TEX команды для восстановления TEX режимы на момент последнего межфайлового вызов или перейти к
- * sw00 к * sw35 - исследует TSS 36-битное коммутирующее слово с 1 битом, возвращающим Т значение и бит 0, возвращающий F
- *время - текущее время в чч: мм: сс всегда с точностью до секунды
- *Логин пользователя - текущий идентификатор пользователя
Коды клемм
Коды клемм были преобразованы в звездочки для удобства использования в TEX программы.
- * нуль - значение NULL
- * так - начало заголовка
- * stx - начало текста
- * etx - конец текста
- * eot - конец передачи
- * enq - запрос
- * подтверждение - признать
- * бел - колокол
- * bs - backspace
- * ht - горизонтальная вкладка
- * lf - перевод строки
- * vt - вертикальная табуляция
- * ff - подача формы
- * кр - возврат каретки
- *так - сдвинуть
- * си - перейти в
- * dle - выход канала передачи данных
- * dc1 - устройство управления 1
- * dc2 - устройство управления 2
- * dc3 - устройство управления 3
- * dc4 - устройство управления 4 (стоп)
- * нак - отрицательное подтверждение
- * син - синхронный холостой ход
- * etb - конец блока передачи
- *мочь - Отмена
- *Эм - конец среды
- * sub - замена
- * esc - побег
- * fs - разделитель полей
- * GS - разделитель групп
- * rs - разделитель записей
- *нас - разделитель агрегатов
- * del - Удалить
Команды
TEX был построен на основе TSS редактор строки, поскольку такие команды редактора строки могут использоваться в программе TEX. Программы TEX могут иметь:
- TSS команды редактирования строки
- TEX команды
- TEX команды режима
- TSS системные команды
Команды редактирования
Общий формат команды был:
глагол:; ; :
⟨Search_expression⟩ может содержать диапазон, как в F: / hello /, / world /, чтобы найти все строки, которые начинаются со строки «hello» и также содержат строку «world».
В TEX есть стандартные строковые команды редактирования файлов:
- п: распечатать текущую строку
- F: перемещаться вперед по текущему файлу построчно
- B: перемещаться назад по текущему файлу построчно
- А: добавить после текущей строки
- я: вставить перед текущей строкой
- р: заменить текущий на предоставленное выражение
- D: удалить текущую строку
- копировать: скопировать текущую строку
- резать: скопировать и удалить текущую строку
- вставить: вставить то, что было вырезано или скопировано перед текущей строкой
Каждая команда может быть изменена числовым значением повторения или звездочкой (*):
- П; 999: напечатать следующие 999 строк с текущей позиции
- П;*: распечатать все строки от текущей позиции до конца файла
- Ф; 999: перейти на 999 строк вперед от текущей позиции
- F; *: перейти в конец файла
- В; 999: перейти на 999 строк назад от текущей позиции
- B; *: перейти к первой строке файла
Команды могут быть дополнительно изменены с помощью строки или выражения соответствия строки:
- Факс: / 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 / находился в строке, применялось редактирование:
- ФС: / xxx /; 999 перейти к 999-му вхождению строки / xxx /
- IS: / xxx /; 999: / yyy / вставьте строку / yyy / перед следующими 999 вхождениями / xxx /
- RS: / xxx /; 999: / yyy / заменить следующие 999 вхождений строки / xxx / на / yyy /
- DS: / xxx /; 999 удалить следующие 999 вхождений строки / xxx /
Наконец, команды могут быть изменены с помощью V чтобы включить режим проверки и с О указать nth строковый режим появления:
- RVO: / xxx /; 99; 999: / yyy / заменить 999-е вхождение строки / xxx / на / yyy / и повторить 99 раз
Есть еще несколько менее используемых команд редактирования:
- mark - для включения файлов в файлы, когда оператор .mark «имя файла» найден в текущих или последующих включаемых файлах (рекурсивная операция)
- befl - вставить перед текущей строкой (обычно для вставки после текущей строки использовалась команда «A»)
- trul ⟨col⟩ - обрезать крайние левые столбцы текущего файла
- trur ⟨col⟩ - обрезать крайние правые столбцы текущего файла
Во всех форматах команд редактирования / xxx / или / yyy / или 999 можно заменить переменной TEX. Кроме того, число 999 можно заменить звездочкой (*), чтобы обозначить все вхождения.
Команды TEX
В TEX не было команд для числового или условного цикла или переключения вариантов, как это принято в современных языках сценариев. Их нужно было построить с использованием если, этикетки и перейти к команды. Например, чтобы исключить повторяющиеся строки из файла, можно использовать:
! ELIM_DUPS a = * cl f; 1 _! NEXT_LINE if * eof out: "задача завершена" return b = * cl if a: eqs: b d goto! NEXT_LINE a = b f; 1 goto! NEXT_LINE
Команды TEX:
- вызовите filepath⟩! label - вызвать подпрограмму в текущей программе или в другом файле. то вызов заканчивается, когда Стоп или вернуть
- очистить ⟨variable_name⟩ - удалить именованную переменную из пула или использовать * удалить все переменные
- goto filepath⟩! label⟩ - перейти к названному файлу и подписать
- ercall filepath⟩! label⟩ - вызвать подпрограмму при ошибке в предыдущей команде
- ergoto filepath⟩! label⟩ - процедура перехода при ошибке в предыдущей команде
- если «выражение» - если условно, выражение имеет вид <variable|value>:op:<variable|value> где op - одна из упомянутых ранее операций компаратора.
- в: «выражение» - распечатать выражение и дождаться ввода. Сохраните ввод в *в переменная
- int: «выражение» - распечатать выражение и дождаться ввода именно с терминала. Сохраните ввод в *в переменная.
- *значение NULL - возврат каретки без ввода из терминала, используемый для выхода из режима вставки в программе TEX. Никакие другие команды не могут находиться в той же строке.
- Стоп - остановить программу TEX
- _ - строка примечаний
- вернуть - возврат из вызова подпрограммы
- out: ⟨expression⟩ - вывести выражение в терминал
- outt: «выражение» - принудительно распечатать выражение (и весь предыдущий вывод, еще не сброшенный) на терминал
- сканирование: ⟨operand-a⟩: operand-b⟩ - сканировать ⟨Operand-a⟩ слева направо поиск ⟨Operand-b⟩ и разбирать ⟨Operand-a⟩ размещение результатов в *осталось, * средний, и *правильно звездные переменные и если *матч является Т потом было найдено совпадение.
- scann: ⟨operand-a⟩: operand-b⟩ - сканировать ⟨Operand-a⟩ слева направо поиск ⟨Operand-b⟩ и разобрать ⟨Operand-a⟩ размещение результатов в *осталось, * средний, и *правильно звездные переменные и если *матч является Т потом было найдено совпадение. сканировать ⟨Operand-b⟩ был ограничен одним символом или классом символов (* lc = алфавит в нижнем регистре, * uc = алфавит в верхнем регистре, * n = числовой, * a = алфавитный (* lc + * uc), * an = буквенно-цифровой (* a + * п))
- scanr: ⟨operand-a⟩: operand-b⟩ - сканировать ⟨Operand-a⟩ справа налево поиск ⟨Operand-b⟩ и разбирать ⟨Operand-a⟩ размещение результатов в *осталось, * средний, и *правильно звездные переменные и если *матч является Т потом было найдено совпадение.
- scannr: operand-a⟩: operand-b⟩ - сканировать ⟨Operand-a⟩ справа налево поиск ⟨Operand-b⟩ и разобрать ⟨Operand-a⟩ размещение результатов в *осталось, * средний, и *правильно звездные переменные и если *матч является Т потом было найдено совпадение. scannr ⟨Operand-b⟩ был ограничен одним символом или классом символов (* lc = алфавит в нижнем регистре, * uc = алфавит в верхнем регистре, * n = числовой, * a = алфавитный (* lc + * uc), * an = буквенно-цифровой (* a + * п))
- split: ⟨operand-a⟩: operand-b⟩ - Трещина ⟨Operand-a⟩ на позиции ⟨Operand-b⟩ начиная с начала ⟨Operand-a⟩ размещение результатов в *осталось, * средний, и *правильно звездные переменные
- splitr: ⟨operand-a⟩: operand-b⟩ - Трещина ⟨Operand-a⟩ на позиции ⟨Operand-b⟩ начиная с конца ⟨Operand-a⟩ размещение результатов в *осталось, * средний, и *правильно звездные переменные
- подписки ⟨subs_character⟩ - активировать режим sub, в котором TEX будет сканировать пары символов
, оценивая выражение и помещая его в строку перед выполнением строки. ПОДПИСКИ режим выключен NOSUBS - след - активировать режим трассировки, при котором линии отображаются до выполнения. Режим трассировки отключен NOTRACE
- вари - отображать все переменные и их значения, включая звездные переменные
Режимы TEX
Режимы TEX определяют, как будут работать другие команды TEX. В * svmd переменная содержала текущее состояние всех режимов TEX в виде команд TEX для восстановления режимов. У каждого режима была обратная команда для выключения режима, что можно было сделать в любой момент.
- подписки ⟨char⟩ / nosubs - активировать режим подпрограмм, в котором TEX будет сканировать пары «символов», оценивая выражение и помещая его в строку перед выполнением строки.
- трассировка / notrace - активировать режим трассировки, при котором линии отображаются до выполнения.
- чехол / чехол - преобразовать все строки в нижний регистр перед операциями сравнения
- octl ⟨char⟩ / nooctl - определить восьмеричный префиксный символ (например, octl% а потом rs: / BELL /: /% 007 /)
- маска ⟨char⟩ / nomask - определить символ маски для сопоставления с любым символом в строке поиска
- cols ⟨col⟩ / nocols - определить окно столбцов, в котором поиск строки ограничен поиском
Команды TSS
Хотя это выходит за рамки данной статьи, наиболее часто используемые TSS команды были:
- НОВАЯ - новый файл (т.е. пустой файл; очищает рабочую область редактора)
- Старый - старый файл перенесен в рабочую область редактора
- СПАСТИ - сохранить новый файл (имя файла не может существовать)
- ВОССТАНОВИТЬ - пересохранить рабочее пространство редактора в существующий файл
Пример кода
Этот код был взят из TEX основанная на приключенческой игре, написанная командой разведчиков-скаутов из GE Post 635, Скенектади, штат Нью-Йорк, около 1980 года. Приключенческая игра была первой из нескольких популярных онлайн-приключенческих текстовых игр, доступных на сервисе GE Timesharing. Разведчики решили создать свою приключенческую игру, используя TEX. В оригинальной приключенческой игре для навигации использовались команды из двух слов. Колоссальная пещера. Парсер, показанный ниже, обрабатывал простые команды из двух слов, например идти на запад или переместить вправо и преобразовал их в дельты x, y для позиционирования и ориентации в игре.
Разбор двух словесных команд Adventure:
_ ... основная часть программы здесь для краткости пропущена _ где выполняется вызов! init и повторные вызовы! parser ...! init _ принудительно очищает экран телевизионного терминала: * esc, ":" _ clear программные переменные rmdr = * null del = 0 dir = "n" xlocn = 1 ylocn = 1 return
_ _______________________________________________________________ _ _ _ Подпрограмма PARSER интерпретирует ваши входные команды и пытается _ предварительно обработать их перед возвратом в вашу программу. _ _! 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! look_cmd msg = "mlk" call! sense_to return! listen_cmd msg = "mli" call! sense_to return! tear_cmd msg = "msm" call! sense_it return! touch_cmd msg = "mto" call! sense_it return! paste_cmd msg = "mta" call! sense_it return! cast_cmd call! cast_it 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 = "n" xdel = 0 ydel = del return _! inv_west! rt_northeast! lt_southeast! to_e! to_east dir = "e" xdel = del ydel = 0 return _! inv_north! rt_southeast! lt_southwest! to_s! to_south dir = "s "xdel = 0 ydel = -del return _! inv_east! rt_southwest! lt_northwest! to_w! to_west dir =" w "xdel = -del ydel = 0 return _! 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
! sense_to call! ask3 ercall! to_same call! to_ $ ans $ msg = msg, dir call! msg return _ _ _ _______________________________________________________________! sense_it call! ask3! sense_it_1 if ans: eqs: * null in: verb, "что ?? ? " ans = * in goto! sense_it_1 msg = msg, ans call! msg return _ _ _ _______________________________________________________________ _! msg i = 1! msg_1 ergo! msg_end out: $ (msg, i) $ i = i + 1 clear $ (msg, i) $ goto! msg_1! msg_end return
_ _ Подпрограммы ASK получают ввод от терминала и разбивают его _ в зависимости от пробелов. _! ask1, если rmdr: eqs: * null in: qry rmdr = * in sntc = * null! ask2 if sntc: eqs: * null scan: rmdr: "." sntc = * l rmdr = * r] '1! ask3 сканирование: sntc: "" ans = * l sntc = * r return
Бросок костей:
_ _ _ _______________________________________________________________ _ _ Подпрограмма DICE бросает кости за вас и возвращает ответ _ в переменной DICE. _ _ Ввод в подпрограмму DICE осуществляется через переменную DICE, как показано ниже: _ _ 1d6 - бросьте 6-гранный кубик один раз _ 3d8 - бросьте 8-гранный кубик 3 раза _ d% - бросьте 100-гранный кубик один раз ( процент броска) _! dice if dice: eqs: "d%" dice = "1d100" сканирование: dice: "d" i = * lj = * 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
Коды телеэкранов:
_ _ _ Следующие процедуры позволяют легко рисовать на _ терминале Televideo 950. _ _ xyplot - позиционирует курсор _ _ gr - включает графический режим _ _ nogr - выключает графический режим _ _ clear - очищает экран _ _ load - используется xyplot для загрузки 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, ":" возврат
Примечательные особенности
Самая примечательная особенность в TEX был его ПОДПИСКИ режим, позволяющий значениям переменных пересекаться и становиться исполняемым кодом. Это позволило программисту на лету создавать новые переменные для использования в дальнейшем. TEX выражения в LISP -подобная мода. TEX также позволял программистам создавать сценарии на лету через редактирование строки, сохраняя содержимое в файл позже для выполнения как часть текущей программы с использованием межфайлового взаимодействия вызов и перейти к заявления. Однако в большинстве случаев эти функции использовались для обеспечения простого динамического перейти к операторы в коде, как показано в примере парсера приключенческой игры. Какие еще виды Искусственный интеллект конструкции, которые можно было разработать, никогда полностью не исследовались.
Пример создания переменных на лету, а затем их использования для создания межфайлового файла перейти к.
_ включить x, y, z в пул глобальных переменных cmd = "x = 1 y = 2 z = 3" subs? ? cmd?
_ затем мы модифицируем mycat / mypgm_1_2, чтобы сказать «привет, мир». Мы пишем код для последующего выполнения в нашем скрипте old mycat / mypgm_1_2 r: * cl: /! label_3 out: 'Hello World' / resave mycat / mypgm_1_2
_ наконец, мы подставляем в x, y, z, а затем оцениваем goto mypgm_1_2! label_3, который выполняет переход между файлами goto mycat / mypgm_? x? _? y?! label_? z?
В TEX Программа выше иллюстрирует создание динамического сценария, а затем выполнение с помощью подстановки, редактирования файла и межфайлового взаимодействия. перейти к с. Фактически программы, пишущие программы, были возможны, хотя и редко. В приведенном выше примере mycat / mypgm_1_2 файл будет выполнен в label_3 распечатка "Привет мир".
использованная литература
- Руководство пользователя TEX (DF72) - Honeywell Information Systems, Copyright 1979
- Краткий справочник TEX - Информационные системы Honeywell, Авторское право 1979 г.
- Каталог программного обеспечения (AW15 Rev05), Honeywell Information Systems, Copyright 1979, Раздел 4 - Series 600/6000, Series 60 / Level 66, стр. 4-42 TEX Executive Processor
- Р. В. Бемер, «Введение в язык 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 Forum XXXI, 158-160, 1980 12-15 октября Первый в мире полудуплексный полноэкранный редактор.
- ^ Введение в TEX, стр.144 Возраст интерфейсов - август 1978 г.
- ^ * Дональд Э. Кнут. TeXbook (Компьютеры и набор текста, Том А). Ридинг, Массачусетс: Эддисон-Уэсли, 1984. ISBN 0-201-13448-9.