SYMBOLES, APOSTROPHES ET GUILLEMETS
Dans le dialecte DCL, les symboles, ce sont des variables.
Leur utilisation est la même que dans la plupart des langages, mais ils peuvent
également être utilisées comme valeur de substitution à l'intérieur de commandes, par
l'utilisation d'une ponctuation spéciale. Ce qui semble le plus obscur chez tous les
"nouveaux" en DCL, cest justement lutilisation de cette ponctuation,
pourtant fort simple lorsqu'on l'a comprise. Voyons donc comment tout çà se passe
Les symboles DCL peuvent être de deux types: chaîne de caractères ou entiers numériques. Un symbole n'a pas a être déclaré avant d'être utilisé; il est créé la première fois qu'on lui assigne une valeur dans une procédure, et son type dépend de cette valeur.
Le type d'un symbole peut changer au cours de l'exécution
d'une procédure. Les instructions suivantes ne causeront aucun problème.
$ SYMBOLE = 1
$ SYMBOLE = "A"
$ SYMBOLE = "A" + 1
À l'exécution de la dernière commande, SYMBOLE vaudra 1. Le résultat est numérique.Ce n'est certainement pas quelque chose de logique, mais il n'y aura pas d'erreur déclarée par DCL.
Assigner une valeur à un symbole
Pour assigner une valeur à un symbole, il y a deux méthodes, qui donnent évidemment des résultats différents. La première utilise le symbole égal (=), la seconde utilise le deux-points devant le symbole égal (:=).
Le (=) sert à assigner une chaîne de caractères, le contenu dun symbole ou le résultat d'une expression à un symbole. En fait, ce qui est à droite du symbole est évalué avant dêtre placé dans le symbole. Les chaînes de caractères doivent être délimitées par des guillemets.
Ex. | SYMBOLE1 = "Texte quelconque" SYMBOLE2 = SYMBOLE1 SYMBOLE3 = 28 * 2 SYMBOLE4 = SYMBOLE1 "Texte" |
à "Texte
quelconque" à "Texte quelconque" à 56 à "quelconque" |
Le (:=) sert à assigner une chaîne de caractères. Aucune évaluation de la valeur à assigner nest faite. Cependant, les espaces multiples sont remplacés par un seul espace et les lettres minuscules sont mises en majuscules.
Ex. | SYMBOLE1 := Texte quelconque SYMBOLE2 := SYMBOLE1 SYMBOLE3 := 28 * 2 SYMBOLE4 := SYMBOLE1 "Texte" |
à "TEXTE QUELCONQUE" à "SYMBOLE1" à "28 * 2" à SYMBOLE1 - Texte |
Symboles locaux vs symboles globaux
Dans une procédure, vous pouvez utiliser des symboles locaux et des symboles globaux.
Les symboles locaux ne sont accessibles que par la procédure qui les crée, ainsi que par celles appelées par cette dernière. Au sortir de la procédure, ces symboles sont détruits. Les symboles globaux, quant à eux, sont accessibles par tous les niveaux de procédures. Même après quune procédure qui a créé des symboles globaux soit terminée, ces derniers restent disponibles à la procédure appelante et à toutes celles qui seront appelées par la suite.
Ce qui fixe le champ (scope) dun symbole, cest lemploi du simple ou double égal (= ou ==, := ou :==) lors de la création du symbole. Le double égal indique que le symbole sera global.
Il est recommandé que les symboles qui sont utilisés temporairement à
lintérieur dune procédure demeurent locaux à celle-ci, afin de ne pas
utiliser inutilement lespace mémoire réservé au stockage des symboles, et de
minimiser les risques de conflits.
Apostrophes et substitution de caractères
Lemploi des apostrophes sert à remplacer une partie dune commande par le contenu dun symbole.
Ex. | $ OPTION := /SIZE=ALL $ DIRECTORY OPTION |
à Traduit par: $ DIRECTORY /SIZE=ALL |
Lévaluation du symbole est faite par linterpréteur DCL avant dexécuter la commande. Cest-à-dire, dans lexemple précédent, que la commande est dabord construite à partir de la valeur du symbole OPTION puis est ensuite exécutée. La commande sera donc différente chaque fois que le contenu de OPTION est modifié.
Notez que cette syntaxe ne causera pas derreur à lexécution même si le symbole OPTION n'a pas été défini. La valeur étant nulle, OPTION sera traduit par une chaîne vide (""). Lutilisation de lapostrophe est le seul cas où lon peut utiliser un symbole dans une commande sans que celui-ci soit obligatoirement existant, en autant que la commande générée reste valide, bien entendu.
Cette fonctionnalité de DCL quest la génération de commandes au moment de lexécution permet de simplifier de beaucoup votre code dans certains cas. Un exemple typique est celui dune menu présentant les options 1 à 10.
Ex. | $ MENU: $ INQUIRE CHOIX $ IF CHOIX .GT. 1 .AND. CHOIX .LE. 10 THEN GOTO CHOIX_CHOIX $ WRITE SYS$OUTPUT "Choix non valide" $ GOTO MENU $ $ CHOIX_1: $ $ ![]() $ $ GOTO MENU $ $ CHOIX_2: $ $ $ |
Pour remplacer par la valeur dun symbole une partie dun texte entre guillemets, placez deux apostrophes (") devant le symbole . Une apostrophe simple ne sera pas interprétée.
Ex. | $ LANGAGE = "DCL" $ WRITE SYS$OUTPUT "Jaime le "LANGAGE." $ WRITE SYS$OUTPUT "Jaime le LANGAGE." |
à Traduit par: $ WRITE SYS$OUTPUT "Jaime le DCL." à Traduit par: $ WRITE SYS$OUTPUT "Jaime le LANGAGE." |
Définition de symboles de commande
Vous pouvez définir des symboles pour effectuer des commandes que vous utilisez souvent. Ainsi, si vous désirez toujours avoir la date de création et la dimension du fichier avec la commande DIRECTORY, voir la liste de vos travaux en lot avec la commande JOBS, et ne pas avoir de message informatif lors de la définition de noms logiques, vous pouvez créer les symboles suivants:
Ex. | $ DIR*ECTORY := DIRECTORY/DATE/SIZE $ JOBS := SHOW ENTRY/BATCH $ DEFINE := DEFINE/NOLOG |
Un astérisque signifie que vous pouvez abréger la commande en entrant au minimum les caractères à gauche de celui-ci. Dans l'exemple ci-haut, la redéfinition de la commande DIRECTORY fonctionnera si vous tapez au moins les 3 premières lettres, tandis que la redéfinition pour DEFINE fonctionnera uniquement si vous tapez le mot en entier.
Lorsque vous créez des symboles, assurez-vous toujours quils nentreront pas en conflit avec dautres commandes existantes. Un symbole tel que DEF := SET DEFAULT pourrait causer des problèmes puisque la commande DEFINE peut être abrégée par DEF.
Ex. | $ DEF := SET DEFAULT $ DEF ABC ABC.DAT %DCL-W-MAXPARM, too many parameters - reenter command with fewer parameters \ABC\ |
La commande a été traduite par :SET DEFAULT ABC ABC.DAT, ce qui nest pas une commande valide. En fait, ce que l'utilisateur tentait de faire, c'était DEFINE ABC ABC.DAT mais le symbole DEF ne lui permettait plus d'abréger DEFINE par DEF. Dans un cas comme celui-ci il lui aurait fallu utiliser DEFI à tout le moins, ou alors utiliser un autre symbole pour la commande SET DEFAULT.
Une variante de lapostrophe est la perluète (&).
Certaines commande requièrent une chaîne de caractères comme paramètre. Dans une procédure, cette dernière peut fort bien être contenue dans un symbole. Il existe alors 2 possibilités. La simple et la plus compliquée. A vous de choisir.
Ex. | $ ! Méthode 1 - Utiliser les guillemets et apostrophes $ INQUIRE KEY_VALUE "Clé daccès" $ READ /KEY="''KEY_VALUE" FICHIER ENREGISTREMENT $ $ ! Méthode 2 - Utiliser la perluète $ INQUIRE KEY_VALUE "Clé daccès" $ READ /KEY=&KEY_VALUE FICHIER ENREGISTREMENT |
La perluète peut semployer pour remplacer dans une commande une chaîne de
caractères par la valeur dun symbole. Vous pouvez l'utiliser partout ou il suit
immédiatement le caractère égal (=) comme dans l'exemple précédent. Cela évite de
sur-utiliser les apostrophes et rend votre code plus lisible.
Les règles d'or:
Dans le deuxième exemple ci-dessous, dans le cas où la 1ère position de SYMBOLE contiendrait un espace, la commande serait interprétée par $ IF .EQS. "9" si lapostrophe est utilisée et causerait une erreur de syntaxe lors de l'exécution. Si on retire lapostrophe, la commande reste syntaxiquement valide dans tous les cas.
Ex. | $ IF
""F$MODE()" .EQS. "BATCH" THEN... $ IF F$EXTRACT(0,1,SYMBOLE) .EQ. 9 $ SYMBOLE2 := SYMBOLE1 |
devrait sécrire à $ IF F$MODE() .EQS.
"BATCH" devrait sécrire à $ IF F$EXTRACT(0,1,SYMBOLE) .EQ. 9 devrait sécrire à $ SYMBOLE2 = SYMBOLE1 |