Cours NetRexx

Cours Complet Le NETREXX Language Association site Web en PDF


Télécharger Cours Complet Le NETREXX Language Association site Web en PDF

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


Cours a propos du NETREXX Language Association site Web

...

FONCTIONS

Rexx dispose d'une syntaxe concise et de nombreuses fonctions . Ainsi words(x) renvoie le nombre de mots de x et word(c,n) renvoie le nième mot de c.

L'affectation se fait avec = ou par la puissante instruction parse .

Les boucles dérivent toutes de do ... end . Les test se font avec if then [else] ou avec select when/then [otherwise] end .

Un sous-programme se repère par le symbole de label : . Call appelle un sous-programme et return en ressort. Expose gère les paramètres "par adresse".

Pull est un résumé pour parse upper pull et lit au clavier avec conversion en majuscule . Parse pull lit sans convertir.

Call charout , écrit sans retour charriot, contrairement à say .

parse lit plusieurs valeurs, peut découper une phrase en morceaux, etc.

EXEMPLE 2

/* un programme élémentaire */

say " Votre nom ? " ; pull Nom

call charout , " et votre prénom ? " parse pull pren

call finprog

exit

finprog: procedure expose nom pren say " Au revoir, " Monsieur pren nom return

affiche à l'exécution :

Votre nom ?

hunault

et votre prénom ? gilles

Au revoir, MONSIEUR gilles HUNAULT

EXPLICATIONS DE L'EXEMPLE 2

/* un programme élémentaire */ say " Votre nom ? " ; pull Nom

écrit (say)           Votre

nom ?

passe à la ligne suivante

puis lit (pull) la réponse

hunault et la traduit en majuscules : nom contient donc HUNAULT

call charout , " et votre prénom ? " écrit               et votre prénom ? sans passer à la ligne

parse pull pren

lit au clavier sans traduire en majuscule : pren contient donc gilles call finprog

appelle le sous programme finprog finprog: procedure expose nom pren indique que nom et pren sont les variables précédentes

say " Au revoir, " Monsieur pren nom

écrit       Au revoir

Monsieur n'existe pas ; la variable monsieur est donc crée et initialisée avec MONSIEUR

écrit       Au revoir MONSIEUR gilles

HUNAULT

Return du sous programme rend la main au programme principal exit termine le programme principal

TESTS ET BOUCLES

/* Programme de la Table de multiplication       */

arg nbep . /* ne récupére que le premier argument */

/* on efface l'écran sous DOS */ 'CLS'

/* on écrit le titre centré sur 65 caractères et souligné par des - */

say center('table de multiplication',65) ; say centre(copies('- ',25),65)

do 2 ; say ; end /* on saute deux lignes */

/* s'il ny a pas de paramètre passé ou si le paramètre n'est pas de type numérique, entier et positif, on redemande un nombre */

if (nbep ="") | ^datatype(nbep,W) then             do

/* DEMANDE DU NOMBRE */

call charout , " Donner un nombre entier et positif " PULL nbep ; do ; say ; say ; end

end /* du si */

if nbep <= 0       /* TEST DE LA POSITIVITE SEULEMENT */

then say " Votre nombre n'est pas entier et positif" else do /* Table de Multiplication */

do Ifois = 1 to 10

say nbep " fois " right(' '||Ifois,2) " = "

format(nbep*Ifois,4)

end /* FIN_POUR Ifois DEUNA 10 */

end /* test si NBEP est positif */

La syntaxe de la boucle do est :                do i = . to . by . for . until .

while .

iterate reprend au début de do, leave quitte la boucle, exit quitte le programme. La fonction d2c() converit en caractères.

Ainsi do j = 1 by 3 ; call charout , d2c(64+j) ; if j > 13 then j = j-3 ; else iterate ; j = j+1 ; if j > 20 then exit ; end

affiche ADGJMPQRSTUVW ; j correspond en fait aux valeurs

1 4 7 10 13 16 17 18 19 20 21 22 23

PHRASES ET MOTS

On gère les phrases avec words(phr) et word(phr,i). Ainsi, à l'invite

du programme

say " donner une action étendue " ; pull act say " donner une spécif étendue " ; pull spe do i = 1 to words(act)

word(act,i) word(spe,i)

end

si on tape            dir          del         (va dans act)

puis       *.bat *.bak        (va dans spe)

les commandes dir *.bat et del *.bak seront exécutées.

car, rappelons le, toute commande non comprise va à l'environnement,

ici Dos.

Arg et Parse découpent aussi les phrases, les arguments, les valeurs ; ainsi le programme

phraz = "le petit chat / mange la souris"

say phraz stop

call proc1 phraz stop

exit

proc1 : procedure

arg a . b

say a say b return

affiche à l'exécution

le petit chat / mange la souris STOP

LE           (a)

CHAT / MANGE LA SOURIS STOP             (b)

De même, le programme

phraz = "le petit chat /"

phraz = phraz "mange la souris"

say phraz stop

call proc2 phraz stop

exit

proc2 : procedure

arg debut fin

parse upper var debut deb1 deb2

say debut

say deb1

say deb2

say fin

parse value fin"!" with dd "/" ff

say dd

say ff

return

affiche à l'exécution

le petit chat / mange la souris STOP LE

LE

PETIT CHAT / MANGE LA SOURIS STOP PETIT CHAT

MANGE LA SOURIS STOP!

Enfin, signalons que Rexx sait aussi assurer un découpage classique des sous-chaines, avec parse ou avec index et substr. Ainsi le programme

phraz = "le petit chat / mange la souris"

say phraz stop

say substr(phraz,1,7)

say substr(phraz,index(phraz,"t "),6)

call proc3 phraz stop

exit

proc3 : procedure

parse arg fraz

parse var fraz un 8 deux 15



say un

say deux

return

affiche à l'exécution

le peti

t chat

le peti

t chat

FICHIERS ET TABLEAUX

L'élément indice i du tableau T se note T.i ; i peut-être numérique ou caractère. On lit la ligne courante (disons L) du fichier F par L = linein(f) ; on ferme le fichier X par call lineout X. On écrit

Z sur Y par call lineout Y , Z. La fin de fichier se teste par lines(). Dosdir(F) renvoie les informations sur F ou "" si le fichier n'est pas vu. Le programme :

fn = 'Tst.Tmp' ; cnt. = 0 ; nf = 0 ; nbe = 0 ; tail = 0 do while lines(fn) ; lig = linein(fn) ; if lig <> "" then do

parse var lig nom ext kO . ; if pos("-",lig) > 0 then do

tail = tail + kO ;  nf = nf + 1 ;

if cnt.ext = 0 then do ; cnt.ext = 1 ; nbe = nbe + 1 ; end ; end ; end ; end ; call lineout fn say nf fichiers nbe extensions tail octets

appliqué au fichier :       STATDIR REX      2457      8-12

ST           REX 1357 8-12

TST TMP              28 8-12

3 Fichiers             776192 octets disponibles

affiche : 3 FICHIERS 2 EXTENSIONS 3842 OCTETS

DIVERS

Rexx contient de nombreuses autres fonctionnalités qui en font un très bon langage de commandes programmable et portable. Citons notamment la possibilité d'utiliser des piles et de queues dynamiques

et l'arithmétique étendue (consulter le fichier 37).

Exemples pour le langage REXX

Textes écrits par Gilles HUNAULT

/* xmp01 : lire et écrire */

say " hello "

say " ca va ? "

pull reponse

say " tiens, vous m'avez dit " reponse

/* xmp02 : lire et écrire plus sophistiqués */

say " hello "

call charout ," ca va ? "

parse pull reponse

say " tiens, vous m'avez dit " reponse

/* xmp03 : si alors sinon */

call charout , " donner un nombre ou une formule "

pull valeur .

interpret " n = " valeur

if n > 0

then say " cette valeur est positive et vaut " n

else do

say " cette valeur n'est pas positive"

say " au revoir. "

end

/* fin du si */

/* xmp04 : structure de cas */

call charout , " donner deux mot séparés par un espace blanc : "

pull n1 n2 n3 .

if n3 <> "" then do

say " vous avez donné plus de deux mots"

exit

end

select

when n1 < n2

then say "l'ordre ASCII est " n1 n

when n1=n2

then say " ces 2 mots sont égaux "

when n1 > n2

then say "l"d2c(39)"ordre ASCII est " n2 n1

end /* fin des cas */

/* xmp05 : boucles */

do i = 1 to 100 by 3 for 5

call charout , i " * "

iterate

end

say "

j = 11

do while (j < 25)

call charout , j " "

 j = j + 3

if j > 20 then leave

call charout , j

end

say "

j = 11

do until (j >20)

call charout , j " "

j = j + 3

end

say "

say

say " Boucle étrange " do j = 1 by 3

say j

if j > 13 then j = j-3

else iterate

j = j + 1

if j > 20 then exit end

/* xmp06 : tableaux */

jour.1 = 'Lundi' ; jour.2 = 'Mardi' ; jour.3 = 'Mercredi' ; jour.4 = 'Jeudi' ; jour.5 = 'Vendredi' ; jour.6 = 'Samedi' ; jour.7 = 'Dimanche'

i = 1

do j=1 until j > 30

call charout , jour.i || ' '

if i = 7 then do ; say ; i = 1 ; end

else i = i+1

end

/* xmp07 : parse, essayer avec XMP7 une petite phrase pour REXX */

parse value time() with HEURES ':' MINUTES ':' SECONDES say HEURES MINUTES

say

say " récupération de la phrase en deux variables " parse upper arg debut fin

say " 1 : " debut " 2 : " fin

say

say "un seul point ajouté et tout change" parse arg debut fin . say debut fin

/* xmp08 : appel de procédures */

say " Forme 1 "

do i = 1 to 5 call prix i end ; say

say " Forme 2 "

do i = 1 to 5 call prix2 end

exit

prix: procedure

arg j

say j "article(s) coutent " copies('*',2*j) 17.5*j " FRS." return

prix2: procedure expose i

say i "article(s) coutent " copies('*',3*i) 12.5*i " FRS." return

/* xmp09 : appel de programme, vérification de fichier */

arg nomfich .

if (nomfich = ?) | (nomfich='') then do

'clear'

say " Syntaxe : srexx xmpP09 "

exit

end

if state(nomfich) \= ''

then say " ok, ce fichier est accessible "

else say " désolé, il y aun problème avec le fichier " nomfich /* fin de si */

/* xmp10 : "Write a note to a disk file. Add today's date and time." */

/* The file is called "notes.doc"                */

parse arg newline

call lineout 'notes.doc', date() time() newline

call lineout 'notes.doc'

say " le fichier notes.doc contient : " "cat notes.doc"

/* xmp11 : Bonjour, programme de démonstration */

"clear"

call charout , "Ecrivez une commande comme ls -a ou man awk : "

parse pull rep



say "Donner une ou plusieurs notations ambigues sur la meme ligne,"

say " (par exemple comme *.rex ou x*) séparées par un ou plusieurs

espaces"

parse pull lamb

do i = 1 to words(lamb)

"clear"

sf = word(lamb,i)

say " voici un " rep " de " sf

rep sf

say

call charout , copies(" ",45) " Enter pour continuer "

pull .

end /* do i = 1 to word(lambs) */

/* xmp12 : un dialogue */

say "Bonjour. Ça va ? "

pull rep

select

when rep="OUI" then say "tant mieux "

when rep = "NON" then do

say " qu'est-ce qui ne va pas ?"

pull .

/* pull . signifie lire et ignorer polimen

cette réponse de l'utilisateur */

end

otherwise do

say" désolé, je n'ai rien compris !, je vous donne pourtant la

liste... "

say

'ls *.rex'

end

end

/* xmp13 : les 1111 */

numeric digits 200

/* Recherche de y tel que x*y ne contienne que des 1 pour x impair de 1 à 99 */

say " x   y"

do t = 1 to 50

x = 2*t - 1

if 0 < (x//5) then do

 p = 11

y = p mod x

do while y <> 0

p = p*10+1

y = p // x

end /* while */

y = p / x

if length(y) < 70 then

say format(x,3) format(y,70)

else do

say format(x,3) substr(y,1,70)

say format(substr(y,71,length(y)-70),80)

end

end

end /* pour */

/* xmp14 : gestion de répertoire*/

/* # 1.1 on génére la liste des fichiers avec redirection */

/*           de la sortie dans le fichier fn */

fn = 'dir.dir' 'ls -l > ' fn

/* # 1.2 on initialise les tableaux dynamiques    */

/*           et le nombre de fichiers vus, d'extensions distinctes */

compte. = 0 ; nom. = 0 ; taille. = 0 ; nbfic = 0 ; nbext = 0 ; /* # 2. on passe en revue le fichier obtenu */

do lines(fn)

ligne = linein(fn)

/* # 2.1 une ligne valide est non vide, contient /             */

/*           (dans la date) et ne contient pas de .    */

/*           en premier mot, contrairement aux sous-répertoires */

if ligne <> "" then do

parse var ligne pass lnk user grp kO mois jou heure fid . parse var fid with nom "." ext

/* # 2.2 le . dans parse permet d'ignorer */

/*           le reste de la ligne          */

if substr(pass,1,1) = "-" then do

if ext ="" then do ext = '???'

end /* if words(ligne) = 4 then */

/* # 2.3 on utilise l'indexation dynamique */

if compte.ext = 0

then do /* nouvelle extension */

compte.ext = 1 ; nbext = nbext + 1

nom.nbext = ext             ; taille.ext = taille.ext + kO

end /* nouvelle extension */

else do /* ancienne extension */

/* utilisation de la "mémoire associative" */

compte.ext = compte.ext + 1

taille.ext = taille.ext + kO

end /* ancienne extension */

/* et on compte un fichier en plus */ nbfic = nbfic + 1

end /* if if pos("/",ligne) > 0 & pos(".",nom) = 0 */

end /* if ligne <> then */ end /* do while lines(fn) */

/* # 3. après la parcours, affichage */

if nbfic = 0 then say "Pas de fichiers (peut-etre)" ; else do

fvc = " fichiers vus dans la directory "

exd = " extensions différentes "

bl = copies(" ",3)

say nbfic fvc "avec" nbext exd

say

call charout , " extension             nombre               taille kO 3 "

say " extension nombre              taille en kO "

nbl = 1 ; do i = 1 to nbext

/* on écrit une ligne sur 2 */

ext = nom.i ; nb = compte.ext ; taillekO = trunc(taille.ext/1000)

if ext = '???' then ext = '(vide)'

call charout , bl left(ext,6) bl format(nb,3) format(taillekO,12)

bl

if nbl = 1 then call charout , "3"

nbl = nbl + 1 ; if nbl = 3 then do ; say ; nbl = 1 ; end

end /* do i = 1 to nbext */ ; say

end

/* xmp15 trouvez donc à quoi sert ce programme...*/

/* Program to read from the keyboard and interpret REXX instructions */

If arg(1, 'e') then do interpret arg(1) exit

End

Say 'REXX interpreter running...type EXIT to terminate' Say

start:

Signal On error Signal On syntax Signal On failure Signal On halt

call charout ,"> " parse linein @[email protected] interpret @[email protected]

End

Error:

Say 'REXX:- Application returned an errorlevel' rc signal start

Syntax:

Say 'REXX:- Error' rc':' errortext(rc) signal start

Failure:

If rc = -3 then

Say 'REXX:- Program not found'

Else if rc = -8 then

Say 'REXX:- Insufficient memory for program'

Else

Say 'REXX:- Return code' rc

Signal start

Halt:

Say 'REXX:- CTRL-BREAK intercepted' Signal start

/* xmp16 trouvez donc à quoi sert ce programme...*/

/* C:\I\HEXA.REX            Gilles HUNAULT



Angers, le 17

Aout 89

12:02 */

/* affiche l'argument et son équivalent en HEXA */

arg phraz

if phraz = "" then do say "Syntaxe : xmp16 " exit

end

do i = 1 to length(phraz)

cc = substr(phraz,i,1)

call charout , ' '||cc end

say

do i = 1 to length(phraz)

cc = substr(phraz,i,1)

call charout , c2x(cc) end

/* xmp17 trouvez donc à quoi sert ce programme...*/

/* affiche tous les fichiers depuis le début du mois */ arg specif

if specif =" then specif = '*.*'

/* specif contient *.* ou *.BAT par exemple */

/* on récupère le numéro du mois en cours */ auj = date(E)

parse var auj jour '/' nmois '/' an

/* on commence au jour numéro 1 d'où : */ jour = 01

olddate = nmois'/'jour'/'an

/* on lance LISTFILE avec les bons arguments */

say copies(' ',20) 'Fichiers depuis le début du mois '

say

"listfile specif '(' SINCE olddate TREE SORTA N E SORTD D"

/* éventuellement on prévient l'utilisateur qu'il n'y a aucun fichier correspondant aux spécifications depuis le début du mois en cours */

if rc <> 0 then do

"clear"

say ' Désolé, pas de fichier correspondant à ' specif

say ' depuis le début du mois '

end /* le code retour est non nul */

/* xmp18 trouvez donc à quoi sert ce programme...*/

/*           19éme décimale) de puissance 10

- 19éme décimale) de puissance -10 réponse (1)

*/

Say " [42;36;1mUn peu de patience... [0;0m"

numeric digits 1000

pi = 3.1415926535897932384626433832 n = 10

/*

numeric digits 10

pi = 31 n = 2

*/

a = pi

do i = 1 to n a = a* pi

b = 1/a

c = substr(a,19,1)

d = substr(b,19,1)

say         "pi          :              "              pi

say         "^10      (20 dec:               "              substr(a,1,20)

say         "1/         (20 dec:               "              substr(b,1,20)

say         "dec      19           ^10        :              "              c

say         "dec      19           1/           :              "              d

say         "diff       :              "              c-d

/*           19éme décimale) de puissance 10

- 19éme décimale) de puissance -10 réponse (1)

*/

Say " [42;36;1mUn peu de patience... [0;0m"

numeric digits 1000

pi = 3.1415926535897932384626433832 n = 10

/*

numeric digits 10

pi = 31 n = 2

*/

a = pi

do i = 1 to n a = a* pi end

b = 1/a

c = substr(a,19,1)

d = substr(b,19,1)

say         "pi          :              "              pi

say         "^10      (20 dec:               "              substr(a,1,20)

say         "1/         (20 dec:               "              substr(b,1,20)

say         "dec      19           ^10        :              "              c

say         "dec      19           1/           :              "              d

say         "diff       :              "              c-d

/* xmp19 trouvez donc à quoi sert ce programme...*/

/* numeric digits 800 */

'cls'

call charout, " Donner N " pull n

say " sa racine est " sqr(n) exit

/*****************************************/

sqr: procedure

arg nb rac = 1

do while rac*rac <= nb rac = rac + 1 end

say "      --> encadrement entier : " rac-1 " et " rac

return rac-1



108