* Séquences d'échappement
Le Reader XL CLAIRE supporte des séquences d'échappement pour exprimer des
nombres des chaînes ou des caractères dans les base binaires octale et hexadécimales. Une
séquence est introduite par le caractère anti-slash « \ », suivi d'un indicateur de base :
Pasted Graphic 9.tiff ¨
* Représentation des chaînes de caractère
Les chaînes <ycs> sont à l'image des string en C/C++. Pour en connaître la longueur on
utilise strlen, ces chaînes ne peuvent contenir de caractère nul. C'est une limitation quand on
manipule des données binaires (arbitraire). Dans le noyau XL, on adopte le style pascal pour
la représentation des chaînes CLAIRE. Dans cette représentation, la longueur d'une chaîne est
stockée en entête de la zone mémoire qui contient la chaîne, par exemple la chaîne "toto" est
représenté ainsi :
Pasted Graphic 10.tiff ¨
La longueur d'une chaîne se calcule quasi-instantanément avec ce type de
représentation alors que strlen doit parcourir la chaîne entièrement pour en donner la
longueur. Les chaînes C/C++ restent cependant supportées pour toutes les chaînes qui
résident en dehors de Cmemory (cas des chaînes statiques ou importées). Les API de
manipulation de chaîne ont donc été modifiées pour utiliser la nouvelle API length_string :
int length_string(char *s) {
return CLMEM(s) ?
*((int*)s - 1) :
strlen(s);
}
Note : on réserve systématiquement un caractère nul en fin de chaîne, ainsi les chaînes
CLAIRE sont entièrement compatibles avec les chaînes C/C++ et peuvent êtres passées en
argument à des appels fonctionnels de bibliothèques externes sans causer de dommage.
* Destructeurs: freeable_object
Le besoin d'un destructeur a été évoqué sur le forum claire-language et implementé
dans le noyau XL pour un nouveau type d'objet:
freeable_object <: ephemeral_object(
freeme?:boolean = false)
Un objet de type freeable_object est éphémère, lorsque le GC détruit une instance de ce
type il appelle free! donnant l'opportunité de faire un nettoyage, par exemple :
long_double* <: import()
long_double <: freeable_object(value:long_double*)