Exemples pour le langage REXX
/* 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 " <-- boucle POUR aménagée "
j = 11
do while (j < 25)
call charout , j " "
j = j + 3
if j > 20 then leave
call charout , j
end
say " <-- boucle tant que "
j = 11
do until (j >20)
call charout , j " "
j = j + 3
end
say " <-- boucle until "
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. Ca 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 ³ "
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 , "³"
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
Do Forever
call charout ,"> "
parse linein @_@
interpret @_@
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
say "salut..."
/* 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
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
/* 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