Język programowania wykonawczego tekstu - Text Executive Programming Language

W 1979 roku firma Honeywell Information Systems ogłosiła nowy język programowania dla swojej usługi podziału czasu o nazwie TEX , akronim dla systemu przetwarzania tekstu Text Executive . TEX był językiem skryptowym pierwszej generacji, opracowanym w czasach AWK i używanym przez firmę Honeywell początkowo jako wewnętrzne narzędzie do automatyzacji testów systemowych.

TEX rozszerzył edytor liniowy usługi Honeywell Time-Sharing Service (TSS) o programowalne możliwości, co pozwoliło użytkownikowi na większą swobodę w tworzeniu łatwych w użyciu rozszerzeń edycji, a także pisaniu skryptów w celu zautomatyzowania wielu innych zadań związanych z podziałem czasu, wykonywanych wcześniej przez bardziej złożone TSS Programy FORTRAN.

Przegląd

TEX był podsystemem Honeywell TSS . Użytkownicy wpisywaliby polecenie TSS tex”, aby zmienić tryb pracy na sesję TEX . Wyrażenia TEX można wprowadzać bezpośrednio w wierszu poleceń lub uruchamiać z pliku skryptu za pomocą polecenia TEX CALL „nazwa pliku” .

Programy TEX to zbiór poleceń edycji wiersza TSS , poleceń sesji TSS i instrukcji TEX . Zmienne TEX można wstawiać do poleceń TSS i poleceń edytora wierszowego TSS za pośrednictwem funkcji zastępowania zmiennych TEX . Programy TEX zostały zaprojektowane przede wszystkim w celu rozszerzenia systemu edytorów liniowych. W konsekwencji, TEX nie miał koncepcji wejścia / wyjścia pliku, polegającego zamiast tego na stosowaniu poleceń edycji wiersza do pliku roboczego i zapisywaniu w razie potrzeby.

Głównymi programistami TEX w Honeywell byli Eric Clamons i Richard Keys oraz Robert Bemer , znany jako ojciec ASCII i dziadek COBOL , pełniący rolę doradczą.

TEX-a nie powinien być mylony z TeX- em, językiem znaczników składu wymyślonym przez Donalda Knutha .

Amerykańskie Towarzystwo Matematyczne również twierdził znak towarowy dla TeX-a, który został odrzucony, ponieważ w tym czasie został osądzony (1980), „TEX” (wszystkie czapki) została zarejestrowana przez Honeywell na „Executive tekst” system przetwarzania tekstu.

Zmienne

Wszystkie zmienne były przechowywane jako łańcuchy i w razie potrzeby konwertowane na liczby całkowite. Zmienne zmiennoprzecinkowe, tablice lub inne typy danych powszechne w obecnych językach skryptowych nie istniały w środowisku TEX .

Wszystkie zmienne były przechowywane w jednej globalnej puli zmiennych, którą użytkownicy musieli zarządzać, aby uniknąć konfliktów nazewnictwa zmiennych. W TEX- ie nie było możliwości określania zakresu zmiennych . Nazwy zmiennych były ograniczone do 40 znaków.

TEX dostarczył kilka wewnętrznych rejestrów tylko do odczytu zwanych funkcjami gwiazdy lub zmiennymi gwiazdowymi, które zmieniały stan, gdy wykonywane były pewne operacje analizowania łańcuchów TEX-a . Funkcje gwiazdy dostarczyły środków do uzyskania bieżącej daty i godziny, łańcuchów wynikowych z operacji parsowania podzielonych lub skanowanych łańcuchów, poziomu wywołania wewnętrznego TEX- a i informacji o sesji TSS .

Maksymalna długość wartości ciągu wynosiła 240 znaków ASCII. Obejmuje to pośrednie wyniki podczas oceny wyrażenia TEX . Numeryczne wartości ciągów są ograniczone do 62 cyfr w ciągu, w tym (-) dla liczb ujemnych. Wartości liczbowe są również znormalizowane, gdy wiodące zera są usuwane z reprezentacji ciągu.

Kilka przykładów użycia zmiennych:

   _ we can use quotes or other characters as delimiters as long as the string doesn't contain them
   a="hello"

   _ here we use the / character as a delimiter (a common practice especially if the string has a " char)
   b=/world/
   _ here we are concatenating strings together via the comma concatenation operator
   c=a,/ /,b
   _ the out statement will print  "hello world" to the terminal without the quotes
   out:c
   _ here we use a TEX variable in a line editing command to find a line starting with "hello world"
   hello="hello world"
   f:hello
   _ here we are replacing the "hello" string with the "hello world" string
   rs:a:c


Operatorzy

TEX ma trzy typy operatorów:

  • arytmetyka
  • boolean
  • strunowy

Podczas konstruowania wyrażenia TEX wszystkie spacje muszą zostać skompresowane, z wyjątkiem literałów łańcuchowych. Zasadniczo spacje ograniczają instrukcje TEX .

   _ 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
   _ the space separates the 'if' from the expression and the expression from the next TEX command to conditionally execute

   if a:eqs:"hello" out:a


Arytmetyka

TEX obsługuje tylko podstawowe operacje arytmetyczne na liczbach całkowitych:

  • jednoargumentowy prefiks numeru znaku (+/-)
  • dodawanie (+),
  • odejmowanie (-),
  • mnożenie (*) i
  • podział (/)

z maksymalnie 16 poziomami nawiasów.

Oto kilka przykładów:

   a=1

   b=-2

   c=3*(a-b)/(2*2+(4+1))


Operatory logiczne

Operatory logiczne TEX występują w dwóch wersjach:

  • porównania numeryczne
  • porównania ciągów

Najczęściej były używane w kontekście instrukcji kontrolnej IF .

Lista dostępnych liczbowych operatorów logicznych w TEX to:

  • : eq: or : eqn: zwraca t jako prawdę, jeśli dwie wartości są liczbowo równe
  • : ge: or : gen: zwraca t jako prawdę, jeśli pierwsza wartość jest liczbowo równa lub większa od drugiej wartości
  • : le: lub : len: zwraca t dla prawdy, jeśli pierwsza wartość jest liczbowo równa lub mniejsza od drugiej wartości
  • : gt: or : gtn: zwraca t jako prawdę, jeśli pierwsza wartość jest liczbowo większa niż druga wartość
  • : lt: or : ltn: zwraca t jako prawdę, jeśli pierwsza wartość jest liczbowo mniejsza od drugiej
  • : ne: lub : nen: zwraca t jako prawdę, jeśli pierwsza wartość nie jest liczbowo równa drugiej wartości

Lista dostępnych łańcuchowych operatorów logicznych to:

  • : eqs: zwraca t jako prawdę, jeśli dwie wartości łańcuchów są identyczne pod względem znaków, wielkości liter i długości
  • : ges: zwraca t jako prawdę, jeśli pierwszy łańcuch jest większy lub równy drugiemu pod względem wielkości liter i długości
  • : les: zwraca t jako prawdę, jeśli pierwszy łańcuch jest mniejszy lub równy drugiemu ciągowi pod względem wielkości liter i długości
  • : gts: zwraca t jako prawdę, jeśli pierwszy łańcuch jest większy lub równy drugiemu pod względem wielkości liter i długości
  • : lts: zwraca t jako prawdę, jeśli pierwszy łańcuch jest mniejszy niż drugi ciąg pod względem wielkości liter i długości
  • : nes: zwraca t jako prawdę, jeśli pierwszy łańcuch NIE jest równy drugiemu pod względem wielkości liter i długości

Tryb TEX CASE ma wpływ na łańcuchowe operatory logiczne . W trybie CASE ciągi takie jak „ABC” i „abc” były uznawane za równe ( TEX konwertował „ABC” na „abc” przed porównaniem). W trybie NOCASE ciąg „abc” byłby uważany za większy niż ciąg „ABC” na podstawie wartości punktu kodowego ASCII, ponieważ „a” jest wartością większą niż wartość punktu kodowego „A” ASCII.

Operator logiczny NOT był reprezentowany przez znak okalający (^).

Kilka przykładów operatorów logicznych w akcji:

   if name:eqs:"luke"   out:"May the force be with you!"

   if ^age:gtn:500  out:"Heh, you can't be Yoda!" 

TEX nie dostarczył i / lub łączników do tworzenia bardziej złożonych wyrażeń boolowskich. Zamiast tego programiści musieli używać zagnieżdżonych instrukcji if dla i połączeń oraz bloku instrukcji if ... zrobić coś do obsługi lub połączeń:

   _ 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:"Its true!" goto !next_block
   !its_false out:"Its false!" goto !next_block

   !next_block
   ...do something...

Operatory łańcuchowe

Łączenie ciągów znaków w TEX-u zapewnia operator przecinka:

   a="hello"," "," world"

TEX dostarczył kilka operatorów dzielących ciągi znaków:

  • dzielenie łańcucha od lewej i zapisywanie lewej strony ('])
  • dzielenie łańcucha od lewej i zapisywanie prawej strony (] ')
  • dzielenie łańcucha z prawej strony i zapisywanie lewej strony ('[)
  • dzielenie łańcucha z prawej strony i zapisywanie prawej strony ([')

Niektóre przykłady dzielenia ciągów:

   a="hello world"

   b=a']5

   c=a]'5

   out:"It's a strange new ",c," but ",b," anyways!"


TEX dostarczył kilka operatorów skanowania / analizowania ciągów znaków:

  • skanowanie łańcucha od lewej do danego podciągu i zapisywanie lewej strony ('>)
  • skanowanie łańcucha od lewej do danego podciągu i zapisywanie prawej strony (> ')
  • skanowanie łańcucha od prawej strony dla danego podciągu i zapisywanie lewej strony ('<)
  • skanowanie łańcucha z prawej strony dla danego podciągu i zapisywanie prawej strony (<')

Niektóre przykłady skanowania / analizowania ciągów znaków:

   a="hello world"

   b=a'>" "

   out:b


Etykiety

Wszystkie etykiety instrukcji TEX zostały poprzedzone przedrostkiem (!). Etykiety instrukcji były generalnie ignorowane, chyba że odwoływały się do nich instrukcje goto lub call . Istotną cechą TEX-a była możliwość wywoływania lub przechodzenia do etykiet w innych plikach. W połączeniu z trybem TEX SUBS oznaczało, że TEX mógł tworzyć nowe skrypty poprzez edycję linii, zapisywać, a następnie dynamicznie wywoływać lub pobierać etykiety w tych skryptach.

Plik mypgm :


   !hello
   out:"hello world"
   return

   !hello2
   out:"hello world again"
   exit

   (end-of-file marker)


Przykład wywołania według etykiety:

   call /mycat/mypgm!hello


W powyższym przykładzie TEX przetworzy plik / mycat / mypgm w poszukiwaniu etykiety! Hello (*). TEX kontynuowałby przetwarzanie pliku do momentu wykonania instrukcji return lub exit lub osiągnięcia końca pliku.

Przejdź do przykładu etykiety:

   goto /mycat/mypgm!hello2


W następnym przykładzie TEX przetworzy plik / mycat / mypgm w poszukiwaniu etykiety! Hello2 (*). TEX będzie kontynuował przetwarzanie do momentu osiągnięcia instrukcji wyjścia lub końca pliku. Wystąpiłby błąd, gdyby została wykonana instrukcja return i nie było aktywnych wywołań CALL.

(*) TEX nie sprawdził zduplikowanych etykiet w tym samym pliku , w konsekwencji wykonanie było nieprzewidywalne, jeśli było obecne.

Zastępstwa

TEX udostępnia polecenia SUBS i NOSUBS do włączania lub wyłączania podstawiania zmiennych w kolejnych instrukcjach TEX lub komendach TSS .


   xx=/out:"Hello World"/

   subs ?

   ?xx?
      
   nosubs

   ?xx?


W powyższym przykładzie zmienna xx zawiera instrukcję wyjściową TEX jako swoją wartość. Komenda subs określa, że ​​(?) Jest znakiem zastępczym dla wszystkich przyszłych instrukcji programu. Po przetworzeniu pierwszego ? Xx? linia, TEX zastąpi w out: "Hello World" polecenie xx? a następnie wykonaj wynikową instrukcję. Polecenie nosubs wyłącza podstawianie kolejnych instrukcji, więc TEX wyświetla błąd, gdy próbuje wykonać drugie ? Xx? linia.

Pośrednictwa

Oprócz podstawiania zmiennych, TEX obsługiwał zmienne pośrednie. Uważano, że zmienne poprzedzone znakiem podkreślenia (_) zawierają nazwę zmiennej jako swoją zawartość, więc TEX użyłby wartości pośredniej, aby uzyskać wartość. TEX ograniczył niezależność do 64 poziomów, aby uniknąć możliwego zapętlenia.

Jako przykład:

   a="b"
   b="c"
   c="hello world"

   _ here the out would print "hello world" to the terminal, 
   _   since __a == _b == c and so the command became out:c.
   out:__a

Wejście wyjście

Sesje Honeywell Timesharing miały koncepcję pliku roboczego. Aby edytować istniejący plik, należy najpierw ustawić go jako plik roboczy za pomocą starego polecenia. Aby utworzyć nowy plik, należy go najpierw utworzyć za pomocą nowego polecenia. Po wprowadzeniu zmian można albo zapisać (dla nowych plików), albo ponownie zapisać plik roboczy. W zasadzie tylko jeden plik mógł być jednocześnie otwarty do edycji.

Programy TEX zostały zaprojektowane przede wszystkim w celu rozszerzenia systemu edytorów liniowych. W konsekwencji TEX nie miał koncepcji wejścia / wyjścia pliku, polegającego zamiast tego na wprowadzaniu zmian w pliku roboczym za pomocą poleceń edycji wiersza i zapisywaniu w razie potrzeby.

Jednak TEX zapewnia polecenia wejścia / wyjścia zorientowane na terminal:

  • in - wyświetla podpowiedź i wstrzymuje do wprowadzenia tekstu, przechowując go w zmiennej * in star
  • out - wydrukuj wiadomość

Prosty przykład użycia wejścia i wyjścia :

   in:"What is your name?"

   out:"Hi ",*in


Zmienne i funkcje gwiazdowe

TEX dostarczył zmienne gwiazdowe jako środek dostępu do wyników lub skutków ubocznych funkcji systemu TEX lub do przedstawienia kodów terminala ASCII.

Poniżej znajduje się lista zmiennych gwiazdowych :

  • * konto - numer konta użytkownika powiązany z aktualnym identyfikatorem użytkownika
  • * cl - bieżąca linia aktualnie edytowanego pliku
  • * lcl - długość wartości * cl
  • * clvl - aktualna głębokość wywołań
  • * data - aktualna data w formacie RR-MM-DD
  • * eof - T, jeśli jest umieszczony za ostatnim wierszem bieżącego pliku lub gdy nie ma bieżącego pliku
  • * in - zawiera ostatnią odpowiedź na wykonanie polecenia in lub int TEX
  • * lin - długość * in
  • * left lub * l - lewy łańcuch z wykonania polecenia skanowania lub podziału
  • * lleft lub * ll - długość * left
  • * middle lub * m - środkowy ciąg z wykonania polecenia skanowania lub podziału
  • * lmiddle lub * lm - długość * środka
  • * right lub * r - prawy ciąg z wykonania polecenia skanowania lub podziału
  • * lright lub * lr - długość * right
  • * null - reprezentuje pusty ciąg
  • * losowe - zawiera losowo wybraną cyfrę od 0 do 9
  • * rmdr - pozostała część ostatniej operacji dzielenia
  • * snumb - numer systemowy ostatniego uruchomienia zadania wsadowego
  • * svmd - komendy TEX do przywracania trybów TEX w czasie ostatniego wywołania interfile lub goto
  • * sw00 do * sw35 - analizuje 36-bitowe słowo przełączające TSS z 1 bitem zwracającym wartość T i 0 bitem zwracającym F
  • * czas - aktualny czas w gg: mm: ss zawsze z dokładnością do najbliższej sekundy
  • * userid - aktualny identyfikator użytkownika

Kody terminali

Kody terminali zostały odwzorowane na funkcje gwiazdy, aby można je było łatwo odnaleźć w programach TEX .

  • * nul - null
  • * soh - początek nagłówka
  • * stx - początek tekstu
  • * etx - koniec tekstu
  • * eot - koniec transmisji
  • * enq - zapytanie
  • * Ack - potwierdź
  • * bel - dzwonek
  • * bs - backspace
  • * ht - zakładka pozioma
  • * lf - nowy wiersz
  • * vt - tabulator pionowy
  • * ff - format strony
  • * cr - powrót karetki
  • * więc - przesuń się
  • * si - shift in
  • * dle - ucieczka łącza danych
  • * dc1 - sterowanie urządzeniem 1
  • * dc2 - sterowanie urządzeniem 2
  • * dc3 - sterowanie urządzeniem 3
  • * dc4 - sterowanie urządzeniem 4 (stop)
  • * nak - negatywne potwierdzenie
  • * syn - synchroniczne bezczynność
  • * etb - koniec bloku transmisji
  • * can - anulować
  • * em - koniec medium
  • * sub - substytut
  • * esc - ucieczka
  • * fs - separator pól
  • * gs - separator grup
  • * rs - separator rekordów
  • * us - separator jednostek
  • * del - usuń

Polecenia

TEX został zbudowany w oparciu o edytor linii TSS , ponieważ takie polecenia edytora wierszowego mogą być używane w programie TEX. Programy TEX mogą mieć:

  • Polecenia edycji linii TSS
  • Polecenia TEX
  • Polecenia trybu TEX
  • Polecenia systemowe TSS

Edytuj polecenia

Ogólny format polecenia był następujący:

   verb:<search_expression>;<repeat_count>;<occurrence_count>:<replacement_string>


⟨Search_expression⟩ może zawierać zakres, jak w F: / hello /, / world /, aby znaleźć wszystkie wiersze zaczynające się od ciągu „hello” i zawierające również ciąg „world”.

TEX dostarczył standardowe polecenia do edycji plików oparte na wierszach:

  • P : wypisuje bieżącą linię
  • F : przejdź do przodu przez bieżący plik linia po linii
  • B : przejdź wstecz przez bieżący plik linia po linii
  • A : dołącz po bieżącej linii
  • I : wstaw przed bieżącą linią
  • R : zastąp bieżący podanym wyrażeniem
  • D : usuń bieżącą linię
  • copy : skopiuj bieżącą linię
  • wytnij : skopiuj i usuń bieżącą linię
  • wklej : wklej to, co zostało wycięte lub skopiowane przed bieżącą linią

Każde polecenie można zmodyfikować za pomocą numerycznej wartości powtarzalnej lub gwiazdki (*):

  • P; 999 : drukuje następne 999 wierszy od bieżącej pozycji
  • P; * : wypisuje wszystkie wiersze od bieżącej pozycji do końca pliku
  • F; 999 : przejdź o 999 linii do przodu od bieżącej pozycji
  • F; * : przejdź na koniec pliku
  • B; 999 : przesuń wstecz o 999 linii od bieżącej pozycji
  • B; * : przejdź do pierwszej linii pliku

Polecenia można dalej modyfikować za pomocą ciągu pasującego do linii lub wyrażenia:

  • F: / xxx /; 999 przejdź do wiersza zaczynającego się od 999-tego wystąpienia / xxx /
  • B: / xxx /; 999 przejdź wstecz do wiersza rozpoczynającego się od 999-tego wystąpienia / xxx /
  • I: / xxx /; 999: / yyy / wstaw wiersz yyy przed następnymi 999 wierszami zaczynającymi się od / xxx /
  • R: / xxx /; 999; / yyy / zamień następne 999 wierszy zaczynających się od / xxx / linią / yyy /
  • D: / xxx /; 999 usuń następne 999 wierszy zaczynających się od / xxx /

W trybie ciąg An S został dodany. Za każdym razem, gdy w wierszu znaleziono / xxx /, zastosowano edycję:

  • FS: / xxx /; 999 przejdź do 999. wystąpienia ciągu / xxx /
  • IS: / xxx /; 999: / yyy / wstaw ciąg / yyy / przed następnymi 999 wystąpieniami / xxx /
  • RS: / xxx /; 999: / yyy / zamień następne 999 wystąpień ciągu / xxx / na / yyy /
  • DS: / xxx /; 999 usuń następne 999 wystąpień ciągu / xxx /

Wreszcie, polecenia można dalej modyfikować za pomocą V, aby włączyć tryb weryfikacji, i za pomocą O, aby określić tryb łańcucha wystąpienia n-tego :

  • RVO: / xxx /; 99; 999: / yyy / zamień 999. wystąpienie ciągu / xxx / na / yyy / i powtórz to 99 razy

Istnieje kilka innych rzadziej używanych poleceń edycji:

  • mark - aby uwzględnić pliki w plikach, gdy instrukcja .mark ⟨filename⟩ zostanie znaleziona w bieżących lub później dołączanych plikach (operacja rekurencyjna)
  • befl - wstaw przed bieżącą linią (normalnie polecenie "A" było używane do wstawiania po bieżącej linii)
  • trul ⟨col⟩ - obcina skrajne lewe kolumny bieżącego pliku
  • trur ⟨col⟩ - obcina skrajne prawe kolumny w bieżącym pliku

We wszystkich formatach poleceń edycji, / xxx / lub / yyy / lub 999 można zastąpić zmienną TEX. Ponadto wartość 999 można zastąpić gwiazdką (*), aby oznaczyć wszystkie wystąpienia.

Polecenia TEX

TEX nie dostarcza poleceń do numerycznego lub warunkowego zapętlania lub przełączania przypadków, jak to jest powszechne we współczesnych językach skryptowych. Musiały być one skonstruowane przy użyciu poleceń if , labels i goto . Na przykład, aby wyeliminować zduplikowane wiersze z pliku, można użyć:

   !ELIM_DUPS a=*cl f;1
   _
   !NEXT_LINE if *eof out:"task complete" return

   b=*cl if a:eqs:b d goto !NEXT_LINE

   a=b f;1 goto !NEXT_LINE

Polecenia TEX:

  • call ⟨filepath⟩! ⟨label⟩ - wywołuje podprogram w bieżącym programie lub w innym pliku. rozmowa kończy się, gdy zatrzymanie lub zwrot
  • clear ⟨variable_name⟩ - usuń nazwaną zmienną z puli lub użyj *, aby usunąć wszystkie zmienne
  • goto ⟨filepath⟩! ⟨label⟩ - przejdź do nazwanego pliku i etykiety
  • ercall ⟨filepath⟩! ⟨label⟩ - wywołuje podprogram w przypadku błędu w poprzednim poleceniu
  • ergoto ⟨filepath⟩! ⟨label⟩ - procedura goto w przypadku błędu w poprzednim poleceniu
  • if ⟨expression⟩ - jeśli jest warunkowe, wyrażenie ma postać <zmienna | wartość>: op: <zmienna | wartość>, gdzie op jest jedną z operacji porównawczych wspomnianych wcześniej.
  • in: ⟨expression⟩ - wypisuje wyrażenie i czeka na wejście. Przechowuj dane wejściowe w zmiennej * in
  • int: ⟨expression⟩ - wypisuje wyrażenie i czeka na dane wejściowe z terminala. Zapisz dane wejściowe w zmiennej * in .
  • * null - brak powrotu karetki wejścia z terminala, używany do zakończenia trybu wstawiania w programie TEX. Żadne inne polecenia nie mogą znajdować się w tej samej linii.
  • stop - zatrzymuje program TEX
  • _ - wiersz uwag
  • return - powrót z wywołania podprogramu
  • out: ⟨expression⟩ - wypisuje wyrażenie na terminalu
  • outt: ⟨expression⟩ - wymusza wypisanie wyrażenia (i wszystkich wcześniejszych wyników jeszcze nie opróżnionych) na terminalu
  • scan: ⟨operand-a⟩: ⟨operand-b⟩ - skan ⟨operand-a⟩ od lewej do prawej szukając ⟨operand-b⟩ i parsuj ⟨operand-a⟩ umieszczając wyniki w * left , * middle i * prawe zmienne gwiazdowe i jeśli * match to T, to znaleziono dopasowanie.
  • scann: ⟨operand-a⟩: ⟨operand-b⟩ - skanowanie ⟨operand-a⟩ od lewej do prawej w poszukiwaniu ⟨operand-b⟩ i parsowanie ⟨operand-a⟩ umieszczając wyniki w * left , * middle i * prawe zmienne gwiazdy i jeśli * match to T, to znaleziono dopasowanie. scann ⟨operand-b⟩ był ograniczony do jednej postaci lub klasy postaci LC (* = małej litery alfabetu * uc = dużej litery alfabetu, * n = numeryczne * a = literami (LC * + * UC) * an = alfanumerycznym (* a + * n))
  • scanr: ⟨operand-a⟩: ⟨operand-b⟩ - skanuj ⟨operand-a⟩ od prawej do lewej w poszukiwaniu ⟨operand-b⟩ i parsuj ⟨operand-a⟩ umieszczając wyniki w * left , * middle i * prawe zmienne gwiazdy i jeśli * match to T, to znaleziono dopasowanie.
  • scannr: ⟨operand-a⟩: ⟨operand-b⟩ - skanowanie ⟨operand-a⟩ od prawej do lewej w poszukiwaniu ⟨operand-b⟩ i parsowanie ⟨operand-a⟩ umieszczając wyniki w * left , * middle i * prawe zmienne gwiazdy i jeśli * match to T, to znaleziono dopasowanie. scannr ⟨operand-b⟩ był ograniczony do jednego znaku lub klasy znaków (* lc = mała litera alfabetyczna, * uc = duża litera alfabetyczna, * n = numeryczna, * a = alfabetyczna (* lc + * uc), * an = alfanumeryczna (* a + * n))
  • split: ⟨operand-a⟩: ⟨operand-b⟩ - split ⟨operand-a⟩ na pozycji ⟨operand-b⟩ zaczynając od początku ⟨operand-a⟩ umieszczając wyniki w * left , * middle i * right zmienne gwiazdowe
  • splitr: ⟨operand-a⟩: ⟨operand-b⟩ - split ⟨operand-a⟩ na pozycji ⟨operand-b⟩ zaczynając od końca ⟨operand-a⟩ umieszczając wyniki w * left , * middle i * right zmienne gwiazdowe
  • subs ⟨subs_character⟩ - włącz tryb subs, w którym TEX będzie skanował w poszukiwaniu par <subs_character>, oceniając wyrażenie i umieszczając je w linii przed wykonaniem linii. Tryb SUBS jest wyłączony przez NOSUBS
  • trace - włącz tryb śledzenia, w którym linie są wyświetlane przed wykonaniem. Tryb śledzenia jest wyłączany przez NOTRACE
  • Vari - wyświetla wszystkie zmienne i ich wartości w tym zmiennych gwiazd

Tryby TEX

Tryby TEX definiują sposób działania innych poleceń TEX. * SVMD zmienna zawierał aktualny stan wszystkich trybach TEX w postaci komend TEX przywrócić tryby. Każdy tryb miał odwrotne polecenie wyłączenia trybu, co można było zrobić w dowolnym momencie.

  • subs ⟨char⟩ / nosubs - aktywuj tryb subs, w którym TEX będzie skanował w poszukiwaniu par znaków, oceniając wyrażenie i umieszczając je w linii przed wykonaniem linii.
  • trace / notrace - aktywuj tryb śledzenia, w którym wiersze są wyświetlane przed wykonaniem.
  • case / nocase - konwertuje wszystkie łańcuchy na małe litery przed operacjami porównania
  • octl ⟨char⟩ / nooctl - zdefiniuj ósemkowy znak prefiksu (np. octl% a następnie rs: / BELL /: /% 007 / )
  • maska ​​⟨char⟩ / nomask - zdefiniuj znak maski do dopasowania do dowolnego znaku w ciągu wyszukiwania
  • cols ⟨col⟩ / nocols - zdefiniuj okno kolumn, w których wyszukiwanie łańcuchów jest ograniczone do wyszukiwania

Polecenia TSS

Chociaż wykraczały poza zakres tego artykułu, najczęściej używanymi poleceniami TSS były:

  • NOWOŚĆ - nowy plik (tj. Pusty plik; czyści obszar roboczy edytora)
  • STARY - stary plik przeniesiony do obszaru roboczego edytora
  • SAVE - zapisz nowy plik (nazwa pliku nie może istnieć)
  • RESAVE - ponownie zapisz obszar roboczy edytora do istniejącego pliku

Przykładowy kod

Ten kod pochodzi z gry przygodowej opartej na technologii TEX, napisanej przez zespół Explorer Scouts z GE Post 635, Schenectady w stanie Nowy Jork, około 1980 roku. Gra przygodowa była pierwszą z kilku popularnych, tekstowych gier przygodowych dostępnych w usłudze GE Timesharing. Zwiadowcy postanowili stworzyć własną grę przygodową za pomocą TEX-a . Oryginalna gra przygodowa wykorzystywała dwa polecenia słowne do poruszania się po Colossal Cave . Przedstawiony poniżej parser obsługiwał proste polecenia składające się z dwóch słów, takie jak idź na zachód lub przesuń w prawo i konwertował je na delty x, y w celu pozycjonowania i orientacji kierunkowej w grze.

Przetwarzanie przygody dwóch poleceń słownych:

   _ ...main body of program skipped here for brevity
   _    where a call !init and repeated calls to !parser are done...
   
   !init 
   _ force a clear screen on the televideo terminal
   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
   !look_cmd   msg="mlk" call !sense_to return
   !listen_cmd msg="mli" call !sense_to return
   !smell_cmd  msg="msm" call !sense_it return
   !touch_cmd  msg="mto" call !sense_it return
   !taste_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," what ???" 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
   _
   _ The ASK subroutines get yout terminal input and break it up depending
   _ on the spaces.
   _
   !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

Rzucanie koścmi:

   _
   _
   _ _______________________________________________________________
   _
   _ 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

Kody ekranowe Televideo:

   _ 
   _
   _ 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


Godne uwagi funkcje

Najbardziej godną uwagi cechą TEX-a był tryb SUBS , pozwalający na krzyżowanie się wartości zmiennych i przekształcanie ich w kod wykonywalny. Pozwoliło to programiście tworzyć w locie nowe zmienne do wykorzystania w późniejszych wyrażeniach TEX- owych w sposób podobny do LISP- a . TEX umożliwił także programistom tworzenie skryptów w locie poprzez edycję liniową, zapisując zawartość do pliku później, aby mogła zostać wykonana jako część bieżącego programu przy użyciu wywołania interfile i instrukcji goto . Jednak w większości przypadków te funkcje były używane do dostarczania prostych dynamicznych instrukcji goto w kodzie, jak pokazano w przykładzie parsera gry Adventure. Jakie inne rodzaje konstrukcji sztucznej inteligencji można było opracować, nigdy nie zostały w pełni zbadane.

Przykład tworzenia zmiennych w locie, a następnie używania ich do wykonania interfile goto .

   _ 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 to say "hello world" we are writing some code to execute later in our script
   old mycat/mypgm_1_2
   r:*cl:/!label_3 out:'Hello World'/
   resave mycat/mypgm_1_2
   _ 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?!label_?z?


Powyższy program TEX ilustruje tworzenie dynamicznych skryptów, a następnie ich wykonywanie poprzez podstawianie, edycję plików i gotowość do tworzenia plików . W efekcie programy piszące programy były możliwe, chociaż rzadko się to robiło. W powyższym przykładzie plik mycat / mypgm_1_2 zostałby wykonany na etykiecie_3, drukując "hello world" .

Bibliografia

  • Podręcznik użytkownika TEX (DF72) - Honeywell Information Systems, Copyright 1979
  • Skrócona instrukcja TEX - Honeywell Information Systems, Copyright 1979
  • Katalog oprogramowania (AW15 Rev05), Honeywell Information Systems, Copyright 1979, Rozdział 4 - Seria 600/6000, Seria 60 / Poziom 66, str. 4-42 TEX Executive Processor
  • RWBemer, „Introduction to the TEX language - Part I”, Interface Age Magazine, tom 3, nr 8, 144–147, 1978 sierpień
  • RWBemer, „Wprowadzenie do języka TEX - część II”, „Interface Age Magazine”, tom 3, nr 9, 124–127, 1978 wrzesień
  • RWBemer, „Wprowadzenie do języka TEX - część III”, „Interface Age Magazine”, tom 3, nr 10, 126–131, 1978 październik
  • RWBemer, "edytor ekranowy oparty na TEX", Proc. HLSUA Forum XXXI, 158–160, 1980 12-15 października Pierwszy na świecie pełnoekranowy edytor półdupleksowy.