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

$ SAY := WRITE SYS$OUTPUT
$ SAY F$CVTIME()
14-APR-1999 19:32:21.78

! Date et heure courante
$ SAY F$CVTIME(,,"WEEKDAY")
Wednesday
! Jour de la semaine
$ SAY F$FILE_ATTRIBUTES("GASTON.DAT", "EOF")
42
! Dimension du fichier
$ X = F$EDIT(F$GETJPI(0,"USERNAME"), "TRIM")
$ SHOW SYMBOL X
X = "SYLTREM"
! Nom de l'utilisateur + enlever les espaces à droite
             

Formattage de données

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.