1. La tortue et le champ graphique

Au centre de l'écran graphique se trouve une petite flèche : c'est la tortue. Elle possède une position (un point sur l'écran), un cap (la direction vers laquelle elle pointe) et un crayon qu'elle peut baisser pour tracer ou lever pour se déplacer sans laisser de trace.

Le champ graphique est un espace de 1600 pas de large sur 1000 pas de haut. L'origine (le point [0, 0]) est au centre. L'axe x va de −800 à +800 (gauche → droite), l'axe y de −500 à +500 (bas → haut). La tortue démarre toujours au centre, pointant vers le haut (cap 0).

Déplacer la tortue

AV 100      ; avance de 100 pas
RE 50       ; recule de 50 pas
TD 90       ; tourne à droite de 90 degrés
TG 45       ; tourne à gauche de 45 degrés

Le cap suit la convention de la boussole : 0 = nord (haut), 90 = est (droite), 180 = sud (bas), 270 = ouest (gauche). TD ajoute des degrés dans le sens horaire, TG dans le sens anti-horaire.

Pour placer la tortue directement en un point :

FPOS [ 100 50 ]   ; va au point (100, 50) sans changer le cap
FCAP 180         ; fixe le cap à 180° (vers le bas)
ORIGINE          ; remet la tortue au centre, cap 0

Le crayon

Par défaut, le crayon est baissé : la tortue trace en avançant. On le lève ou on le baisse avec :

LC          ; Lève le Crayon
BC          ; Baisse le Crayon
ECRIS BC?   ; VRAI si le crayon est baissé

La couleur du trait se change avec FCC (Fixe la Couleur du Crayon), en donnant un code de 0 à 15, ou une triplet rouge-vert-bleu :

FCC 6              ; cyan (couleur par défaut)
FCC 1              ; rouge
FCC [ 255 128 0 ]   ; orange (couleur libre en RVB)
0 noir
1 rouge
2 vert
3 jaune
4 bleu
5 magenta
6 cyan
7 blanc
8 gris
9 rouge clair
10 vert clair
11 jaune clair
12 bleu clair
13 magenta clair
14 cyan clair
15 orange

Le fond et le bord

FCFG 4              ; fond bleu (par défaut)
FCB 0               ; bord noir
VE                   ; vide l'écran et remet tout à l'état initial
NETTOIE             ; efface le dessin sans bouger la tortue

Modes de champ

Que se passe-t-il quand la tortue atteint le bord du champ ? Cela dépend du mode choisi :

ENR
REPETE 200 [ AV 10 TD 7 ]   ; spirale qui enroule

Plusieurs tortues

Par défaut il n'y a qu'une seule tortue, numérotée 0. On peut en faire vivre plusieurs sur le même écran : FIXETORTUE n choisit la tortue active (créée au besoin), et toutes les commandes habituelles (AV, TD, FCC…) agissent ensuite sur elle. Chaque tortue garde sa propre position, son cap et son crayon ; le fond, l'échelle et le mode de champ, eux, sont communs à l'écran. Les numéros vont de 0 à 1023 (au plus 1024 tortues).

FIXETORTUE 1         ; crée et sélectionne une 2e tortue
FCC 1 TD 90 AV 100  ; elle dessine en rouge, vers la droite
FIXETORTUE 0         ; on revient à la 1re tortue (inchangée)

DEMANDE n [ … ] exécute un bloc sur la tortue n (ou sur chaque tortue d'une liste de numéros) puis revient à la tortue active précédente. TORTUE donne le numéro courant, NBTORTUES le nombre de tortues, et DISTORTUE n'en garde qu'une (la n°0).

SPRITE et FCC agissent aussi sur la tortue active : chaque tortue peut donc avoir sa propre forme et sa propre couleur de crayon.

FIXETORTUE 2                 ; on a maintenant les tortues 0, 1 et 2
DEMANDE 1 [ TD 120 ]         ; chacune regarde dans une direction
DEMANDE 2 [ TD 240 ]
DEMANDE [ 0 1 2 ] [ AV 80 ]  ; les trois rayonnent depuis le centre, puis retour à la n°2

COLLISION? [ a b ] retourne VRAI si les tortues a et b existent, sont visibles et se chevauchent : pratique pour un petit jeu (toucher une cible, éviter un obstacle…).

Dessiner sa propre forme : DEFSPRITE

À la manière du DEFGR$ du BASIC, DEFSPRITE définit une forme de 16×16 pixels « en ASCII » : une liste d'au plus 16 lignes de 16 caractères, où . = pixel vide et tout autre caractère (un X par exemple) = pixel plein. La forme reçoit un numéro de 3 à 255 (0, 1, 2 sont les formes intégrées), puis SPRITE la sélectionne. Elle est dessinée dans la couleur du crayon et pivote avec le cap. Les formes survivent à VE (mais pas à RAZ).

DEFSPRITE 3 [
  ......XXXX......
  ....XXXXXXXX....
  ...XX.XXXX.XX...
  ...XXXXXXXXXX...
  ...XX.XXXX.XX...
  ....XX.XX.XX....
  ......XXXX......
]
SPRITE 3                  ; la tortue active prend cette forme

Animer les tortues : ANIME

ANIME id x y vitesse mode déplace une tortue automatiquement vers un point, en parallèle du programme. vitesse est le nombre de pas Logo parcourus à chaque image ; CADENCE fixe le nombre d'images par seconde (défaut 30). Comme la vitesse est exprimée par image, le rapport entre deux vitesses reste le même quelle que soit la cadence.

Le mode est un mot : "UNEFOIS (va à la cible puis s'arrête), "BOUCLE (revient instantanément au départ et recommence, utile pour un scrolling) ou "PINGPONG (aller-retour continu). Si le crayon est baissé, la tortue laisse une trace ; levez-le (LC) pour un déplacement propre. Une commande manuelle (AV, FXY…) sur la tortue arrête son animation, tout comme STOPANIME et Ctrl+C.

CADENCE 60
ANIME 1 300 150 2 "PINGPONG   ; la tortue 1 fait des allers-retours lents
ANIME 2 -300 150 8 "BOUCLE    ; la tortue 2 va 4 fois plus vite
ATTENDS 180                  ; 3 s : les deux bougent (le programme attend, pas l'animation)
STOPANIME 1                    ; arrête la tortue 1 ; la 2 continue. (STOPANIME) les arrête toutes

L'attente est essentielle ici : sans elle, les quatre lignes s'enchaînent en un instant et STOPANIME 1 stoppe la tortue 1 avant qu'on ait pu la voir bouger. Pendant ATTENDS, le programme patiente mais les animations, elles, continuent.

Couplé à COLLISION?, cela suffit pour un petit jeu : une cible se déplace toute seule pendant que la boucle lit la manette pour bouger le joueur, jusqu'au contact. Voici un jeu d'adresse complet, jouable aux flèches du clavier : amène le joueur (en bas) sur la cible qui balaie le haut.

VE
LC FXY 0 -200                 ; le joueur (tortue 0) démarre en bas
DEMANDE 1 [ LC FXY -600 150 ]      ; la cible (tortue 1) part à gauche
ANIME 1 600 150 4 "PINGPONG     ; elle balaie le haut en allers-retours
TANTQUE [ NON COLLISION? [ 0 1 ] ] [
  DONNE "D MANETTE 0
  SI :D = 1 [ FCAP 0   AV 20 ]      ; haut
  SI :D = 5 [ FCAP 180 AV 20 ]      ; bas
  SI :D = 3 [ FCAP 90  AV 20 ]      ; droite
  SI :D = 7 [ FCAP 270 AV 20 ]      ; gauche
  ATTENDS 1
]
STOPANIME 1
ECRIS [ ATTRAPÉE ! ]

La cible avance seule (moteur d'animation) pendant que la boucle lit la manette et déplace le joueur ; dès qu'ils se touchent, COLLISION? devient vraie et la boucle s'arrête. Ctrl+C interrompt la partie (et les animations).

SCENE : animer sans clignotement

Le moteur ANIME déplace des sprites sans rien effacer. Mais beaucoup de jeux et d'animations redessinent eux-mêmes toute la scène à chaque image : NETTOIE, puis on retrace le décor et les tortues dans une boucle. L'écran risque alors d'être affiché au milieu du redessin (juste après le NETTOIE, champ vide, ou à moitié tracé) : c'est ce qui donne une impression de clignotement.

SCENE [ … ] règle le problème. Tout ce qui est dessiné dans le bloc est construit dans un tampon caché, et l'écran ne bascule sur la nouvelle image qu'une fois le bloc terminé (double tampon). Enveloppez le dessin d'une image dans SCENE et laissez l'ATTENDS à l'extérieur :

TANTQUE [ NON TOUCHE? ] [
  SCENE [
    NETTOIE
    ; … retracer tout le décor et les tortues …
  ]
  ATTENDS 2             ; l'attente reste hors du bloc
]

2. Les données

En Logo, tout est objet. Il existe trois sortes d'objets :

Les nombres

Les nombres peuvent être entiers ou décimaux (séparateur : le point). Les quatre opérations arithmétiques s'écrivent de façon naturelle, avec des espaces autour des opérateurs :

ECRIS 3 + 4          ; affiche 7
ECRIS 10 - 3         ; affiche 7
ECRIS 6 * 7          ; affiche 42
ECRIS 100 / 4        ; affiche 25
ECRIS 360 / 8        ; affiche 45

On peut aussi écrire avec les formes longues : SOMME 3 4, DIFF 10 3, PROD 6 7, DIV 100 4.

Fonctions mathématiques utiles :

ECRIS RC 16          ; racine carrée → 4
ECRIS ENT 3.7        ; partie entière → 3
ECRIS ARRONDI 3.6   ; entier le plus proche → 4
ECRIS VALABS -5     ; valeur absolue → 5
ECRIS HASARD 6      ; entier aléatoire entre 0 et 5
ECRIS SIN 30         ; sinus de 30° → 0.5
ECRIS COS 60         ; cosinus de 60° → 0.5
ECRIS PI             ; constante π → 3.14159...
Priorité : une fonction « avale » l'expression qui la suit. Une fonction préfixée (comme COMPTE, ENT, VALABS, RC...) prend pour argument toute l'expression placée à sa droite, opérateurs compris. Ainsi COMPTE :MOT - 1 est lu COMPTE ( :MOT - 1 ), et non ( COMPTE :MOT ) - 1. Pour retrancher 1 au résultat de la fonction, il faut parenthéser : ( COMPTE :MOT ) - 1. En cas de doute, ajoutez des parenthèses autour de l'appel.

Les mots

Un mot est une suite de caractères. Pour écrire un mot littéral, on le fait précéder d'un guillemet " :

ECRIS "BONJOUR
ECRIS "ROUGE
ECRIS MOT "BON "JOUR   ; concatène → BONJOUR

Pour interroger un mot :

ECRIS COMPTE "BONJOUR     ; nombre de caractères → 7
ECRIS PREM "BONJOUR       ; premier caractère → B
ECRIS DER "BONJOUR        ; dernier → R
ECRIS ITEM 3 "BONJOUR    ; 3e caractère → N
ECRIS SP "BONJOUR         ; sauf le premier → ONJOUR

Les listes

Une liste est un ensemble d'objets entre crochets. Les objets peuvent être des nombres, des mots, ou d'autres listes :

[ 1 2 3 ]
[ ROUGE VERT BLEU ]
[ 100 0 ]              ; coordonnées
[ [ 1 2 ] [ 3 4 ] ]   ; liste de listes

Pour travailler avec les listes :

ECRIS COMPTE [ A B C ]         ; → 3
ECRIS PREM [ A B C ]           ; → A
ECRIS DER [ A B C ]            ; → C
ECRIS SP [ A B C ]             ; → [B C]
ECRIS ITEM 2 [ A B C ]        ; → B
ECRIS MP "X [ A B ]           ; ajoute en tête → [X A B]
ECRIS MD "Z [ A B ]           ; ajoute en queue → [A B Z]
ECRIS PH [ A B ] [ C D ]     ; phrase (aplatit) → [A B C D]
ECRIS LISTE "A "B             ; construit [A B]
ECRIS INVERSE [ A B C ]       ; → [C B A]
ECRIS TRIE [ 3 1 2 ]          ; → [1 2 3]

Les tableaux

Au-delà des trois types de base, GoLogo propose aussi les tableaux. Une liste est souple, mais pour atteindre son centième élément il faut parcourir les quatre-vingt-dix-neuf premiers. Un tableau, lui, donne un accès direct à n'importe quelle case par son numéro, et on peut changer une case sur place. C'est le bon outil dès qu'on manipule beaucoup de valeurs repérées par une position : une table de scores, un plateau de jeu, une grille.

TABLEAU n crée un tableau de n cases, numérotées à partir de 1 (chaque case vaut la liste vide au départ). On lit une case avec ITEM, on la modifie avec FIXEITEM, et COMPTE donne le nombre de cases :

DONNE "SCORES TABLEAU 3
FIXEITEM 1 :SCORES 50      ; range 50 dans la case 1
FIXEITEM 2 :SCORES 80
ECRIS ITEM 2 :SCORES      ; → 80
ECRIS COMPTE :SCORES        ; → 3

On peut aussi écrire un tableau directement entre accolades. Par défaut la première case porte le numéro 1 ; pour démarrer à 0 (souvent plus commode quand on calcule des indices), on ajoute @0 juste après l'accolade fermante :

DONNE "JOURS { LUN MAR MER JEU VEN }
ECRIS ITEM 3 :JOURS        ; → MER
DONNE "T { A B C }@0          ; cases numérotées 0, 1, 2
ECRIS ITEM 0 :T            ; → A
Un tableau se partage, une liste se recopie. Contrairement aux listes, un tableau est passé par référence. Si vous écrivez DONNE "U :SCORES, alors :U et :SCORES désignent le même tableau, et un FIXEITEM sur l'un se voit aussi sur l'autre. C'est voulu (cela évite de recopier un gros tableau à chaque passage dans une procédure), mais ça surprend la première fois. Pour obtenir une copie vraiment indépendante, utilisez COPIETABLEAU.

Quelques compagnons utiles : TABLEAU? :X dit si :X est un tableau, ORDONNE :T trie ses cases sur place, et les deux ponts LISTEVERSTABLEAU et TABLEAUVERSLISTE font passer de l'un à l'autre. Ce dernier est pratique pour traiter un tableau avec POURCHAQUE ou APPLIQUE, qui travaillent sur des listes.

Pour une grille à deux dimensions (un damier, un labyrinthe, un écran de points), TABLEAUMD crée un tableau multi-dimensionnel, et ITEMMD / FIXEITEMMD accèdent à une case par une liste d'indices :

DONNE "GRILLE TABLEAUMD [ 3 3 ]   ; 3 sur 3
FIXEITEMMD [ 2 2 ] :GRILLE "X      ; la case du milieu
ECRIS ITEMMD [ 2 2 ] :GRILLE      ; → X

Piles et files

Deux petits outils bien commodes travaillent sur une variable qui contient une liste (au départ la liste vide [ ]). Une pile empile et dépile par le même bout, donc le dernier arrivé sort le premier ; une file ajoute d'un côté et retire de l'autre, donc premier arrivé, premier servi.

DONNE "P [ ]
EMPILE "P 1   EMPILE "P 2   EMPILE "P 3
ECRIS DEPILE "P      ; → 3  (le dernier empilé)
ECRIS DEPILE "P      ; → 2

DONNE "F [ ]
ENFILE "F "A   ENFILE "F "B
ECRIS DEFILE "F      ; → A  (le premier entré)

Afficher des objets

ECRIS "BONJOUR            ; affiche BONJOUR puis retour à la ligne
TAPE "BONJOUR             ; affiche BONJOUR sans retour à la ligne
MONTRE [ A B C ]        ; conserve les crochets → [A B C]

3. Les variables

Une variable est un nom qui désigne un objet. On la crée avec DONNE :

DONNE "AGE 17
DONNE "PRENOM "TINTIN
DONNE "COULEURS [ ROUGE VERT BLEU ]

Pour lire la valeur d'une variable, on préfixe son nom de deux-points :

ECRIS :AGE       ; → 17
ECRIS :PRENOM    ; → TINTIN
AV :AGE          ; avance de 17 pas

La notation :AGE est l'abréviation de CHOSE "AGE. On peut modifier la valeur d'une variable simplement en lui redonnant :

DONNE "COMPTEUR 0
DONNE "COMPTEUR :COMPTEUR + 1   ; incrémente de 1

4. Les procédures

La grande idée de Logo, c'est qu'on peut apprendre de nouveaux mots à GoLogo. Une procédure, c'est exactement ça : une commande que vous inventez vous-même.

Définir une procédure simple

On définit une procédure avec POUR suivi de son nom, et on la termine par FIN :

POUR CARRE
  REPETE 4 [ AV 80 TD 90 ]
FIN

GoLogo répond VOUS VENEZ DE DEFINIR CARRE et, à partir de ce moment, CARRE est une commande à part entière :

CARRE
TD 30
CARRE

Procédures avec paramètres

Un paramètre permet de passer une valeur à la procédure au moment de l'appel. On le déclare avec un deux-points dans la ligne POUR :

POUR POLYGONE :N :COTE
  REPETE :N [ AV :COTE TD 360 / :N ]
FIN

On appelle cette procédure en lui passant ses deux arguments :

POLYGONE 3 100    ; triangle
POLYGONE 4 80     ; carré
POLYGONE 6 60     ; hexagone
POLYGONE 12 30    ; dodécagone (ressemble à un cercle)

Procédures qui retournent une valeur (opérations)

Une procédure peut aussi calculer et retourner un résultat grâce à RENDS. Elle devient alors une opération, utilisable partout où GoLogo attend une valeur :

POUR DOUBLE :N
  RENDS :N * 2
FIN

ECRIS DOUBLE 5       ; → 10
AV DOUBLE 30          ; avance de 60 pas

5. Portée des variables : locale ou globale ?

Voici un point qui surprend souvent les débutants, et qui est pourtant au cœur de la façon dont Logo fonctionne. Par défaut, une variable créée avec DONNE est globale : elle existe partout, y compris à l'intérieur des autres procédures. C'est commode, mais ça cache un piège.

Le piège : une procédure peut écraser la variable d'une autre

Imaginons deux procédures qui utilisent chacune une variable nommée RES :

POUR TRIPLE :X
  DONNE "RES :X * 3
  RENDS :RES
FIN

POUR CALCUL
  DONNE "RES 100
  ECRIS TRIPLE 5     ; → 15
  ECRIS :RES          ; → 15  (et non 100 !)
FIN

On s'attendait à ce que :RES vaille encore 100 à la fin de CALCUL. Mais comme TRIPLE a fait DONNE "RES sur la même variable globale, il a remplacé le 100 de CALCUL par 15. La procédure appelée a abîmé une variable de la procédure appelante, sans prévenir.

La solution : LOCAL

LOCAL "RES dit à GoLogo : « dans cette procédure, RES est à moi, je ne touche pas à celui des autres ». Une seule ligne change tout :

POUR TRIPLE :X
  LOCAL "RES           ; RES devient privé à TRIPLE
  DONNE "RES :X * 3
  RENDS :RES
FIN

POUR CALCUL
  DONNE "RES 100
  ECRIS TRIPLE 5     ; → 15
  ECRIS :RES          ; → 100  (préservé !)
FIN

Maintenant chaque RES vit dans sa propre procédure : celui de TRIPLE disparaît dès qu'il a fini, celui de CALCUL reste intact.

Le même piège dans une boucle

C'est encore plus sournois quand l'appelant utilise une variable de boucle comme I et qu'une procédure appelée écrase ce même I :

POUR AFFICHE :X
  DONNE "I :X * 10      ; oups : I est aussi la variable de boucle de l'appelant
  ECRIS :I
FIN

POUR BOUCLE
  REPETEPOUR [ I 1 3 ] [ AFFICHE :I   ECRIS :I ]
FIN

BOUCLE     ; affiche 10 10 20 20 30 30 (le second nombre devrait être 1 2 3 !)

En ajoutant LOCAL "I dans AFFICHE, la boucle retrouve son compte : 10 1 20 2 30 3. Règle simple : toute variable de travail (compteur, total, résultat intermédiaire) créée dans une procédure mérite un LOCAL.

Bonne nouvelle : les paramètres sont déjà locaux. Les paramètres d'une procédure (le :N de POUR DOUBLE :N) sont automatiquement privés : les modifier ne touche jamais une variable globale du même nom. Le LOCAL n'est utile que pour les variables que vous créez avec DONNE à l'intérieur de la procédure.

Un exemple bien écrit

Une procédure soignée déclare ses variables de travail en local dès le départ :

POUR CERCLE_APPROX :R
  LOCAL "PAS
  DONNE "PAS 2 * PI * :R / 360
  REPETE 360 [ AV :PAS TD 1 ]
FIN
Pourquoi ce comportement ? Cette portée « dynamique » (global par défaut, LOCAL pour se réserver un nom) est celle du Logo d'origine : GoLogo y reste fidèle. Le réflexe LOCAL fait partie des bases du langage.

6. Les boucles

REPETE

REPETE n [ instructions ] exécute les instructions n fois. C'est la boucle la plus simple et la plus utilisée :

REPETE 4 [ AV 80 TD 90 ]          ; carré
REPETE 360 [ AV 1 TD 1 ]          ; cercle
REPETE 12 [ CARRE TD 30 ]         ; rosace

Dans une boucle REPETE, COMPTEUR retourne le numéro de l'itération en cours (1, 2, 3…) :

REPETE 5 [ AV COMPTEUR * 20 TD 90 ]   ; spirale carrée
Lignes trop longues ? Un ~ (tilde) en fin de ligne indique que l'instruction continue sur la ligne suivante, pratique pour aérer une boucle avec des listes imbriquées. Ainsi REPETE 6 ~ suivi de la liste [ … ] sur les lignes suivantes revient à tout écrire sur une seule ligne. (Le caractère ! joue le même rôle, hérité du Logo du MO5.)

REPETEPOUR

REPETEPOUR est une boucle pour (for) avec compteur : une variable prend successivement les valeurs de départ à fin, par pas :

REPETEPOUR [ I 1 10 ] [ ECRIS :I ]           ; de 1 à 10
REPETEPOUR [ I 0 100 10 ] [ AV :I TD 90 ]   ; spirale par pas de 10

TANTQUE

TANTQUE est une boucle tant que (while) : elle continue tant que sa condition est vraie.

DONNE "N 1
TANTQUE [ :N < 100 ] [
  AV :N
  TD 91
  DONNE "N :N + 1
]

POURCHAQUE

POURCHAQUE parcourt chaque élément d'une liste. L'élément courant est disponible sous le nom :? :

POURCHAQUE [ 1 2 3 4 5 ] [ AV :? * 10 TD 90 ]

POURCHAQUE [ ROUGE VERT BLEU ] [
  ECRIS :?
]

7. Les conditions

SI

SI exécute des instructions selon qu'une condition est vraie ou fausse :

SI :N > 0 [ ECRIS "POSITIF ]
SI :N > 0 [ ECRIS "POSITIF ] [ ECRIS "NEGATIF_OU_NUL ]

La forme à deux listes est équivalente à un si/sinon. L'alias SISINON exprime la même chose de manière plus explicite.

Les prédicats

Un prédicat est une opération qui retourne VRAI ou FAUX. Tous les prédicats Logo se terminent par ? :

ECRIS EGAL? 3 3             ; → VRAI
ECRIS PLP? 2 5              ; 2 < 5 → VRAI
ECRIS PLG? 8 3              ; 8 > 3 → VRAI
ECRIS VIDE? [ ]             ; liste vide ? → VRAI
ECRIS NOMBRE? "BONJOUR     ; est un nombre ? → FAUX
ECRIS MEMBRE? "B [ A B C ] ; B dans la liste ? → VRAI

Les opérateurs ET, OU et NON combinent les prédicats :

SI ET PLP? :N 0 PLG? :N 100 [ ECRIS "ENTRE_0_ET_100 ]
SI NON VIDE? :LISTE [ ECRIS PREM :LISTE ]

Comparaisons et casse

Les comparaisons de mots ignorent la casse : EGAL? "a "A rend VRAI. Il en va de même pour =, AVANT?, SOUSCHAINE? et MEMBRE?. C'est commode d'ordinaire, mais gênant lorsque la casse porte un sens, par exemple pour distinguer une case a d'une case A dans une grille.

Quand la casse compte : comparez les codes des caractères avec ASCII plutôt que les caractères eux-mêmes. EGAL? ASCII :C1 ASCII :C2 n'est vrai que pour deux caractères rigoureusement identiques (ASCII "a vaut 97, ASCII "A vaut 65).

8. La récursion

En Logo, une procédure peut s'appeler elle-même. C'est ce qu'on appelle la récursion. C'est l'outil idéal pour des structures qui se répètent à différentes échelles.

L'exemple le plus simple est un compte à rebours :

POUR COMPTE :N
  SI :N = 0 [ ECRIS "DECOLLAGE STOP ]
  ECRIS :N
  COMPTE :N - 1
FIN

COMPTE 5

La récursion est aussi la façon naturelle de parcourir une liste :

POUR AFFICHE_TOUT :LISTE
  SI VIDE? :LISTE [ STOP ]
  ECRIS PREM :LISTE
  AFFICHE_TOUT SP :LISTE
FIN

Et pour les dessins fractals, c'est irremplaçable (voir la page Programmes exemples).

Récursion sans souci. Une procédure peut s'appeler elle-même un très grand nombre de fois sans ralentir ni bloquer GoLogo. Et si une boucle récursive tourne sans fin, on l'arrête à tout moment avec Ctrl+C.

9. Contrôle du flux dans les procédures

Trois instructions permettent de quitter une procédure en cours d'exécution :

POUR AVANCE_SI_OK :N
  SI :N < 0 [ STOP ]        ; on ne fait rien si N négatif
  AV :N
FIN

POUR SIGNE :N
  SI :N > 0 [ RENDS 1 ]
  SI :N < 0 [ RENDS -1 ]
  RENDS 0
FIN

10. Graphisme avancé

Cercle et arc

CERCLE 50              ; cercle de rayon 50, centré sur la tortue
ARC 60 0 90           ; arc de rayon 60, de 0° à 90° (quart de cercle)
ARC 40 45 315         ; arc de 45° à 315° (¾ de cercle)

La tortue ne bouge pas, elle reste au centre du cercle ou de l'arc.

Remplissage

REPETE 4 [ AV 80 TD 90 ]   ; on trace d'abord la forme
REMPLIS                       ; puis on remplit la zone qui contient la tortue

Pour choisir une couleur de remplissage différente de la couleur du crayon :

FCC 7     ; crayon blanc pour le contour
FCR 1     ; remplissage rouge
REPETE 4 [ AV 80 TD 90 ]
REMPLIS

Épaisseur du trait

FIXETAILLECRAYON 5
REPETE 4 [ AV 100 TD 90 ]   ; carré avec trait épais
FIXETAILLECRAYON 2            ; retour à l'épaisseur normale

Écrire dans le champ graphique

FCC 3
ETIQUETTE "BONJOUR           ; écrit à la position de la tortue

Sauvegarder le dessin

SAUVEPNG "MON_DESSIN         ; sauve en MON_DESSIN.PNG
COPIE                        ; capture d'écran numérotée dans Logo/PRINTER/

11. Zone de texte et affichage

En dehors du champ graphique, GoLogo dispose d'une zone de texte avec une grille de 40 colonnes sur 25 lignes. C'est là que les commandes ECRIS et TAPE écrivent.

ME 5           ; montre 5 lignes de texte sous le champ graphique
ME 25          ; plein texte (masque le champ graphique)
VT             ; vide la zone de texte
FCURS [ 10 5 ] ; place le curseur texte à la colonne 10, ligne 5
FCT 3          ; texte en jaune
FCFT 0         ; fond du texte en noir

12. Lire le clavier et la souris

Clavier

DONNE "C LISCAR          ; attend un caractère, le range dans C
DONNE "L LL              ; attend une ligne entière → liste de mots
SI TOUCHE? [ ECRIS LISCAR ]   ; si une touche est disponible, la lit

Pour poser une question à l'utilisateur :

LIS [ QUEL EST TON PRENOM ] "PRENOM
ECRIS MOT "BONJOUR_ :PRENOM

Souris

ECRIS SOURISPOS           ; [x y] si le curseur est dans le champ
SI SOURISPRESSEE [ ECRIS "CLIC ]

13. Musique

GoLogo peut jouer des notes. Les notes s'écrivent avec leurs noms de solfège :

JOUE "DO
JOUE [ DO RE MI FA SOL LA SI ]
JOUE [ DO RE# MI SOL LA ]   ; avec un dièse

On règle l'octave, la durée, le tempo et le timbre :

OCTAVE 5         ; octave aiguë (1 à 5, défaut 4)
DUREE 12         ; notes plus courtes (1 à 96, défaut 24)
TEMPO 10         ; plus rapide (1 à 255, défaut 5)
TIMBRE 192       ; son sinusoïdal (0=carré, 64=scie, 128=triangle, 192=sinus)
JOUE [ DO MI SOL DO ]

14. Fichiers

Les fichiers Logo (.GLG) sont stockés dans le dossier ~/Logo/ sous Linux/macOS, ou dans Documents\Logo\ sous Windows. Il n'y a pas besoin de préciser le chemin complet.

SAUVE "PROJET CONTENU    ; sauve tout dans PROJET.GLG
RAMENE "PROJET            ; charge et exécute PROJET.GLG
CHARGE "PROJET            ; charge dans l'éditeur sans exécuter
CATALOGUE                 ; liste les fichiers disponibles
DETRUIS "PROJET           ; supprime le fichier

Les exemples fournis avec GoLogo

GoLogo est livré avec un dossier d'exemples prêts à charger. Trois commandes, terminées par EX, fonctionnent exactement comme leurs homologues mais vont chercher dans ce dossier (en lecture seule) :

CATALOGUEEX               ; liste les exemples disponibles (comme CATALOGUE)
RAMENEEX "MANDELBROT      ; charge et exécute un exemple (comme RAMENE)
CHARGEEX "MANDELBROT      ; ouvre un exemple dans l'éditeur (comme CHARGE)

L'emplacement du dossier d'exemples dépend du système (il est installé avec GoLogo). Si le dossier ou le fichier demandé est introuvable, la commande le signale.

Lire et écrire des fichiers de données

Tout ce qui précède concerne les fichiers de programme. Mais on a souvent besoin de lire ou d'écrire ses propres données : une liste de scores, un texte, des nombres à traiter. GoLogo fonctionne alors avec des flux, à la manière de FMSLogo. Le principe est simple : on ouvre un fichier, on en fait le flux courant, puis les commandes de lecture habituelles (LISCAR, LISMOT, LL, et surtout LISLIGNE) lisent dedans au lieu de lire le clavier. C'est pareil pour l'écriture : une fois un fichier choisi comme flux d'écriture, ECRIS, TAPE et MONTRE écrivent dedans plutôt qu'à l'écran.

Pour parcourir un fichier texte ligne par ligne, le motif habituel est une boucle TANTQUE qui s'arrête à la fin du fichier, repérée par FINFICHIER? :

OUVRELECTURE "DONNEES.TXT        ; ouvre le fichier en lecture
FIXELECTURE "DONNEES.TXT         ; il devient le flux de lecture courant
TANTQUE [ NON FINFICHIER? ] [
  DONNE "LIGNE LISLIGNE        ; lit une ligne entière, telle quelle
  ECRIS :LIGNE                ; … et on en fait ce qu'on veut …
]
FERME "DONNEES.TXT               ; on referme une fois fini

Pour écrire, c'est le même esprit : on ouvre en écriture, ce qui crée le fichier ou écrase l'ancien (ou bien OUVREAJOUT pour ajouter à la suite), on dirige l'écriture vers ce flux, puis on revient à l'écran en passant la liste vide à FIXEECRITURE :

OUVREECRITURE "NOTES.TXT
FIXEECRITURE "NOTES.TXT
ECRIS [ 12 15 9 ]            ; cette ligne part dans le fichier
FIXEECRITURE [ ]                  ; retour à l'affichage normal
FERME "NOTES.TXT

Quand on veut simplement avaler tout un fichier texte d'un coup, FICHIERVERSTABLEAU le lit en une fois et rend un tableau dont chaque case est une ligne (la première ligne en case 1). C'est le compagnon naturel des tableaux vus plus haut : COMPTE donne le nombre de lignes, et on atteint n'importe laquelle par son numéro.

DONNE "LIGNES FICHIERVERSTABLEAU "DONNEES.TXT
ECRIS COMPTE :LIGNES        ; combien de lignes ?
ECRIS ITEM 1 :LIGNES        ; la première ligne
Où vivent ces fichiers ? Comme les fichiers .GLG, les fichiers de données restent dans le dossier de travail (~/Logo/ ou Documents\Logo\) : on donne un nom, pas un chemin complet, et on ne peut pas sortir de ce dossier. Par défaut les fins de ligne écrites sont à la mode Unix (LF) ; FIXEFINLIGNE "CRLF bascule au format Windows si le fichier doit être relu ailleurs.

15. Espace de travail

GoLogo conserve en mémoire toutes les procédures et variables définies pendant la session. On peut les consulter et les gérer :

IMTOUT             ; affiche toutes les procédures et variables
IMTS               ; affiche seulement les titres des procédures
IM "CARRE           ; affiche la définition de CARRE
EFP "CARRE          ; efface la procédure CARRE
EFN "AGE            ; efface la variable AGE
.EFT               ; efface tout (procédures et variables)
RAZ                ; remet tout à zéro (demande confirmation)

16. Messages d'erreur courants

Quand GoLogo ne comprend pas ce qu'on lui demande, il répond avec un message d'erreur explicite :

MessageCause
COMMENT FAIRE MACHINLa commande MACHIN n'existe pas (faute de frappe ?)
PAS ASSEZ DE DONNEES POUR AVUn argument manque à AV
QUE FAIRE DE 42Une opération a retourné 42 mais personne ne l'utilise
… N'AIME PAS …Le type de l'argument est incorrect
LA TORTUE VA SORTIRDéplacement hors du champ en mode CLOS
PAS DE CHOSE DONNEE A XLa variable X n'existe pas
INTERROMPU !Vous avez appuyé sur Ctrl+C

En cas d'erreur, GoLogo précise aussi la procédure fautive : … N'AIME PAS 42 DANS CARRE. Cela aide à localiser le problème.