Rexx - Rexx

Rexx
Rexx-img-lg.png
Paradygmat wieloparadygmat : proceduralny , ustrukturyzowany
Zaprojektowany przez Mike Cowlishaw
Deweloper Mike Cowlishaw, IBM
Po raz pierwszy pojawiły się 1979 ; 42 lata temu ( 1979 )
Wersja stabilna
ANSI X3.274/1996 ; 25 lat temu ( 1996 )
Dyscyplina pisania Dynamiczny
Rozszerzenia nazw plików .cmd, .bat, .exec, .rexx, .rex, EXEC
Główne wdrożenia
VM/SP R3, TSO/E V2, SAAREXX, ARexx , BREXX, Regina, Personal REXX, REXX/imc
Dialekty
NetRexx , Object REXX , teraz ooREXX , KEXX
Wpływem
PL/I , ALGOL , EXEC , EXEC 2
Pod wpływem
NetRexx , obiekt REXX

Rexx ( Restructured Extended Executor ) to interpretowany język programowania opracowany w IBM przez Mike'a Cowlishaw . Jest to ustrukturyzowany, wysokopoziomowy język programowania zaprojektowany z myślą o łatwości uczenia się i czytania. Zastrzeżone i otwarte interpretery Rexx istnieją dla szerokiej gamy platform komputerowych; istnieją kompilatory dla komputerów mainframe IBM .

Rexx jest używany jako język skryptów i makr i jest często używany do przetwarzania danych i tekstu oraz generowania raportów; te podobieństwa z Perlem oznaczają, że Rexx działa dobrze w programowaniu Common Gateway Interface (CGI) i rzeczywiście jest używany do tego celu. Rexx jest podstawowym językiem skryptowym w niektórych systemach operacyjnych, na przykład OS / 2 , MVS , VM , AmigaOS , a także jest wykorzystywany jako wewnętrzny język makro w jakimś innym oprogramowaniem, takim jak SPFPC , kedit , THE a Zoc emulatora terminala. Dodatkowo język Rexx może być używany do tworzenia skryptów i makr w dowolnym programie używającym języków silników skryptowych Windows Scripting Host ActiveX (np. VBScript i JScript), jeśli zainstalowano jeden z silników Rexx.

Rexx jest dostarczany z VM/SP Release 3 w górę, TSO/E w wersji 2 w górę, OS/2 (1.3 i nowsze, gdzie oficjalnie nazywa się Procedures Language/2 ), AmigaOS w wersji 2 w górę, PC DOS ( 7.0 lub 2000 ), ArcaOS i Windows NT 4.0 (zestaw zasobów: Regina). Skrypty REXX dla OS/2 współdzielą rozszerzenie nazwy pliku .cmd z innymi językami skryptowymi, a pierwszy wiersz skryptu określa interpreter, który ma być użyty. Makra REXX dla aplikacji obsługujących REXX używają rozszerzeń określonych przez aplikację. Pod koniec lat 80. Rexx stał się powszechnym językiem skryptowym w architekturze aplikacji systemów IBM , gdzie przemianowano go na „SAA Procedure Language REXX”.

Skrypt lub polecenie Rexx jest czasami określane jako EXEC w nawiązaniu do typu pliku CMS używanego w skryptach EXEC , EXEC 2 i REXX w systemach CP/CMS i od VM/370 do z/VM .

Cechy

Rexx ma następujące cechy i cechy:

  • Prosta składnia
  • Możliwość kierowania poleceń do wielu środowisk
  • Możliwość obsługi funkcji, procedur i poleceń związanych z określonym środowiskiem wywoływania.
  • Wbudowany stos z możliwością współdziałania ze stosem hosta, jeśli taki istnieje.
  • Mały zestaw instrukcji zawierający zaledwie dwa tuziny instrukcji
  • Dowolna składnia
  • Tokeny bez rozróżniania wielkości liter, w tym nazwy zmiennych
  • Podstawa ciągu znaków
  • Dynamiczne wpisywanie danych , bez deklaracji
  • Brak zarezerwowanych słów kluczowych , z wyjątkiem kontekstu lokalnego
  • Nie obejmuje funkcji plików
  • Dowolna precyzja liczbowa
  • Arytmetyka dziesiętna, zmiennoprzecinkowa
  • Bogaty wybór wbudowanych funkcji, zwłaszcza przetwarzanie tekstów i tekstów
  • Automatyczne zarządzanie magazynem
  • Ochrona przed zderzeniem
  • Struktury danych adresowalne treści
  • Tablice asocjacyjne
  • Prosty dostęp do poleceń i udogodnień systemu
  • Prosta obsługa błędów oraz wbudowane śledzenie i debugger
  • Kilka sztucznych ograniczeń
  • Uproszczone urządzenia I/O
  • Operatorzy niekonwencjonalni
  • Tylko częściowo obsługuje parametry wiersza poleceń w stylu Uniksa, z wyjątkiem określonych implementacji
  • Nie zapewnia podstawowej kontroli terminala jako części języka, z wyjątkiem określonych implementacji
  • Nie zapewnia ogólnego sposobu dołączania funkcji i podprogramów z zewnętrznych bibliotek, z wyjątkiem określonych implementacji

Rexx ma tylko dwadzieścia trzy lata, w dużej mierze oczywiste, instrukcje (takie jak call, parsei select) z minimalnym interpunkcji i wymagań formatowania. Jest to w zasadzie język o niemal dowolnej formie, zawierający tylko jeden typ danych, ciąg znaków; ta filozofia oznacza, że ​​wszystkie dane są widoczne (symboliczne), a debugowanie i śledzenie są uproszczone.

Składnia Rexxa wygląda podobnie do PL/I , ale ma mniej notacji; to sprawia, że ​​jest trudniejsze do przeanalizowania (przez program), ale łatwiejsze w użyciu, z wyjątkiem przypadków, w których nawyki PL/I mogą prowadzić do niespodzianek. Jednym z celów projektowych REXX była zasada najmniejszego zdziwienia .

Historia

przed 1990

Rexx został zaprojektowany i po raz pierwszy zaimplementowany, w języku asemblerowym , jako projekt 'własny' między 20 marca 1979 a połową 1982 roku przez Mike'a Cowlishawa z IBM, pierwotnie jako skryptowy język programowania mający zastąpić języki EXEC i EXEC 2 . Został zaprojektowany jako język makr lub skryptów dla dowolnego systemu. Jako taki, Rexx jest uważany za prekursora Tcl i Pythona . Rexx miał być również w zamyśle swojego twórcy uproszczoną i łatwiejszą do nauczenia wersją języka programowania PL/I . Jednak pewne różnice w stosunku do PL/I mogą potykać się o nieostrożnych.

Po raz pierwszy został publicznie opisany na konferencji SHARE 56 w Houston w Teksasie w 1981 roku, gdzie reakcja klientów, popierana przez Teda Johnstona z SLAC , doprowadziła do tego, że został wysłany jako produkt IBM w 1982 roku.

Przez lata IBM włączał Rexx do prawie wszystkich swoich systemów operacyjnych ( VM/CMS , MVS TSO/E , IBM i , VSE/ESA , AIX , PC DOS i OS/2 ), a także udostępniał wersje dla Novell NetWare , Windows , Java i Linux .

Pierwsza wersja bez IBM została napisana dla PC DOS przez Charlesa Daneya w 1984/5 i sprzedawana przez Mansfield Software Group (założona przez Kevina J. Kearneya w 1986 roku). Pierwsza wersja kompilatora pojawiła się w 1987 roku, napisana dla CMS przez Lundina i Woodruffa. Inne wersje zostały również opracowane dla Atari , AmigaOS , Unix ( wiele wariantów ), Solaris , DEC , Windows , Windows CE , Pocket PC , DOS , Palm OS , QNX , OS/2 , Linux , BeOS , EPOC32 / Symbian , AtheOS , OpenVMS , Apple Macintosh i Mac OS X .

Amiga wersja Rexx, zwany ARexx został dołączony AmigaOS 2 wzwyż i był popularny skryptów oraz kontroli aplikacji. Wiele aplikacji amigowych ma wbudowany "port ARexx", który pozwala na kontrolę aplikacji z Rexx. Pojedynczy skrypt Rexx może nawet przełączać się między różnymi portami Rexx w celu kontrolowania kilku uruchomionych aplikacji.

1990 do chwili obecnej

W 1990 roku Cathie Dager z SLAC zorganizowała pierwsze niezależne sympozjum Rexx, które doprowadziło do powstania Stowarzyszenia Językowego REXX. Sympozja odbywają się corocznie.

Dostępnych jest kilka darmowych wersji Rexx. W 1992 roku pojawiły się dwa najczęściej używane porty open-source : REXX/imc Iana Colliera dla Uniksa i Regina Andersa Christensena (później zaadoptowany przez Marka Hesslinga) dla Windows i Unix. BREXX jest dobrze znany z platform WinCE i Pocket PC i został "przeportowany" do VM/370 i MVS .

OS/2 posiada wizualny system rozwoju z Watcom VX-REXX . Innym dialektem był VisPro REXX firmy Hockware.

Portable Rexx firmy Kilowatt i Personal Rexx firmy Quercus to dwa interpretery Rexx zaprojektowane dla systemu DOS i mogą być uruchamiane również w systemie Windows za pomocą wiersza poleceń. Od połowy lat 90. pojawiły się dwa nowsze warianty Rexxa:

  • NetRexx : kompiluje do Javy bajtowego kodu poprzez kod źródłowy Java; nie ma w ogóle zastrzeżonych słów kluczowych i używa modelu obiektowego Java, a zatem nie jest ogólnie kompatybilne w górę z „klasycznym” Rexxem.
  • Object REXX : zorientowana obiektowo, ogólnie kompatybilna w górę wersja Rexx.

W 1996 roku American National Standards Institute (ANSI) opublikował standard dla Rexx: ANSI X3.274–1996 „Information Technology – Programming Language REXX”. Od 1985 roku opublikowano ponad dwa tuziny książek na temat Rexxa.

Rexx obchodził swoje 25. urodziny 20 marca 2004 r., które obchodzono na 15. Międzynarodowym Sympozjum REXX REXX w Böblingen, Niemcy, w maju 2004 r.

12 października 2004 r. IBM ogłosił swój plan udostępnienia źródeł implementacji Object REXX na licencji Common Public License . Ostatnie wydania Object REXX zawierają aparat skryptowy ActiveX Windows Scripting Host (WSH) implementujący tę wersję języka Rexx.

22 lutego 2005 roku ogłoszono pierwsze publiczne wydanie Open Object Rexx (ooRexx). Ten produkt zawiera silnik skryptowy WSH, który pozwala na programowanie systemu operacyjnego Windows i aplikacji za pomocą Rexx w ten sam sposób, w jaki Visual Basic i JScript są implementowane przez domyślną instalację WSH oraz silniki skryptowe Perl , Tcl , Python innych firm.

W styczniu 2017 r. REXX znalazł się w indeksie TIOBE jako jeden z pięćdziesięciu języków w pierwszej setce, które nie należą do pierwszej pięćdziesiątki.

W 2019 roku 30. Sympozjum Stowarzyszenia Językowego Rexx uczciło 40. rocznicę powstania firmy Rexx. Sympozjum odbyło się w Hursley w Anglii, gdzie Rexx został po raz pierwszy zaprojektowany i wdrożony.

Zestawy narzędzi

Rexx/Tk, zestaw narzędzi graficznych do wykorzystania w programach Rexx w taki sam sposób, jak Tcl/Tk, jest powszechnie dostępny.

Rexx IDE, RxxxEd, został opracowany dla systemu Windows. Opracowano RxSock do komunikacji sieciowej, a także inne dodatki i implementacje Regina Rexx, a interpreter Rexx dla wiersza poleceń Windows jest dostarczany w większości zestawów Resource Kit dla różnych wersji systemu Windows i działa pod wszystkimi z nich, a także DOS.

Pisownia i wielkie litery

Pierwotnie język nazywał się Rex ( Reformed Executor ); dodano dodatkowy „X”, aby uniknąć kolizji z nazwami innych produktów. REX był pierwotnie pisany wielkimi literami, ponieważ kod mainframe był zorientowany na wielkie litery. Styl w tamtych czasach polegał na używaniu nazw pisanych wielkimi literami, częściowo dlatego, że prawie cały kod był wtedy pisany wielkimi literami. Produktem stał się REXX, a oba wydania książki Mike'a Cowlishawa używają wielkich liter. Rozszerzenie do REstructured eXtended eXecutor zostało użyte w produkcie systemowym w 1984 roku.

Składnia

Zapętlanie

Struktura kontroli pętli w Rexx zaczyna się od a DOi kończy na a, ENDale występuje w kilku odmianach. NetRexx używa słowa kluczowego LOOPzamiast DOzapętlania, podczas gdy ooRexx traktuje LOOPi DOjako równoważne podczas zapętlania.

Pętle warunkowe

Rexx obsługuje różne tradycyjne pętle programowania strukturalnego podczas testowania warunku przed ( do while) lub po ( do until) wykonaniem listy instrukcji:

 do while [condition]
 [instructions]
 end
 do until [condition]
 [instructions]
 end

Powtarzające się pętle

Podobnie jak większość języków, Rexx może zapętlić się podczas zwiększania zmiennej indeksu i zatrzymać się po osiągnięciu limitu:

 do index = start [to limit] [by increment] [for count]
 [instructions]
 end

Przyrost może zostać pominięty i domyślnie wynosi 1. Limit można również pominąć, co powoduje, że pętla będzie trwać w nieskończoność.

Rexx dopuszcza pętle zliczane, w których wyrażenie jest obliczane na początku pętli, a instrukcje w pętli są wykonywane tyle razy:

 do expression
 [instructions]
 end

Rexx może nawet zapętlać się, dopóki program nie zostanie zakończony:

 do forever
 [instructions]
 end

Program może wyrwać się z pętli prądowej za pomocą leaveinstrukcji, co jest normalnym sposobem wyjścia z do foreverpętli, lub zwierać ją za pomocą iterateinstrukcji.

Połączone pętle

Co najbardziej niezwykłe, Rexx pozwala na łączenie elementów warunkowych i powtarzalnych w tej samej pętli:

 do index = start [to limit] [by increment] [for count] [while condition]
 [instructions]
 end
 do expression [until condition]
 [instructions]
 end

Warunkowe

Warunki testowe z IF:

 if [condition] then
 do
 [instructions]
 end
 else
 do
 [instructions]
 end

ELSEKlauzula jest opcjonalna.

W przypadku pojedynczych instrukcji, DOa ENDtakże można je pominąć:

 if [condition] then
 [instruction]
 else
 [instruction]

Wcięcie jest opcjonalne, ale pomaga poprawić czytelność.

Testowanie dla wielu warunków

SELECTjest strukturą CASE Rexxa , podobnie jak wiele innych konstrukcji wywodzących się z PL/I . Podobnie jak niektóre implementacje konstrukcji CASE w innych językach dynamicznych, WHENklauzule Rexxa określają pełne warunki, które nie muszą być ze sobą powiązane. Pod tym względem bardziej przypominają kaskadowe zestawy IF-THEN-ELSEIF-THEN-...-ELSEkodu niż instrukcje C lub Java switch.

 select
 when [condition] then
 [instruction] or NOP
 when [condition] then
 do
 [instructions] or NOP
 end
 otherwise
 [instructions] or NOP
 end

Do NOPwykonuje instrukcje „nie działanie” i jest używany, gdy programista chce zrobić nic, w miejscu, gdzie byłby wymagany jeden lub więcej instrukcji.

Klauzula OTHERWISE jest opcjonalna. Jeśli zostanie pominięty i nie zostaną spełnione żadne warunki WHEN, wywoływany jest warunek SKŁADNIA.

Proste zmienne

Zmienne w Rexx są beztypowe i początkowo są oceniane jako ich nazwy, pisane wielkimi literami. Zatem typ zmiennej może się różnić w zależności od jej użycia w programie:

 say hello /* => HELLO */
 hello = 25
 say hello /* => 25 */
 hello = "say 5 + 3"
 say hello /* => say 5 + 3 */
 interpret hello /* => 8 */
 drop hello
 say hello /* => HELLO */

Zmienne złożone

W przeciwieństwie do wielu innych języków programowania, klasyczny Rexx nie ma bezpośredniego wsparcia dla tablic zmiennych adresowanych przez indeks numeryczny. Zamiast tego udostępnia zmienne złożone . Zmienna złożona składa się z rdzenia, po którym następuje ogon. A . (kropka) służy do łączenia łodygi z ogonem. Jeśli używane ogony są numeryczne, łatwo jest uzyskać ten sam efekt, co tablica.

 do i = 1 to 10
 stem.i = 10 - i
 end

Następnie istnieją następujące zmienne o następujących wartościach: stem.1 = 9, stem.2 = 8, stem.3 = 7...

W przeciwieństwie do tablic, indeks zmiennej macierzystej nie musi mieć wartości całkowitej. Na przykład poprawny jest następujący kod:

 i = 'Monday'
 stem.i = 2

W Rexx możliwe jest również ustawienie domyślnej wartości pnia.

 stem. = 'Unknown'
 stem.1 = 'USA'
 stem.44 = 'UK'
 stem.33 = 'France'

Po tych przydziałach termin stem.3wytworzy 'Unknown'.

Cały pień można również wymazać poleceniem DROP.

 drop stem.

Powoduje to również usunięcie wszelkich wcześniej ustawionych wartości domyślnych.

Zgodnie z konwencją (a nie jako część języka) związek stem.0jest często używany do śledzenia liczby elementów w rdzeniu, na przykład procedura dodawania słowa do listy może być zakodowana w następujący sposób:

 add_word: procedure expose dictionary.
 parse arg w
 n = dictionary.0 + 1
 dictionary.n = w
 dictionary.0 = n
 return

Możliwe jest również posiadanie wielu elementów w ogonie zmiennej złożonej. Na przykład:

 m = 'July'
 d = 15
 y = 2005
 day.y.m.d = 'Friday'

W celu uzyskania efektu tablicy wielowymiarowej można użyć wielu numerycznych elementów ogona.

Funkcje podobne do zmiennych złożonych Rexx można znaleźć w wielu innych językach (m.in. tablice asocjacyjne w AWK , skróty w Perlu i Hashtables w Javie ). Większość z tych języków zawiera instrukcje do iteracji po wszystkich kluczach (lub ogonach w terminologii Rexx) takiej konstrukcji, ale brakuje tego w klasycznym Rexxie. Zamiast tego konieczne jest odpowiednie prowadzenie pomocniczych list wartości ogona. Na przykład w programie do liczenia słów można użyć następującej procedury do zarejestrowania każdego wystąpienia słowa.

 add_word: procedure expose count. word_list
 parse arg w .
 count.w = count.w + 1 /* assume count. has been set to 0 */
 if count.w = 1 then word_list = word_list w
 return

a potem później:

 do i = 1 to words(word_list)
 w = word(word_list,i)
 say w count.w
 end

Kosztem pewnej przejrzystości możliwe jest połączenie tych technik w jedną łodygę:

 add_word: procedure expose dictionary.
 parse arg w .
 dictionary.w = dictionary.w + 1
 if dictionary.w = 1 /* assume dictionary. = 0 */
 then do
 n = dictionary.0+1
 dictionary.n = w
 dictionary.0 = n
 end
 return

i później:

 do i = 1 to dictionary.0
 w = dictionary.i
 say i w dictionary.w
 end

Rexx nie zapewnia tu żadnej siatki bezpieczeństwa, więc jeśli jedno ze słów okaże się być liczbą całkowitą mniejszą, dictionary.0ta technika w tajemniczy sposób zawiedzie.

Ostatnie implementacje Rexx, w tym IBM Object REXX i implementacje open source, takie jak ooRexx, zawierają nową konstrukcję językową, aby uprościć iterację wartości rdzenia lub innego obiektu kolekcji, takiego jak tablica, tabela lub lista.

 do i over stem.
 say i '-->' stem.i
 end

Instrukcje dotyczące słów kluczowych

ANALIZOWAĆ

PARSEInstrukcja jest szczególnie silny; łączy w sobie kilka przydatnych funkcji obsługi ciągów. Jego składnia to:

 parse [upper] origin [template]

gdzie pochodzenie określa źródło:

  • arg (argumenty, na najwyższym poziomie końca linii poleceń)
  • linein (standardowe wejście, np. klawiatura)
  • pull (kolejka danych Rexx lub standardowe wejście)
  • source (informacje o sposobie wykonania programu)
  • value(wyrażenie) with: słowo kluczowe withjest wymagane do wskazania, gdzie kończy się wyrażenie
  • var (zmienna)
  • version (numer wersji/wydania)

a szablon może być:

  • lista zmiennych
  • ograniczniki numeru kolumny
  • ograniczniki dosłowne

upperjest opcjonalne; jeśli zostanie określony, dane zostaną przekonwertowane na wielkie litery przed analizowaniem.

Przykłady:

Używanie listy zmiennych jako szablonu

 myVar = "John Smith"
 parse var myVar firstName lastName
 say "First name is:" firstName
 say "Last name is:" lastName

wyświetla następujące informacje:

 First name is: John
 Last name is: Smith

Używanie ogranicznika jako szablonu:

 myVar = "Smith, John"
 parse var myVar LastName "," FirstName
 say "First name is:" firstName
 say "Last name is:" lastName

wyświetla również następujące informacje:

 First name is: John
 Last name is: Smith

Używając ograniczników numerów kolumn:

 myVar = "(202) 123-1234"
 parse var MyVar 2 AreaCode 5 7 SubNumber
 say "Area code is:" AreaCode
 say "Subscriber number is:" SubNumber

wyświetla następujące informacje:

 Area code is: 202
 Subscriber number is: 123-1234

Szablon może używać kombinacji zmiennych, ograniczników literałów i ograniczników numerów kolumn.

INTERPRETOWAĆ

Instrukcja INTERPRET ocenia swój argument i traktuje jego wartość jako instrukcję Rexx. Czasami INTERPRET jest najbardziej przejrzystym sposobem wykonania zadania, ale często jest używany tam, gdzie możliwy jest bardziej przejrzysty kod, np value(). .

Inne zastosowania INTERPRET to arytmetyka arbitralnej precyzji Rexxa (dziesiętna) (w tym porównania rozmyte), użycie instrukcji PARSE z szablonami programowymi, tablicami macierzystymi i tablicami rzadkimi.

 /* demonstrate INTERPRET with square(4) => 16 */
 X = 'square'
 interpret 'say' X || '(4) ; exit'
 SQUARE: return arg(1)**2

Wyświetla 16 i wychodzi. Ponieważ zawartość zmiennych w Rexx to łańcuchy, w tym liczby wymierne z wykładnikami, a nawet całe programy, Rexx oferuje interpretację łańcuchów jako wyrażeń obliczanych.

Ta funkcja może być używana do przekazywania funkcji jako parametrów funkcji , takich jak przekazywanie SIN lub COS do procedury obliczania całek.

Rexx oferuje tylko podstawowe funkcje matematyczne, takie jak ABS, CYFRY, MAX, MIN, ZNAK, RANDOM oraz kompletny zestaw konwersji szesnastkowych i binarnych z operacjami bitowymi. Bardziej złożone funkcje, takie jak SIN, zostały zaimplementowane od podstaw lub uzyskane z zewnętrznych bibliotek stron trzecich . Niektóre biblioteki zewnętrzne, zazwyczaj te zaimplementowane w językach tradycyjnych, nie obsługują rozszerzonej precyzji.

Późniejsze wersje (nieklasyczne) obsługują CALL variablekonstrukcje. Wraz z wbudowaną funkcją VALUECALL można używać zamiast wielu przypadków INTERPRET. To jest klasyczny program:

 /* terminated by input "exit" or similar */
 do forever ; interpret linein() ; end

Nieco bardziej wyrafinowany „Kalkulator Rexx”:

 X = 'input BYE to quit'
 do until X = 'BYE' ; interpret 'say' X ; pull X ; end

PULLto skrót od parse upper pull. Podobnie ARGjest skrótem dla parse upper arg.

Moc instrukcji INTERPRET miała inne zastosowania. Oprogramowanie Valor pakiet polegać interpretacyjnej Rexx zdolności do wdrożenia OOP środowiska. Inne zastosowanie znaleziono w niewydanym produkcie Westinghouse o nazwie Time Machine, który był w stanie w pełni odzyskać po krytycznym błędzie.

NUMERYCZNE

 say digits() fuzz() form() /* => 9 0 SCIENTIFIC */
 say 999999999+1 /* => 1.000000000E+9 */
 numeric digits 10 /* only limited by available memory */
 say 999999999+1 /* => 1000000000 */

 say 0.9999999999=1 /* => 0 (false) */
 numeric fuzz 3
 say 0.99999999=1 /* => 1 (true) */
 say 0.99999999==1 /* => 0 (false) */

 say 100*123456789 /* => 1.23456789E+10 */
 numeric form engineering
 say 100*123456789 /* => 12.34567890E+9 */

 say 53 // 7   /* => 4   (rest of division)*/
  Oblicza 2 Oblicza e
kod
 numeric digits 50
 n=2
 r=1
 do forever /* Newton's method */
 rr=(n/r+r)/2
 if r=rr then leave
 r=rr
 end
 say "sqrt" n ' = ' r
 numeric digits 50
 e=2.5
 f=0.5
 do n=3
 f=f/n
 ee=e+f
 if e=ee then leave
 e=ee
 end
 say "e =" e
wyjście sqrt 2 = 1,414213562373095048801688724209698078569671875377 e = 2,7182818284590452353602874713526624977572470936998

SYGNAŁ

Instrukcja SIGNAL jest przeznaczona do nietypowych zmian w przepływie sterowania (patrz następny rozdział). Jednak może być niewłaściwie używany i traktowany jak instrukcja GOTO znaleziona w innych językach (chociaż nie jest ściśle równoważna, ponieważ kończy pętle i inne konstrukcje). Może to generować trudny do odczytania kod.

Obsługa błędów i wyjątki

W Rexx można przechwytywać i radzić sobie z błędami i innymi wyjątkami za pomocą instrukcji SIGNAL. Istnieje siedem warunków systemowych: ERROR, FAILURE, HALT, NOVALUE, NOTREADY, LOSTDIGITS i SKŁADNIA. Obsługa każdego z nich może być włączana i wyłączana w kodzie źródłowym zgodnie z potrzebami.

Poniższy program będzie działał do momentu zakończenia przez użytkownika:

 signal on halt;
 do a = 1
	 say a
	 do 100000 /* a delay */
	 end
 end
 halt:
 say "The program was stopped by the user"
 exit

Rachunku przechwytuje zastosowania niezdefiniowanych zmiennych, które w przeciwnym razie byłoby uzyskać własny (wielkimi literami) nazwę jak ich wartości. Niezależnie od stanu warunku, zawsze można sprawdzić status zmiennej za pomocą wbudowanej funkcji zwracającej VAR dla zdefiniowanych zmiennych. signal on novalueNOVALUESYMBOL

VALUEFunkcja może być używana do pobierania wartości zmiennych nie powodując NOVALUEchoroby, ale jej głównym celem jest, aby czytać i ustawić środowisko zmiennych, podobne do POSIX getenv i putenv.

Warunki

ERROR
Pozytywne RC z polecenia systemowego
FAILURE
Ujemne RC dla polecenia systemowego (np. polecenie nie istnieje)
HALT
Nieprawidłowe zakończenie
NOVALUE
Odwołano się do nieustawionej zmiennej
NOTREADY
Błąd wejścia lub wyjścia (np. próby odczytu poza końcem pliku)
SYNTAX
Nieprawidłowa składnia programu lub inny stan błędu
LOSTDIGITS
Utracono znaczące cyfry (ANSI Rexx, nie w drugiej edycji TRL)

Gdy warunek jest obsługiwany przez SIGNAL ON, zmienne systemowe SIGLi RCmogą być analizowane w celu zrozumienia sytuacji. RC zawiera kod błędu Rexx, a SIGL zawiera numer wiersza, w którym wystąpił błąd.

Począwszy od wersji 4 Rexx warunki mogą otrzymywać nazwy, istnieje również CALL ONkonstrukcja. Jest to przydatne, jeśli funkcje zewnętrzne niekoniecznie istnieją:

 ChangeCodePage: procedure /* protect SIGNAL settings */
 signal on syntax name ChangeCodePage.Trap
 return SysQueryProcessCodePage()
 ChangeCodePage.Trap: return 1004 /* windows-1252 on OS/2 */

Zobacz też

Bibliografia

Dalsza lektura

  • Callaway, Merrill. Książka kucharska ARexx: Przewodnik po języku ARexx na komputerze osobistym Commodore Amiga . Whitestone, 1992. ISBN  978-0963277305 .
  • Callaway, Merrill. Książka kucharska Rexx: Przewodnik po języku Rexx w OS/2 i Warp na komputerze osobistym IBM . Whitestone, 1995. ISBN  0-9632773-4-0 .
  • Krowa, Michael. Język Rexx: praktyczne podejście do programowania . Prentice Hall, 1990. ISBN  0-13-780651-5 .
  • Krowa, Michael. Język NetRexx . Prentice Hall, 1997. ISBN  0-13-806332-X .
  • Daney, Charles. Programowanie w REXX . McGraw-Hill, Teksas, 1990. ISBN  0-07-015305-1 .
  • Ender, Tom. Programowanie obiektowe z Rexx . John Wiley & Sons, 1997. ISBN  0-471-11844-3 .
  • Fosdick, Howard. Rexx Referencje programisty . Wiley/Wrox, 2005. ISBN  0-7645-7996-7 .
  • Gargiulo, Gabriel. REXX z funkcjami OS/2, TSO i CMS . Szkolenie MVS, 1999 (wydanie trzecie 2004). ISBN  1-892559-03-X .
  • Goldberg, Gabriel i Smith, Philip H. Podręcznik Rexx . McGraw-Hill, Teksas, 1992. ISBN  0-07-023682-8 .
  • Goran, Richard K. REXX Podręcznik podsumowania referencyjnego . CFS Nevada, Inc., 1997. ISBN  0-9639854-3-4 .
  • Dokumentacja techniczna IBM. Implementacja obsługi Rexx w Sdsf . Vervante, 2007. ISBN  0-7384-8914-X .
  • Kiesel, Peter C. Rexx: Zaawansowane techniki dla programistów . McGraw-Hill, Teksas, 1992. ISBN  0-07-034600-3 .
  • Marco, Lou Programowanie ISPF/REXX dla doświadczonych programistów . CBM Books, 1995. ISBN  1-878956-50-7
  • O'Hara, Robert P. i Gomberg, David Roos. Nowoczesne programowanie przy użyciu Rexx . Prentice Hall, 1988. ISBN  0-13-597329-5 .
  • Rudd, Anthony S. „Praktyczne wykorzystanie TSO REXX”. CreateSpace, 2012. ISBN  978-1475097559 .
  • Schindlera, Williama. Na ziemię Rexx . Doskonałe oprogramowanie niszowe, 2000. ISBN  0-9677590-0-5 .

Zewnętrzne linki