Variables et types de données
Article paru dans le magazine Login numéro 81
Reproduction interdite. Tous droits réservés à Posse Press et Olivier Auverlot
Après avoir découvert le maniement de la console et la structure d’un script Rebol, nous allons maintenant créer nos premiers mots. Programmer en Rebol, c’est enrichir un dictionnaire à partir de mots qui représentent des variables, des fonctions ou des objets. Nous allons aujourd’hui nous concentrer sur le premier type de mots : les variables.
Déclarer une variable
Créer un mot en Rebol est extrêmement simple. Il suffit de faire suivre le mot par le caractère ":" et d’indiquer ensuite sa valeur. Supposons que nous voulions déclarer un mot VAR représentant une variable et contenant la valeur 0, il nous suffit de saisir dans la console VAR : 0. Rebol étant un langage indifférent à la casse des caractères, nous aurions pu également utiliser Var, VaR, var… Si nous tapons ensuite le mot dans la console, nous obtenons la valeur 0 : Rebol a évalué le contenu du mot qui fait maintenant partie du dictionnaire dans son contexte global. Attention, si vous regardez le contenu du dictionnaire avec le mot WHAT que nous avons découvert le mois dernier, vous ne trouverez pas votre mot : WHAT n’affiche pas les variables ! Nous avons tout de même une méthode pour vérifier notre création, il suffit d’utiliser la commande HELP VAR. Celle ci vous confirme la création du mot et vous indique que le type de la variable est un entier (INTEGER). Rien ne vous choque ? Pourquoi Rebol déclare t-il notre variable comme entière alors que nous ne lui avons pas spécifié le type ? En fait, c’est l’évaluateur qui en l’absence de déclaration, sélectionne le type de données qui semble correspondre. Une autre notion peut et va d’ailleurs choquer de nombreux puristes : un mot n’a pas un type définitif, il a celui de son contenu et peut donc changer en cours d’exécution ! Cela signifie que notre variable peut très bien être entière au début d’un programme puis se transformer en une chaîne de caractères en plein milieu pour devenir ensuite un nombre réel : c’est vraiment dangereux mais tout à fait possible !
Comment connaître le type d’une variable ?
Si nous voulons en cours d’exécution interroger un mot afin de connaître le type de son contenu, nous disposons du mot TYPE?. Tapons dans notre console TYPE? VAR, nous obtenons INTEGER! Ce qui est parfaitement logique ! Essayons maintenant de changer le contenu de VAR en saisissant VAR : 0.82 et vérifions son type avec la même méthode : nous obtenons DECIMAL!. Notre mot a donc bien changé de type en fonction de son contenu qui est passé d’un nombre entier à un nombre à virgule flottante.

Rebol est capable de reconnaître un grand nombre de types de données
Utiliser les constructeurs
L’usage des constructeurs permet de spécifier le type de données affecté à un mot. Vous avez sans doute déjà compris que leur usage n’a rien d’obligatoire mais reste fortement conseillé afin de faciliter la lecture et la maintenance des scripts volumineux. Supposons que nous voulions définir notre mot VAR comme étant de type DATE, la syntaxe de la déclaration est VAR : MAKE DATE! 1/1/2000. Ne vous méprenez pas sur le sens de cette expression, le mot VAR est certes de type DATE! et est initialisé à la date du 1er janvier 2000 mais le type de son contenu pourra changer à tout moment de l’évaluation. L’usage le plus courrant des constructeurs consiste en la conversion de type. A titre d’exemple, VAR : MAKE INTEGER! 3.2 nous permettra d’extraire la partie entière d’un nombre : le mot VAR contiendra la valeur 3 de type INTEGER!.
Les types de données simples
Dans cette catégorie, nous allons retrouver les principaux types de données présents dans tout langage de programmation. Nous avons déjà rencontré INTEGER!, DECIMAL! et DATE!. Rebol dispose également des types TIME! pour l’heure, MONEY! pour les valeurs monétaires, LOGIC! pour les booléens (TRUE ou FALSE, ON ou OFF, YES ou NO), CHAR! pour les caractères et de NONE! qui indique qu’aucune valeur définie n’est présente. Les exemples suivants utilisent ces différents types :
ENTIER: MAKE INTEGER! 0
FLOTTANT: MAKE DECIMAL! 2.98
HEURE: MAKE TIME! 15:35:00
DATE: MAKE DATE! 1/1/2000
ARGENT: MAKE MONEY! $10
BOOLEEN: MAKE LOGIC! TRUE
CARACTERE: MAKE CHAR! #"A"
INDEFINI: MAKE NONE!
Les types de données complexes
Les types de données complexes sont des séries et sont créés à partir des types simples. Ce sont ces outils qui donnent toute sa puissance à Rebol en permettant au programmeur de manipuler aisément des blocs des données, des chemins d'accès aux fichiers, des URL ou des adresses de courrier électronique. Rebol est véritablement un langage adapté aux besoins quotidiens des développeurs d'applications clients/serveur. Il existe plus d'une quinzaine de types de données complexes, autant dire qu'il y a de fortes chances pour que vous y trouviez votre bonheur !
Les chaînes de caractères correspondent au type de données STRING!. Celles-ci sont contenues classiquement entre guillemets sauf lorsqu'elles contiennent des caractères de retour à la ligne, rendant alors obligatoire l'usage d'accolades. Cette gestion des caractères spéciaux sera fortement appréciée par les programmeurs WEB qui pourront ainsi insérer directement leur code HTML dans leurs scripts Rebol !
CODEHTML: {
<HTML>
<HEAD></HEAD>
<BODY>
Je suis une page HTML
</BODY>
</HTML>
}
Pour les données binaires, nous disposons de l'astucieux type BINARY! qui permet d'indiquer en quelle base nos données sont conservées. Supposons que nous voulions affecter au mot DATA un octet en base 2, la déclaration sera DATA: MAKE BINARY! 2#{01111111}, soit la valeur 127.
Les chemins d'accès aux fichiers sont représentés par le type FILE!. Ils présentent la particularité de devoir être précédés par le caractère "%". Si nous saisissons F: %fichier.txt dans la console, l'expression TYPE? F nous indiquera que F est de type FILE!. Nous pouvons également convertir une chaîne de caractères en un nom de fichier en utilisant un constructeur, la syntaxe sera F: MAKE FILE! "fichier.txt".
Pour l'univers d'Internet et des Intranet, c'est un véritable feu d'artifice. La déclaration d'une adresse électronique se résume à ADRESSE: MAKE EMAIL! Olivier@domaine.fr. Les chemins d'accès aux ressources du WEB sont quant à eux représentés par le type URL!. L'expression CHEMIN: MAKE URL! http://www.posse-press.fr/login permet d'affecter à CHEMIN l'adresse de la page d'accueil de notre bien aimé magazine LOGIN. Les bidouilleurs de TCP/IP apprécieront la présence des types TUPLE! et PORT! qui représentent respectivement une adresse IP telle que 173.30.150.10 et un port, l'ensemble permettant ainsi de définir un socket.
A la base de tout: les blocs
Les blocs de données font également partis des types complexes. Ils occupent une place primordiale dans le concept Rebol puisqu'ils sont à l'origine de chaque composant du langage. En Rebol, tout est bloc. L'entête d'un script est un bloc, les données et les instructions sont regroupées dans des blocs, les blocs sont contenus dans des blocs, un script est un groupement de blocs, l'univers est un bloc !!! Les blocs sont les structures destinées à contenir l'information et dont les caractères délimiteurs sont les crochets, c'est à dire "[" et "]".
On rencontre trois constructeurs pour les définir. Le type principal est BLOCK! et il correspond à un ensemble de valeurs dont le type et l'organisation est totalement libre. Nous pouvons donc y mélanger les différents types de données de Rebol et y inclure bien sûr d'autres blocs ! Le bloc qui suit est tout a fait valide:
MONBLOC: [ "abcd" olivier@domaine.fr [ 1 2 3 ] %fichier.txt [ 255.255.255.0 [ 80 129 ] ] ]
Par défaut, Rebol attribue le type BLOCK! à une liste de données si aucun type n'a été spécifié.
Pour des volumes d'informations plus importants, Rebol dispose également du type HASH! qui permet d'optimiser les temps de recherche d'une donnée parmi celles stockées.
Nous voici au terme de notre découverte des différents types de données présents dans Rebol, je vous laisse le soin de les expérimenter et de découvrir par vous-mêmes ceux qui n'ont pu être décrits ici pour une évidente raison de place. La prochaine fois, nous étudierons les tableaux et nous aborderons les mots permettant de manipuler les blocs.
Olivier Auverlot