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 - Instruction PARSE (première partie)
(Article écrit par François Gueugnon et extrait d'Amiga News Tech - juillet 1991)
|
|
L'instruction PARSE que nous avions entrevue précédemment, mérite une
analyse fouillée parce qu'elle est d'une part constamment utilisée et joue un rôle important dans l'acquisition et
le traitement des chaînes de caractères (seuls objets connus d'ARexx) et parce que, d'autre part, elle présente
des possibilités optionnelles nombreuses et variées.
L'instruction PARSE fournit un mécanisme pour extraire une ou plusieurs sous-chaînes d'une
chaîne source et pour les assigner à des variables qui pourront être utilisées par la suite
au gré du programmeur. L'instruction PARSE est composée de trois parties distinctes et indépendantes
et peut de façon formelle s'écrire :
Le mot réservé "PARSE", écrit en majuscules, identifie l'opération. La partie "source"
détermine l'origine de la chaîne de caractères qui va être traitée. La source peut être décrite
par des mots réservés différents (ARG, EXTERNAL, NUMERIC, PULL, SOURCE, VAR, et VERSION).
Nous allons y revenir. La troisième partie 'traitement' décrit la façon dont la chaîne de
caractères acquise depuis la source va être traitée. Il n'y a pas ici de mots réservés mais
un formalisme descriptif utilisant des règles que nous préciserons plus loin.
Un mot réservé optionnel peut être placé tout juste après le mot PARSE. Il s'agit du mot
réservé UPPER, qui transforme la chaîne acquise en majuscules avant le traitement.
Enfin, parce que cette instruction est fréquemment utilisée, il en existe des formes abrégées :
PULL pour PARSE UPPER PULL et ARG pour PARSE UPPER ARG. Ces formes sont synonymes,
comme l'étaient ECHO et SAY décrites précédemment. Cela simplifie indéniablement l'écriture
mais complique la lecture, d'autant plus qu'une fonction ARG() existe aussi. C'est pourquoi
nous restons très réservés quant à l'emploi de ces abréviations.
Analyse des options source
ARG
Mis pour "argument", c'est l'un des moyens de passer des paramètres à un programme au moment
de son invocation depuis la console. Imaginons par exemple que nous disposions d'un programme
ARexx qui compte les lettres des mots qu'on lui fournit et dont le nom est "CompteLettres".
L'invocation à partir de la console CLI/Shell sera :
Où "mot" est le mot dont on veut compter les lettres. Les premières lignes du programme
CompteLettres seront donc obligatoirement pour l'option ARG :
/* titre */ ; c'est le début d'un programme ARexx
PARSE UPPER ARG 'traitement'
|
Ou en abrégé :
Il est tout à fait possible de passer ainsi plusieurs paramètres au programme. L'invocation s'écrit
alors :
RX CompteLettres mot_1 mot_2... mot_n
|
On peut ainsi fournir jusqu'à 15 paramètres différents. Il appartiendra à la partie 'traitement'
du programme invoqué, de trier les mots. Pour l'instant, il suffit d'écrire les mots
avec un espace entre eux et de ne taper la touche "Entrée" qu'à la fin. L'espace est un
délimiteur, l'Entrée en est un autre. Cette forme est dite implicite, il en existe
d'autres que nous indiquerons au passage.
PULL
Le fonctionnement de l'option PULL dépend du type de console utilisée. S'il s'agit d'une console de type CLI
ou Shell, le fonctionnement est limité. S'il s'agit d'une console de type WShell ou ConMan, le fonctionnement
est normal. La différence entre les deux types de consoles est la capacité pour WShell et ConMan de gérer
une pile.
1. Fonctionnement simplifié avec CLI/Shell : cette instruction permet d'acquérir une chaîne de caractères,
mais cette fois, on peut choisir le moment de l'introduction de la chaîne. L'invocation se fera de façon plus simple :
RX CompteLettres. Le programme invoqué se déroule et au moment où la chaîne d'entrée est nécessaire, on trouve une
forme semblable à celle-ci :
SAY "Tapez deux mots séparés par un espace" ; lit l'opérateur
PARSE UPPER PULL 'traitement' ; ou
PULL 'traitement' ; forme abrégée
|
...et le programme attend une entrée suivie d'un retour charriot. Là encore, c'est la partie 'traitement' qui triera
la chaîne acquise.
2. Fonctionnement normal avec console WShell/ConMan : ces consoles incorporent un raffinement supplémentaire
sous forme d'une pile. Une pile est une forme de mémoire atypée dans laquelle on peut mettre à peu près ce que l'on
veut. On peut imaginer cette mémoire sous forme d'un tuyau dont une extrémité est dédiée à la sortie par construction.
Il existe deux façons d'empiler quelque chose dans ce tuyau. La première consiste à empiler par l'extrémité libre,
si bien que par la sortie on verra arriver les éléments mémorisés dans l'ordre de mémorisation (en anglais First
In First Out - premier entré premier sorti). Cette opération d'empilage est réalisée par une commande ARexx QUEUE.
La deuxième façon consiste à pousser la pile vers le haut en mémorisant un élément par l'extrémité sortie. Dans ce
cas, il s'agit d'une pile Last In First Out/dernier entré premier sorti. La commande ARexx qui réalise cette fonction
est PUSH (ces deux commandes ne sont efficaces que s'il y a possibilité de pile dans la console).
Pour extraire quelque chose de la pile, il n'y a qu'un chemin : l'extrémité sortie. L'instruction ARexx qui permet
d'extraire un élément de la pile est PULL. L'élément extrait est ôté de la pile et celle-ci descend d'un cran. Les
deux modes de chargement sont simultanément possibles, et la responsabilité de la gestion incombe au programmeur.
Le fonctionnement de l'instruction PARSE UPPER PULL 'traitement' devient alors plus clair. Si la console ne gère pas de
pile, le programme attend une entrée clavier suivie d'un retour. Si la console gère une pile et que celle-ci contient
quelque chose, il y a extraction réelle de la pile.
Deux cas peuvent encore se présenter. Que se passe-t-il à la suite d'un appel par PULL si la pile est vide ? La réponse
est la même que pour une console sans pile, le programme attend une entrée clavier suivie d'un retour. Que se passe-t-il
si, à la fin du programme, il reste encore quelque chose dans la pile ? La réponse doit être circonstanciée. Cela dépend
en effet de qui reprend la main. Mais dans tous les cas, ce qui se présente à la sortie de la pile sera interprété, selon
les règles de ce qui prendra la main. Exemple : le programme ARexx se termine et il y a retour à la console. Imaginons qu'il
restait la chaîne "dir DH0:" dans la pile. A la fin de l'exécution du programme ARexx, dès le retour à la console, il y
aura exécution de l'instruction AmigaDOS "DIR DH0:". Pour généraliser, si ce qui reste dans la pile n'a pas de sens pour
celui qui prend la main, il y a dans le meilleur des cas, apparition d'un message d'erreur, ou, dans le pire des cas, du Guru.
On peut commencer à envisager l'intérêt d'une console à pile pour échanger des commandes et des paramètres entre des programmes
de nature différente.
EXTERNAL
Cette option ne fonctionne pas comme décrit dans le manuel. Elle a fait l'objet d'une rectification dans la version 1.15.
Cette option attend systématiquement une entrée au clavier, non pas à partir de la console courante (qui gère les deux flux
standard stdin et stdout) mais à partir du flux stderr de la console d'erreur, ouverte par appel de la commande TCO
(Tracing Console Open), placée dans le répertoire C:. TCO ouvre une fenêtre spéciale dans laquelle s'inscrit la trace de
l'exécution du programme en cours et qui peut recevoir des entrées clavier. A partir de cette fenêtre, le fonctionnement
de EXTERNAL est identique à celui de PULL, mais l'information ne provient pas de la pile. Ceci est fait pour éviter de
perturber la pile qui a le statut de "Public" et peut donc servir à d'autres programmes. La fermeture de la fenêtre s'effectue
par la commande TCC (Tracing Console Close), elle aussi placée dans C:. La fermeture peut toutefois ne pas être immédiate,
à cause du double emploi de cette fenêtre.
VAR
Mise pour "variable", cette option ne "regarde" plus vers l'extérieur mais fournit à une variable interne du programme,
le moyen d'être traitée de la même façon par la partie 'traitement' de l'instruction PARSE. Par exemple, si :
MaVariable='chaîne de plusieurs groupes de caractères'
|
...l' instruction :
PARSE VAR MaVariable 'traitement'
|
...effectuera le traitement décrit sur MaVariable. Là encore et comme partout ailleurs, le mot UPPER peut être placé,
s'il y a besoin. juste derrière PARSE.
Il reste maintenant à voir les formes dédiées de l'instruction PARSE. Ces formes sont dites dédiées parce qu'elles
fournissent une information identifiée à priori sur l'environnement.
NUMERIC
Cette option fournit une information en rapport avec les précisions numériques et les formats des nombres en usage.
Elle fournit une chaîne de trois mots :
- DIGITS, qui contient le nombre de chiffres de la précision des calculs.
- FUZZ, qui contient le nombre de chiffres à ignorer lors des opérations de comparaison numérique.
- FORM, qui contient soit SCIENTIFIC soit ENGINEERING. Dans le premier cas, les nombres sont présentés en
notation exponentielle, ajustée de façon à ce que la partie non nulle de la mantisse soit comprise entre 0 et 1.
Dans le deuxième cas, la forme est aussi exponentielle mais l'exposant varie de trois en trois (par mille) et
la mantisse (si non nulle) est comprise entre 0 et 1000. Ces choix peuvent être effectués par ailleurs pour chaque
opération réalisée dans le programme, au moyen de l'instruction NUMERIC (autre que l'option PARSE ici décrite)
et de ses paramètres.
SOURCE
Cette option retourne une chaîne qui contient six mots :
- COMMAND ou FONCTION indique si le programme a été invoqué comme une commande ou une fonction.
Une des différences est que la commande retourne un code spécifique nommé RC (pour Return Code), et qui a pour valeur
1 ou 0, selon la réussite d'exécution de la commande (0 pour réussi 1 pour échec), alors que la fonction peut
retourner une valeur ou une chaîne.
- INDICATEUR BOOLÉEN 0/1 indique que le demandeur attend une chaîne de caractères en retour ou non.
- CALLED indique le nom qui a été utilisé pour invoquer le programme.
- RESOLVED indique le nom qui a été utilisé en fin lors de l'appel réel.
- EXT est l'extension du nom du fichier qui a été utilisée pour la recherche. La valeur par défaut est REXX,
c'est pourquoi un programme intitulé "MonProgramme.REXX" peut être invoqué par "MonProgramme" tout simplement.
- HOST indique l'adresse REXX de l'hôte qui a envoyé la commande.
VERSION
Cette option retourne une chaîne contenant six mots :
- AREXX.
- VERSION contient la version de l'interpréteur courant. Ici par exemple, 1.15.
- CPU indique un microprocesseur 68000/10/20/30 selon le cas.
- MPU contient NONE ou 68881, ce qui indique l'éventuelle présence du coprocesseur arithmétique.
- VIDEO contient le standard vidéo courant, soit PAL pour les versions européennes ou NTSC pour les autres.
- FREQ contient la fréquence du réseau : 50 Hz ou 60 Hz.
A retenir
- Selon que l'on utilise une console avec pile ou sans, certaines options de l'instruction PARSE fonctionnent différemment.
- Les options SOURCE et les modes 'traitement' sont indépendants et pourront être combinés.
- Dans les options SOURCE, il y a des options anonymes qui peuvent être utilisées selon le gré du programmeur
et des options dédiées qui fournissent des renseignements sur l'environnement.
- Les options SOURCE permettent de dialoguer avec l'intérieur du programme (VAR) ou avec l'extérieur de type
ARexx (ARG) ou non (PULL).
Nous avons maintenant passé en revue toutes les options SOURCE de l'instruction PARSE. Nous analyserons
prochainement la partie 'traitement'.
|