Le langage Logo
Introduction complète : données, variables, procédures, boucles, conditions, graphisme
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)
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 :
CLOS(défaut) : la tortue refuse de sortir et afficheLA TORTUE VA SORTIR.ENR(champ enroulé) : la tortue réapparaît du côté opposé, comme un jeu de serpent.FEN(fenêtre étendue) : l'espace de déplacement s'étend bien au-delà de ce que l'on voit à l'écran.
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 :
42,3.14,-7 - Les mots :
"BONJOUR,"ROUGE - Les listes :
[ A B C ],[ 1 2 3 ],[ [ 1 2 ] [ 3 4 ] ]
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...
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
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.
: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
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
~ (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.
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).
9. Contrôle du flux dans les procédures
Trois instructions permettent de quitter une procédure en cours d'exécution :
STOP: quitte la procédure courante (pour les commandes).RENDS valeur: quitte la procédure et retourne une valeur (pour les opérations).LOGO: arrêt total, remonte au REPL quelle que soit la profondeur de l'appel.
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
.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 :
| Message | Cause |
|---|---|
COMMENT FAIRE MACHIN | La commande MACHIN n'existe pas (faute de frappe ?) |
PAS ASSEZ DE DONNEES POUR AV | Un argument manque à AV |
QUE FAIRE DE 42 | Une opération a retourné 42 mais personne ne l'utilise |
… N'AIME PAS … | Le type de l'argument est incorrect |
LA TORTUE VA SORTIR | Déplacement hors du champ en mode CLOS |
PAS DE CHOSE DONNEE A X | La 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.