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, c’est justement l’utilisation de cette ponctuation, pourtant fort simple lorsqu'on l'a comprise. Voyons donc comment tout çà se passe…

Types de symboles

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 d’un 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 n’est 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 qu’une 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) d’un symbole, c’est l’emploi 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 à l’intérieur d’une procédure demeurent locaux à celle-ci, afin de ne pas utiliser inutilement l’espace mémoire réservé au stockage des symboles, et de minimiser les risques de conflits.

Apostrophes et substitution de caractères

L’emploi des apostrophes sert à remplacer une partie d’une commande par le contenu d’un symbole.

Ex. $ OPTION := /SIZE=ALL
$ DIRECTORY ‘OPTION’

à Traduit par: $ DIRECTORY /SIZE=ALL

L’évaluation du symbole est faite par l’interpréteur DCL avant d’exécuter la commande. C’est-à-dire, dans l’exemple précédent, que la commande est d’abord 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 d’erreur à l’exé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 (""). L’utilisation de l’apostrophe est le seul cas où l’on 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 qu’est la génération de commandes au moment de l’exécution permet de simplifier de beaucoup votre code dans certains cas. Un exemple typique est celui d’une 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 d’un symbole une partie d’un texte entre guillemets, placez deux apostrophes (") devant le symbole . Une apostrophe simple ne sera pas interprétée.

Ex. $ LANGAGE = "DCL"
$ WRITE SYS$OUTPUT "J’aime le "LANGAGE’."
$ WRITE SYS$OUTPUT "J’aime le ‘LANGAGE’."
 
à Traduit par: $ WRITE SYS$OUTPUT "J’aime le DCL."
à Traduit par: $ WRITE SYS$OUTPUT "J’aime 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 qu’ils n’entreront pas en conflit avec d’autres 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 n’est 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.

                        
La perluète

Une variante de l’apostrophe 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é d’accès"
$ READ /KEY="''KEY_VALUE’" FICHIER ENREGISTREMENT
$
$ ! Méthode 2 - Utiliser la perluète
$ INQUIRE KEY_VALUE "Clé d’accès"
$ READ /KEY=&KEY_VALUE FICHIER ENREGISTREMENT

La perluète peut s’employer pour remplacer dans une commande une chaîne de caractères par la valeur d’un 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:

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