Kurs REXX cz. 5: Funkcje i procedury

W kolejnej odsłonie kursu omówimy zagadnienia związane z funkcjami i procedurami, które są idealnym sposobem podziału kodu na użyteczne części. W większości przypadków programy, które przyjdzie nam napisać, będą rozbudowane i skomplikowane, ale dzięki funkcjom i procedurom podzielimy je na mniejsze oraz łatwiejsze do napisania i zrozumienia fragmenty. W tej części kursu w przykładach pomijany będzie początkowy komentarz.

<<następna część artykułupoprzednia część artykułu>>
1.Co to jest funkcja?

Funkcja jest wydzieloną częścią programu, która musi zwracać wartość w miejscu swojego wywołania. W REXXie zawsze jest to pojedynczy ciąg znaków(funkcja nigdy nie zwraca dwóch wartości). Interpreter REXXa rozpoznaje funkcje po nazwie oraz mieszczącym się bezpośrednio za nią lewym nawiasie „(„ (pomiędzy nazwą a nawiasem nie powinno być spacji).

Przykład:

Str_Parm = "Ta zmienna będzie parametrem"; /*przypisanie zmiennej*/

Int_Counter = Length(Str_Parm); /*wywołanie funkcji Length i przypisanie
zwracanej przez nią wartości do zmiennej Int_Counte */ 

Say "Ilośćznaków: "Int_Counter;

 

Exit 0

 

W powyższym przykładzie funkcja Length zwraca ilość znaków (włącznie ze spacjami) zawartych w przekazanym argumencie. Funkcje mogą przyjmować różne ilości argumentów, które oddzielamy od siebie przecinkiem. Argumenty mogą być wymagane lubopcjonalne (w przypadku systemu z/OS maksymalna ilość argumentów to20). W REXXie wyróżniamy funkcje wbudowane, wewnętrzne oraz zewnętrzne. Funkcja Lengthużyta w naszym przykładzie jest funkcjąwbudowaną, która została opracowane specjalnie po to abyśmy niemusieli tworzyć jej sami. Interpreter wyszukuje funkcje w kolejności:

  • Wewnętrzne
  • Wbudowane
  • Zewnętrzne
2. Funkcje wewnętrzne

Funkcje wewnętrzne są napisaną przez nas częścią programu. Przykład ich zastosowania:

/*Przykład wykorzystania funkcji wewnętrznej */
/*Funkcja zwraca podaną liczbę podniesioną do kwadratu */

 

Sq = Fun_Internal(7);

 

Say Sq; 

 

Exit 0 
/*Funkcje wewnętrzne */

 

Fun_Internal: 

 

ParseArg x. 

 

y = x * x; 

Return

 

Jak widać naprzykładzie funkcje wewnętrze tworzymy po instrukcji Exit. Fun_Internal jest etykietą po której interpreter wyszukuje funkcję.

3. Funkcje wbudowane

Są to najprostsze i zapewne najczęściej wykorzystywane ze wszystkich rodzajów funkcji.Mamy do dyspozycji funkcje służące do:

  • Manipulowania ciągami znaków (stringami)
  • Porównania
  • Formatowania
  • Konwersji

a ponadto rozróżniamy:

  • Binarne
  • Arytmetyczne
  • Diagnostyczne

Poniższe przykłady prezentują niektóre z ww. rodzajów funkcji.

Manipulowanie ciągami znaków:

/*Przykłady niektórych funkcji przydatnych przy manipulowaniu stringami*/ .
.
/*Funkcja Substr */ 
Str_var = Substr('KursREXXa',6); 
Say Str_var; /*Wyświetla REXXa (od 6 znaku) */ 

 

Str_var = Substr('KursREXXa',3,5); 
Say Str_var; /*Wyświetla rs RE (5 znaków zaczynając od 3) */ 

 

/*Funkcja Strip usuwa spacje */
Str_var = Strip('Kurs REXXa ');
Say Str_var; /*Wyświetla 'Kurs REXXa' */
  
Str_var = Strip('Kurs REXXa ','L');
  
Say Str_var; /*Wyświetla 'Kurs REXXa ' (usuwa spacje tylko z lewej strony) */

 

Str_var = Strip('Kurs REXXa ','T');
Say Str_var; /*Wyświetla ' Kurs REXXa' (usuwa spacje tylko z prawej strony) */
  
/*Funkcja Left oraz Right wycina zadaną ilość znaków odpowiednio zlewej i prawej strony */
  
Str_var = Left('KursREXXa',5); 
Say Str_var /*Wyświetla Kurs */ 
  
Str_var = Right('KursREXXa',5); 
Say Str_var /*Wyświetla REXXa*/ 
  
/*Funkcja Insert wstawia nowe słowo w podanym miejscu */ 
Str_var = Insert('','KursREXXa',4); 
Say Str_var /*Wyświetla Kurs REXXa (wstawia argument pierwszy w miejscu podanym w argumencie 3) */
  
/*Funkcja Center wyśrodkowuje podany argument */ 
Str_var = Center('KursREXXa',16,'-'); 
Say Str_var /*Wyświetla ---Kurs REXXa--- */

 

/*Funkcja Word */ 
Str_var = Word('KursREXXa',2); 
Say Str_var /*Wyświetla REXXa */ 

 

/*Funkcja Words */ 
Int_var = Words('KursREXXa na serwerblog.com'); 
Say Int_var; /*Wyświetla 4 (ilość słów) */ 
  
/*Funkcja Translate */ 
Str_var = Translate('KursREXXa','Y','X');
Say Str_var; /*Wyświetla Kurs REYYa */ 
  
Str_var = Translate('6789051234','KursREXXa','1234567890') 
Say Str_var; /*Wyświetla REXXa Kurs */ 

 

Exit 0

 

Porównania:

/*Funkcja Datatype */
SayDatatype('KursREXXa'); /*Wyświetla CHAR */
SayDatatype(10); /*Wyświetla NUM */ 
 
/*Funkcja Compare */ 
SayCompare('REXX','REXX'); /*Wyświetla 0 */ 
SayCompare('Kurs','REXX'); /*Wyświetla 1 */ 

 

Exit 0 

 

Konwersji:

/*Konwersja char => hex */ 
SayC2X('A'); /*Wyświetla C1 */ 

 

/*Konwersja hex => char */ 
SayX2C('C1'); /*Wyświetla A */ 

 

/*Konwersja char => dec */ 
SayC2D('A'); /*Wyświetla 193 */ 

 

/*Konwersja dec => char */ 
SayD2C('193') /*Wyświetla A */ 

 

/*Konwersja bin => hex */ 
 SayB2X('1100') /*Wyświetla C */ 
  
/*Konwersja hex => bin */ 
SayX2B('C') /*Wyświetla 1100 */ 

 

Exit 0

 

W przykładach zademonstrowano jedynie wybrane funkcje w celu zobrazowania ich działania. Lista wszystkich funkcji wraz z przykładami dostępna jest w darmowym podręczniku IBM „TSO/E REXX Reference”.

5. Procedury

Procedury odfunkcji odróżnia sposób wywołania oraz to, że nie muszą zwracać wartości. Procedury wywołujemy używając instrukcji Call:

Say "Procedury"; 

 

Say "Tojest główna część programu"; 
Str_var1 = "Argument1"; 
Str_var2 = "Argument2"; 
 Call My_SubroutineStr_var1 Str_var2 
SayResult; 
 Say "Koniec działania programu"; 
 Exit 0 
/*Procedury */ 
My_Subroutine: 
ParseArg xy
Ret_Str = "Procedura wraz z przekazanym argumentem ", 
x"oraz "y .
Return Ret_Str 

 

Stosowanie procedur zapobiega tak zwanemu „Spaghetti code” – ułatwia zrozumienie oraz czytanie kodu.

Autor: Dawid Morawiec

 

Komentarze

Brak komentarzy

The comments are closed.

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.

Subskrybuj RSS