Depuis ses origines (Sur le S/38 apparu en 1979...), le langage CLP n'avait pas évolué.
Par langage CLP (Control Language
Program) j'entends les instructions de programmation, pas les commandes propres à l'OS.
Ainsi depuis plus d'un quart de siècle, les seules instructions à notre disposition étaient :
PGM/ENDPGM, DCL/DCLF, RETURN, GOTO, IF, DO/ENDDO, RCVF/SNDF/SNDRCVF, CHGVAR et MONMSG (je ne crois pas en avoir oublié)
Bien sûr quelques rares évolutions sont apparues au fil du temps, comme le %BIN, mais dans l'ensemble on peut dire que le CLP des origines était le même que celui de la V5R2.
On peut positiver en disant que ce n'est pas le nombre d'instructions/fonctions qui fait la force d'un langage et que de toute manière cela ne nous a pas empêché d'écrire des milliers de lignes de code toujours utilisées aujourd'hui.
D'ailleurs la tentative de remplacement par un langage beaucoup plus proche de nos HLL, j'ai nommé le REXX, n'a pas eut grand succès (il faut dire que REXX souffre d'un gros handicap : c'est un langage interprété, aux performances ne pouvant rivaliser avec le CLP)
Et puis le CLP est un langage de "contrôle", il n'a pas besoin d'être aussi puissant que ses grands frères.
Ces "excuses" nous permettent de contenir notre frustration, mais il n'empêche que le CLP est un langage bien frustre.
Or, voici qu'IBM, après tant d'années, nous apporte un lot dévolutions majeures. Réjouissons nous !

En effet de la V5R3 à la V6R1 (pardon, on doit dire 6.1) c'est un défilé d'innovations auquel nous assistons :
Note : A une exception près, ces nouveautés sont disponibles en CLP (OPM) et en CLLE (ILE) !
V5R3M0 :- DOUNTIL/ENDDO Boucle "Jusqu'à"
- DOWHILE/ENDDO Boucle Tant que"
- DOFOR/ENDDO Heu... boucle "Pour"
- ITERATE Passage à l'itération suivante d'une boucle
- LEAVE Sortie prématurée d'une boucle
- SELECT/WHEN/OTHERWISE/ENDSELECT Select, quoi ! pratique pour des écrans de style menus
- 5 Fichiers (DCLF) Ne rêvez pas, il ne peut y en avoir qu'un en Entrée/Sortie (écran) , les autres n'étant qu'en entrée. Toujours pas de PRTF

- Type de données *INT/*UINT Les entiers signés et non signés
V5R4M0 :Le festival contine !
- SUBR/ENDSUBR/CALLSUBR/RTNSUBR Les Subroutines

- Type de données *PTR, et zones basées les pointeurs. Je sais, faut aimer. Et j'aime

- Structures de données Les DS, Youppi !
V6R1M0 :Ça se calme, dommage, on y prenait goût

...
- INCLUDE = /COPY, pour les "gapistes". C'est bien avec les structures.
- CLOSE de fichier Ferme un fichier, le prochain RCVF le ré-ouvre au début
- DCLPRCOPT (CLLE). Stockage d'options de compilation, comme les spec H du RPG4
Il manque encore de nombreuses choses pour atteindre le Nirvana (Tableaux, fichiers en sortie, positionnement sur clé ...) mais ne faisons pas la fine bouche. Merci "M. IBM"

Espérons seulement qu'il ne faudra pas attendre encore un quart de siècle pour les prochaines évolutions ...

Un petit exemple (pas le meilleur, je sais, mais vous pouvez contribuer ) :
PGM
DCL VAR(&EOF) TYP(*LGL) VALUE(‘0’)
DCLF FILE(PCLIENT)
RCVF /* 1ère lecture */
MONMSG MSGID(CPF0864) EXEC(CHGVAR &EOF ‘1’)
DOWHILE (*NOT &EOF)
/* ici traitement de chaque enregistrement lu */
RCVF
MONMSG MSGID(CPF0864) EXEC(CHGVAR &EOF ‘1’)
ENDDO
ENDPGM