Section 9.1

Le vocabulaire s'importe

Ce que le langage donne sans qu'on le demande s'arrête à Console, System, File et ses erreurs. Le reste du vocabulaire est écrit en Archon, et s'importe.

Depuis la première section, tout ce que le cours a fait d’un texte, il l’a fait avec $"{…}" : coller des valeurs bout à bout. Jamais le couper, jamais y chercher quoi que ce soit. Ce n’est pas un manque du langage — c’est que ce vocabulaire-là ne se donne pas, il se demande.

import { StrText } from "std/extensions/str-text.arc";

extend archetype str StrText;

@entry(demarrer)
object MonProgramme {
    demarrer() {
        var incantation := "abracadabra";

        Console.print(text: $"{incantation.length} lettres");
        Console.print(text: $"les cinq premières : {incantation.substring(start: 0, end: 5)}");
        Console.print(text: $"la première vaut {incantation.charAt(index: 0)}");
    }
}

Ce que le langage donne sans qu’on demande

La liste est courte, et vous la connaissez déjà en entier : Console, System, File, et les archetypes d’erreur que la 8.2 a nommés. Plus .length, rencontré en 6.1 sur un tableau, et qui vaut aussi pour un texte. C’est tout.

Couper un texte, y lire une lettre, le rendre en nombre : rien de cela n’est dans le langage. C’est écrit en Archon, dans une bibliothèque standard, avec les mêmes archetypes et les mêmes méthodes que ceux que vous écrivez depuis la section 7. Retirez les deux premières lignes du programme, et le compilateur est net :

error[N009]: 'str' has no method 'substring'

Il n’y a pas de méthode cachée qu’un mot magique révélerait. Il n’y en a pas, tant qu’on n’en a pas apporté.

import va chercher, extend applique

Les deux lignes en tête du programme ne font pas la même chose, et il faut les deux :

import { StrText } from "std/extensions/str-text.arc";

extend archetype str StrText;

import dit d’où ça vient et ce qu’on en tire : du fichier std/extensions/str-text.arc, un paquet de méthodes nommé StrText. Le chemin commence par std/, et cette bibliothèque-là, le compilateur la porte dans sa propre mémoire — rien à télécharger, rien à installer, aucun fichier à poser à côté du vôtre.

extend archetype str StrText; l’applique, ici, dans ce fichier. L’import seul ne suffit pas : le compilateur répond le même N009. C’est voulu — une extension ne s’impose jamais à un fichier qui ne l’a pas demandée, et ce que vous ajoutez à str chez vous, vous ne l’ajoutez pas chez le voisin.

Remarquez au passage ce qui vient de se produire : str n’est pas un type à vous, vous n’en avez pas écrit une ligne, et vous venez pourtant de lui donner des méthodes — sans en hériter, puisqu’il n’y a pas d’héritage en Archon. C’est à cela que sert extend.

substring coupe entre deux rangs

incantation.substring(start: 0, end: 5)

Les rangs sont ceux de la 6.1, et ils partent de zéro. start est pris, end ne l’est pas : l’intervalle est semi-ouvert. D’où deux commodités — end - start est la longueur du morceau, et substring(start: 0, end: incantation.length) rend le texte entier sans déborder d’un cran.

Déborder, justement, ne passe pas inaperçu :

uncaught error — IndexOutOfRangeError : substring [0, 50) out of range for a string of length 11

C’est l’erreur du tableau hors bornes de la 6.1, sur un texte, et elle s’attrape exactement comme la 8 l’a montré.

charAt rend un code, pas une lettre

incantation.charAt(index: 0) rend 97, pas "a".

Ce n’est pas une bizarrerie : Archon n’a pas de type « caractère » séparé. Une lettre seule est un texte d’une lettre, et un code de caractère est un entier — 97 est celui de a, 98 celui de b, et ainsi de suite. Un charAt sert donc à comparer, pas à afficher ; pour afficher une lettre, c’est substring qu’on appelle.

À vous

  • Retirez la ligne extend, gardez l’import, et lisez : N009 revient. L’import apporte, il n’applique pas.
  • Demandez substring(start: 0, end: 50) sur onze lettres : l’erreur nomme l’intervalle et la longueur, et vous sauriez déjà l’attraper.
  • Affichez incantation.charAt(index: 1) : 98. Les codes se suivent comme l’alphabet.
  • Prenez les cinq dernières lettres — substring(start: incantation.length - 5, end: incantation.length). C’est la même arithmétique qu’en 6.1 pour atteindre le dernier rang.