Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : ARexx - classes d'instruction, instructions, fonctions
(Article écrit par Cédric Beust et extrait d'Amiga News - février 1992)
|
|
Suite de notre incursion dans le langage ARexx de William Hawes. L'article précédent était destiné à des débutants
ignorant tout ou presque du langage. J'ai donc brièvement expliqué comment installer ARexx sur votre machine, comment
écrire et lancer les programmes et nous avons vu ensemble quelques instructions clés et certains aspects du langage.
Écrire des articles sur ARexx n'est pas chose aisée car la tentation est grande de se lancer immédiatement dans
les aspects complexes du langage qui en font sa spécificité et sa puissance. Cette difficulté est liée à l'aspect
hybride du langage : il est fait à la fois pour les débutants et pour les programmeurs confirmés.
Désolé si je suis quelque peu didactique ce mois-ci, mais j'ai pris la décision de passer en revue certaines
fonctions/instructions clés afin de vous donner une vue d'ensemble de ce qu'il est possible de faire en ARexx.
Le but de la manoeuvre n'est pas de vous faire apprendre par coeur toutes ces fonctions mais plutôt de faire
en sorte que lorsque vous serez confronté à un problème, vous vous souviendrez qu'il existe une fonction qui
fait exactement ce que vous recherchez. Il ne vous restera alors plus qu'à vous reporter à la documentation
pour en avoir l'explication exhaustive.
Description des classes d'instruction
On peut diviser le langage en trois classes distinctes, chaque instruction faisant partie d'une de ces trois
classes. William Hawes a donné une nomenclature précise pour ces classes, que je vais essayer de respecter
dans ce qui suit même si je fais parfois l'amalgame entre les termes instructions/commandes/fonctions.
Les instructions
Il s'agit des commandes faisant partie du noyau du langage. Elles seront toujours présentes, quel que soit
votre environnement et regroupent principalement les commandes de boucle (DO), de test (IF THEN ELSE),
de pilotage externe (ADDRESS), d'appel de procédures (CALL), etc. Elles sont au nombre d'une trentaine.
Les commandes
Nous retrouvons dans cette catégorie toutes les instructions qu'ARexx ne connaît pas et qui sont destinées à
une application externe. J'ai donné un exemple de telle commande dans l'article précédent en faisant changer
la taille des tabulations dans un QED via ARexx. Il n'est évidemment pas question de détailler les commandes
dans cet article puisque par définition, elles sont dépendantes de l'application à laquelle elles sont destinées.
Un programme comme Deluxe Paint ne comprendra pas les mêmes commandes que CygnusEd. Je vous renvoie à la
documentation ARexx de l'application que vous désirez piloter.
Les fonctions
Cette classe regroupe en fait toutes les commandes n'entrant pas dans les définitions précédentes, c'est-à-dire
toutes les fonctions que l'on trouve dans des bibliothèques externes qui sont livrées parfois avec ARexx
et parfois séparément. Ces bibliothèques se retrouvent sous la forme familière de ".library"
et se placent tout naturellement dans votre répertoire "Libs:".
Une bibliothèque joue un rôle particulier : il s'agit de la rexxsupport.library. Celle-ci est livrée avec ARexx
et on peut considérer qu'elle forme une prolongation des instructions mais avec tout l'interfaçage spécifiquement
Amiga, encore que cette dénomination soit encore trop vague. En fait, il s'agit essentiellement de l'aspect système
(multitâche, Exec) de l'Amiga, et non son aspect graphique (Intuition). On retrouve en vrac les fonctions de
conversions de types, gestions de bits, chaînes, fichiers, etc.
D'autres bibliothèques externes commencent à apparaître mais il en est une qui s'est désormais imposée comme
standard de fait. Il s'agit de la rexxarplib.library, de Willy Langeveld, l'auteur de VLT. Initialement conçue
de façon à pouvoir appeler des fonctions ARP à partir d'ARexx, cette bibliothèque s'est vite vu confier des
tâches bien plus générales comme la gestion des fenêtres, menus, gadgets, requêtes, etc.
On trouve donc ici le complémentaire de la rexxsupport.library puisqu'elle gère également un aspect spécifiquement Amiga
mais du côté graphique cette fois.
Ces deux bibliothèques sont indispensables pour tout développement qui se veut sérieux. Vous pouvez naturellement
vous passer de la rexxarplib pour programmer mais le résultat aura un aspect austère qui n'est plus de mise depuis
la sortie du système 2.0. Une parenthèse à ce sujet : si vous développez sous 2.0, il vous faut absolument rexxarplib.library
v3.0, les versions précédentes ayant fait preuve de gros bogues sous la nouvelle version du système. D'ailleurs, cette
version 3.0 est bien plus performante que la précédente et elle est disponible
ici.
Les instructions
Les instructions sont la connaissance minimale que vous devez retenir du langage. Sans elles, vous ne serez pas
capable d'écrire une ligne (un peu comme si vous ignoriez des instructions comme PRINT, IF, GOTO en BASIC,
encore que ce ne soit pas un très grosse perte pour cette dernière :-)). La lecture rapide de programmes ARexx
vous enseignera très rapidement la syntaxe du langage :
Tests conditionnels :
if reponse = 'o' then say "Oui"
|
Boucles :
do while i < 5i = i+1
do j = 2 to 10j = j * 2
do for 10 say "Dix fois la même phrase"
|
Aiguillage :
select when rep = 'o' call ouvreFenetre()
when rep = '?' call aide()
otherwise say "Erreur Recommencez"
end
|
Entrées/sorties :
Débogage :
trace all /* affichage de toutes les étapes */
trace results /* les résultats uniquement */
trace command /* les commandes uniquement */
|
Contrôle externe :
Analyse de chaîne :
parse date jour ':' mois ':' année
/* si date = '02:Jan:92' , cette instruction mettra */
/* dans la variable mois la valeur 02 */
|
...et quelques autres de moindre importance.
Les fonctions
Il y a beaucoup à dire là encore. Ce mois-ci, je me contenterai de faire un tour d'horizon
rapide de la rexxsupport.library. Mais avant d'en faire la description, comment se servir
d'une bibliothèque externe ? Il faut pour cela faire appel à la fonction addlib().
Prenez l'habitude, quand vous commencez à écrire un programme, de taper les deux lignes suivantes :
call addlib("rexxsupport.library",0,-30,0)
call addlib("rexxarplib.library",0,-30,0)
|
Cela vous donnera accès à toutes les fonctions de ces deux bibliothèques (qui doivent être présentes dans
"Libs:", je le rappelle). Ne prêtez pas attention aux trois paramètres derrière le nom, vous n'aurez
probablement jamais à en utiliser d'autres.
Commençons par les fonctions de conversion de bases en tout genre. Nous trouvons ainsi b2c, c2h
(binaire <-> caractère), c2d (caractère vers décimal), c2x (caractère vers hexa), etc.
Exemple : "say c2d('20'x)" retournera 32.
Puis les traitements de bits en tous genres : bittst, hitxor, bitand.
Les manipulations de chaînes sont un des points forts d'ARexx étant donné qu'il s'agit en fait
du seul type que le langage comprend. Vous pouvez donc effacer des sous-chaînes (delstr),
des mots (delword), faire des insertions (insert), repérer une sous-chaîne (index),
isoler des sous-chaînes (left, right), etc.
Gestion de fichiers :
open('fichier','S:startup-sequence','R') /* ouverture */
close('fichier') /* fermeture /*
if (eof('fichier')) /* test de fin de fichier */
ligne = readln('fichier') /* lecture d'une ligne */
car = readch('fichier') /* lecture d'un caractère */
seek('fichier',10,'E') /* positionnement à 10 car de la fin */
|
Examen du système : show.
V /* affiche le contenu du presse-papiers */
say show('files') /* affiche les fichiers ouverts */
say show('libraries') /* affiche les bibliothèques chargées */
say show('ports') /* affiche les ports */
|
Gestion de l'environnement : pragma.
Cette fonction a plusieurs effets selon l'argument avec lequel vous l'appelez.
- say pragma('directory') vous donnera le répertoire courant.
- call pragma('directory','dh0:') change le répertoire vers dh0:.
- say pragma('id') donne le numéro de la tâche en cours.
- say pragma('priority') donne (ou règle) la priorité de la tâche.
- say pragma('stack') retourne (ou règle) la taille de la pile.
- say pragma('w','null') annule toute requête qui pourrait apparaître.
Quelques mots à propos du presse-papiers (alias clipboard), évoqué en même temps que la fonction "show".
Il s'agit d'un mécanisme interne à ARexx qui permet de communiquer des données entre deux processus
externes. Bien sûr, il est toujours possible de les faire communiquer via des fichiers ou des
variables d'environnement (ce qui revient pratiquement au même), mais l'utilisation du presse-papiers
est plus judicieuse dans la plupart des cas, et de toute façon plus rapide.
Tout comme les variables d'environnement, le presse-papiers n'est rien de plus qu'un ensemble de paires
clé/valeur. Pour créer une paire, on procédera comme suit :
call setclip('hauteur',10)
|
...et pour obtenir la valeur correspondante :
say getclip('hauteur')
==> 10
|
Enfin, j'ai volontairement passé sous silence une autre bibliothèque externe. Il s'agit de
la rexxsyslib.library. La raison est qu'elle contient des fonctions très spécifiques à l'interprète
ARexx et l'utilisateur moyen n'aura que très rarement l'occasion d'y faire appel.
Notez qu'il n'est pas nécessaire d'utiliser addlib() pour pouvoir bénéficier des fonctions de cette
bibliothèque : elle est ajoutée automatiquement dès le lancement de l'interprète.
Conclusion
Je pense qu'à la fin de ce deuxième épisode, vous devez commencer à avoir une idée d'ensemble
assez précise sur ce qu'est ARexx. Désolé de ne pas avoir montré davantage de code mais
il a fallu faire un choix. Vous pouvez toujours vous reporter au listing "Events.rexx"
paru dans cet article qui utilise quelques-uns des principes
que j'ai exposés, et même certains dont je n'ai parlé (je fais allusion aux "Compound Statements",
les objets composés). Comme j'avais expliqué ces objets dans cet article, vous pouvez vous y référer
si vous désirez compléter votre connaissance du langage.
|