FONCTIONS LEXICALES
Les fonctions lexicales sont utilisées en DCL pour obtenir des valeurs provenant de l'environnement (nom de l'utilisateur, date et heure, etc) ainsi que pour faire des conversions et du formattage de données (alphanumérique à numérique, affichage des zéros non-significatifs d'un nombre, etc).
Ces fonctions portent toutes un nom débutant par "F$" (par exemple F$MODE) et sont toujours suivies de paramètres que l'on indique entre parenthèses. Une fonction lexicale peut être utilisée dans des commandes à n'importe quel endroit ou un symbole peut être spécifié et est régie par les mèmes règles syntaxiques (voir Symboles, apostrophes et guillemets) à l'exception suivante: elles ne peuvent recevoir une valeur. En effet, vous pouvez les considérer comme des symboles en ce qu'elles contiennent une valeur, mais vous ne pouvez changer celle-ci.
Comme les symboles, les fonctions lexicales peuvfent être de type numérique ou alphanumérique.
Obtention d'informations diverses
La fonction lexicale F$EDIT permet d'éliminer les espaces multiples
dans une chaîne de caractères (COMPRESS), les enlever tout à fait (COLLAPSE) ou encore
d'enlever ces espaces au début et la fin (TRIM). Il est aussi possible de transformer
toute la chaîne de caractères en majuscules (UPCASE). Il suffit de passer en paramètre
la chaîne de caractère et les fonctions à effectuer. D'autres fonctions sont aussi
disponibles.
$ SAY F$EDIT(" Il y a des
espaces entre les
mots, au début et à la fin
", "trim,upcase,compress")
IL Y A DES ESPACES ENTRE LES MOTS, AU DÉBUT ET À LA FIN
F$FAO est utilisée pour formatter des nombres et des chaînes de caractères. On utilise des codes pour spécifier le formattage des données. On peut faire des choses simples comme:
$ SAY F$FAO("!5AS/!4UL/!4ZL",
"abcdefghij", 123, 456) abcde/123/0456 |
! 5 positions alphanumériques, 4 positions
numériques ! justifiées à droite, 4 positions numériques avec zéros ! non-significatifs. On met une barre oblique entre ! chaque valeur. |
Voici un petit exemple de ce que l'on peut arriver à faire:
$ FORMAT = "Il!0UL!%S !-!0UL!1%Cest!%Esont!%F
!-!UL enfant!-!0UL!%S gourmand!-!0UL!%S"
$ ENFANTS = 1
$ SAY F$FAO(FORMAT, ENFANTS)
Il est 1 enfant gourmand
$ SAY F$FAO(FORMAT, 4)
Ils sont 4 enfants gourmands
Boucles de traitement
Certaines fonctions lexicales se prêtent particulièrement bien à des traitements en boucle.Vous pouvez effectuer des opérations sur les éléments d'une liste, qui vous sont retournés un par un par les fonctions ci-dessous. En règle générale on a atteint la fin de la liste lorsque la valeur de l'item retourné est nulle (""). La seule exception à cette règle est F$ELEMENT() qui retourne le séparateur de liste.
Voici donc la liste de ces fonctions:
F$DEVICE() | Pour obtenir un à un les noms des disques, dérouleurs de bandes, etc installés sur votre ordinateur. Obtenez ensuite de l'information supplémentaire avec F$GETDVI() |
F$SEARCH() | Chaque itération retourne un nom de fichier. En paramètre vous devez donner un nom de fichier avec possiblement des caractères frimés (wildcards). |
F$PID() | Pour obtenir le PID de chaque processus. On peut définir des critères de sélection avec F$CONTEXT() et obtenir de l'information supplémentaire sur un processus avec F$GETJPI(). |
F$ELEMENT() | Est utilisé pour le traitement d'une liste d'items énumérés dans une chaîne de caractères dans laquele chaque élément est séparé par un caractère quelconque. Voir l'exemple qui suit. |
F$GETQUI() | Retournera de l'information sur les queues d'impression et/ou les queues
d'exécution. Celle-ci est un peu plus complexe à utiliser parce qu'elle comporte plus
d'un niveau de bouclage: 1) Queues (Nom de la queue et attributs) 2) Entrées (Entry number / Job name et attributs) 3) Fichiers (Fichiers à imprimer / à exécuter dans ce job) |
Exemple d'utilisation de f$element() et f$device():
$ LETTERS =
"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"
$ CPT = 0
$ LOOP:
$ TAPE = F$DEVICE("*", "TAPE")
$ IF TAPE .EQS. "" THEN GOTO END
$ DEFINE/NOLOG TAPE_'F$ELEMENT(CPT, "-", LETTERS) 'TAPE
$ CPT = CPT + 1
$ GOTO LOOP
$ END:
$ SHOW LOGICAL TAPE_%
$ EXIT
$ @EXEMPLE TAPE_A = "$1$MKA400:" TAPE_B = "$1$MKA500:" |
Autres fonctions, autres exemples
La fonction F$PARSE permet d'extraire ou de combiner des parties d'une spécification de fichier:
Extraction du nom de répertoire:
$ SAY F$PARSE("DUPUIS$DISQUE:[GASTON]PRUNELLE.LIS", , ,
"DIRECTORY")
[GASTON]
Combinaison d'éléments de spécification de fichier. Cela peut être pratique pour
attribuer une valeur par défaut aux éléments manquants d'une nom de fichier entré par
un utilisateur dans un menu, par exemple.
$ SET DEFAULT DUPUIS$DISQUE:[SPIROU]
$ USER_ENTRY := PRUNELLE.LIS
$ DEFAULT_VALUE := [GASTON];32
$ SAY F$PARSE(USER_ENTRY, DEFAULT_VALUE, , "SYNTAX_ONLY")
DUPUIS$DISQUE:[GASTON]PRUNELLE.LIS;32
Utilisez la fonction lexicale F$MODE()
dans une procédure pour déterminer si le mode d'exécution est en lot, interactif,
réseau ou autre.
Par exemple dans votre procédure LOGIN.COM vous faites peut-être SET TERMINAL /INQUIRE
pour régler vos paramètres d'affichage pour le terminal sur lequel vous venez de vous
brancher. Cependant cette commande n'est pas valide lorsqu'elle n'est pas exécutée en
mode interactif. Pour pour solutionner ce problème, faites plutôt:
$ IF F$MODE() .EQS. "INTERACTIVE" THEN SET
TERMINAL /INQUIRE
Employez F$STRING() et F$INTEGER() pour convertir des types de données de numérique à alphanumérique et inversement
Pour connaître la valeur d'un nom logique utilisez F$TRNLNM().
F$EXTRACT() sert à extraire un section d'une chaîne de caractères, et F$LOCATE() à déterminer si une chaîne de caractère contient une séquence de caractères donnée.
N'oubliez pas!
Les symboles et les fonctions lexicales s'emploient de la même façon. De même pour
les valeurs littérales et les expressions. Si l'on peut utiliser une chaîne de
caractère dans la commande, elle peut être:
a) un littéral (chaîne de caractère entre guillemets)
b) un symbole
c) une fonction lexicale qui retourne une valeur alphanumérique
d) une expression ayant une valeur alphanumérique
Et la même chose s'applique pour les valeurs numériques.
Ex.: | $ SAY F$FAO("!4ZL", 22) 0022 |
! Les deux paramètre sont des littéraux |
$ A = "!4ZL" $ B = 22 $ SAY F$FAO(A, B) 0022 |
! Les deux paramètres sont des symboles | |
$ B = 2 $ SAY F$FAO("!" + F$STRING(B*B) + "ZL", 11*B) 0022 |
! Les paramètres sont tous les deux des expressions |
Plusieurs autres fonctions sont disponibles. Voyez la documentation ou l'aide en ligne (sous la rubrique LEXICALS) pour en obtenir la liste et la façon de les utiliser. Il y a une foule de choses que vous pouvez faire avec les fonctions lexicales et elles vous aideront grandement dans toute procédure DCL, si simple soit-elle.