Les troupeaux permettent de regrouper plusieurs pingouins. On distingue deux types de troupeaux : les troupeaux de pingouins anonymes et les troupeaux de pingouins déclarés.
Toute variable est potentiellement un troupeau de pingouins. Si vous la considérez en tant que tel, alors ce sera un troupeau de pingouins. Pour accéder à un pingouin du troupeau, il suffit de donner son numéro entre < et > (le premier pingouin a le numéro 0). Exemple :
J=*(3) GOTO Là J est un entier J<*(3)>=*(5) GOTO Maintenant J est un troupeau GOTO Le quatrième pingouin vaut 5 Z=&J<*(3)> GOTO Z vaut à présent 5 Z=&J<*(2)+*(1)> GOTO Là aussi...
Pour déclarer un troupeau de pingouin, il faut utiliser le mot-clef troupeau. On donne ensuite le nom de tous les pingouins, dans l'ordre.
Plutôt qu'un long discours, donnons un exemple, dans lequel on définit un type de troupeau nommé Machin.
troupeau Machin pingouin Jules pingouin Gustave pingouin Bertrand fintroupeau
Autrement dit, on écrit sur chaque ligne pingouin puis le nom du pingouin. Quand on a fini la description on met une ligne avec écrit fintroupeau.
Ensuite il faut déclarer que la variable est un troupeau de type Machin (on peut avoir autant de troupeaux du même type que l'on souhaite). Pour cela on met le nom du type de troupeau suivis du nom de la variable. Par exemple :
Machin MonTroupeau
Pour accéder à un pingouin du troupeau, on peut faire comme au paragraphe précédent, en utilisant le numéro du pingouin, mais évidemment c'est sans intérêt. Tout le truc c'est qu'à présent on peut accéder à un pingouin particulier en utilisant son nom : pour cela on met le nom du troupeau, le symbole @ puis enfin le nom du pingouin. Par exemple :
MonTroupeau@Bertrand=*(5) GOTOPRINTDUTEXTE() ; &MonTroupeau@Bertrand GOTO ... ce qui affiche 5.
Mais ce n'est pas si simple. D'abord on peut très bien mettre des troupeaux dans d'autres troupeaux, en mettant le nom du troupeau à la place de pingouin. Par exemple :
troupeau GrandTroupeau pingouin Lechef Machin Lesvieux Truc Lesjeunes pingouin Lesouschef fintroupeau GrandTroupeau GT GT@Lesvieux@Bertrand=*(5)
Mais là ne s'arrêtent pas là les possibilités incroyables du GOTO++ car il est tout à fait possible de mettre dans une variable un troupeau anonyme de troupeaux déclarés. Ou des troupeaux déclarés dans des troupeaux anonymes de troupeaux anonymes. Ou... Pour cela on utilise <> qu'on rajoute autant de fois que nécessaire après le nom de la variable quand on la déclare :
Machin TroupeauDeTroupeauxDeTroupeaux<><> TroupeauDeTroupeauxDeTroupeaux<*(1)><*(18)>@Bertrand=*(5)
Et bien sûr il est tout à fait possible de mettre ces troupeaux anonymes dans des troupeaux déclarés :
troupeau Complique Machin Troupeau<> pingouin Charles fintroupeau Complique Aie<> Aie<*(2)>@Troupeau<*(5)>@Bertrand=*(5)
GOTO++ mérite son nom acquis de fière lutte de langage objet grâce à certaines particularités.
La première est qu'il est possible de rajouter des machines à pingouins dans un troupeau. En gros ce sont des fonctions qui agissent directement sur les pingouins du troupeau. Pour ce faire il faut rajouter le mot-clef machineapingouins dans la déclaration du troupeau, suivis de son nom. Ce nom, accolé au nom du type de troupeau, sera une étiquette qui pourra être la cible d'un appel de fonction qui est particulier car la fonction peut directement accéder aux pingouins membre du troupeau. Comme ce n'est pas clair, voici un exemple :
troupeau MonTroupeau pingouin Albert pingouin Bertrand machineapingouins Glagla fintroupeau MonTroupeau J J@Albert=2 J@Bertrand=1 J@Glagla(*(3)) GOTOPRINTDUTEXTE() ; J@Albert GOTO Affiche 5 GOTOFIN §Glagla:ASV(a):MonTroupeau Albert=+&a Bertrand=+&a APLUS
Vous avez sûrement remarqué qu'il faut rajouter : puis le nom du troupeau après le mot-clef ASV de la fonction.
Remarquez qu'un pingouin peut être transformé en machine à pingouin. C'est cruel, mais utile. Pour cela rajouter un pingouin dans la structure puis affectez lui une étiquette. Par exemple :
troupeau MonTroupeau pingouin Albert pingouin Bertrand pingouin Glagla fintroupeau MonTroupeau Bof Bof@Glagla=%3MonTroupeau Bof@Glagla(*(5)) GOTOFIN §3:ASV(x):MonTroupeau Albert=&x Bertrand=&x APLUS
Un troupeau peut être vilement copié sur un autre troupeau, vous lui rajoutez simplement de nouveaux pingouins. Pour cela après le nom du type de troupeau, rajoutez : puis le nom du type de troupeau de base.
troupeau Test:MonTroupeau pingouin Gerard fintroupeau Test Arg Arg@Albert=*(5) Arg@Gerard=*(6)
Cerise sur le gâteau au pingouin, une machine à troupeau peut être appelée lors de la déclaration d'une variable comme étant de ce type de troupeau. Pour cela rajoutez berger n'importe où dans la définition du troupeau. La méthode 0NomDuTroupeau sera automatiquement appelée à l'endroit où vous déclarez la variable.
troupeau Glop pingouin Youpi berger fintroupeau Glop Z GOTO Z@Youpi vaut à présent 3. GOTOFIN §0:ASV:Glop Youpi=*(3) APLUS
Un pingouin givré est partagé par tous les troupeaux d'un même type. Pour dire qu'un pingouin d'un type de troupeau est givré, il faut rajouter GIVRE avant son nom.
troupeau Glop pingouin GIVRE Albert fintroupeau Glop Blub Blub@Albert=*(10) Glob Blob GOTOPRINTDUTEXTE() ; &Blob@Albert GOTO Affiche 10
Une machine à pingouin peut être givrée elle aussi, auquel cas elle ne peut accéder qu'aux pingouins givrés. Il faut également rajouter le mot-clef GIVRE avant son nom.
troupeau Glop pingouin GIVRE Albert machineapingouins GIVRE Multiplicatrice fintroupeau Glop Blub Blub@Albert=*(10) Glob Blob Blob@Multiplicatrice() GOTO Affiche 10 GOTOFIN Multiplicatrice:ASV:Glop GOTOPRINTDUTEXTE() ; &Albert APLUS
Le berger peut aussi être givré : il est alors appelé à l'endroit où le troupeau est défini.
Vous pouvez rajouter le mot-clef GIVRE directement avant le nom du type de troupeau, auquel cas tous les pingouins, toutes les machines à pingouin et l'éventuel berger seront givrés.
Remarque : il est aussi possible d'accéder à un pingouin givré ou à une machine à pingouin givrée en remplaçant le nom du troupeau par le nom du type de troupeau. Ainsi dans l'exemple précédent on aurait pu mettre Glop@Multiplicatrice à la place de Blob@Multiplicatrice.