Dans Cargo Shuffle, tu as découvert la pile de données de Factor et les mots qui la réorganisent. Cet exercice va plus loin : tu vas définir des mots qui calculent à partir de leurs entrées au lieu de simplement les déplacer.
Un ! commence un commentaire de ligne : Factor ignore tout, depuis ! jusqu'à la fin de la ligne. Les exemples ci-dessous utilisent ! à la fois pour annoter ce que fait le code et pour montrer ce qu'il afficherait.
Un mot est le terme que Factor emploie pour une fonction. Appeler un mot dépile des valeurs du sommet de la pile et en empile d'autres en retour.
. dépile la valeur au sommet et l'affiche ; les mots d'arithmétique entière +, - et * dépilent deux nombres et empilent le résultat :
2 3 + . ! prints 5
8 3 - . ! prints 5 (8 - 3, not 3 - 8)
2 3 * . ! prints 6
Un mot proche, .s, affiche toute la pile de données sans rien consommer, ce qui est bien pratique dans le listener (l'invite interactive de Factor, où on tape du code et où on voit les résultats) pour observer ce qu'un extrait de code laisse derrière lui. C'est pourquoi les exemples suivants se terminent parfois par .s plutôt que par . : ils laissent plus d'une valeur sur la pile, et .s les affiche toutes.
Les mots d'arithmétique vivent dans le vocabulaire math, donc un fichier qui les utilise doit faire figurer math dans sa ligne USING:.
Chaque mot est documenté par un effet de pile de la forme
( inputs -- outputs ). C'est le contrat du mot : il dépile les
entrées au sommet de la pile et laisse les sorties à leur place.
Les noms à l'intérieur ne servent qu'à faciliter la lecture. Factor ne
les utilise pas : il ne suit que l'ordre dans lequel les valeurs
sont empilées.
! + is specified as ( x y -- sum )
! . is specified as ( x -- )
Le sommet de la pile correspond à l'entrée de droite. Ainsi, dans 8 3 -, 3 est au sommet, l'effet de pile est ( x y -- difference ), et le résultat est 8 - 3.
Un ? en fin de sortie est la convention pour « un booléen », mais l'exercice lasagna n'utilise que des nombres.
Un mot de réorganisation vu dans Cargo Shuffle revient ci-dessous : swap
( x y -- y x ), qui échange les deux valeurs du sommet lorsqu'elles ne sont pas dans le bon ordre pour le mot suivant.
: commence une définition de mot, l'effet de pile vient ensuite, puis le corps, et ; la termine.
: square ( x -- x^2 ) dup * ;
4 square . ! => 16
Le compilateur de Factor vérifie que le corps correspond bien à l'effet de pile déclaré : un mot qui annonce ( x -- y ) mais laisse zéro ou deux valeurs sur la pile ne compilera pas.
CONSTANT: définit un nom pour une valeur fixe. Une constante est elle-même un mot, et l'appeler empile la valeur sur la pile :
CONSTANT: pi 3
pi pi * . ! => 9
CONSTANT: fait partie de la syntaxe de base et n'a pas besoin d'une ligne USING:. Place les constantes en haut du fichier, avant tout mot qui les utilise.
Le corps d'un mot peut appeler n'importe quel mot déjà dans la portée, y compris ceux que tu as définis plus haut dans le même fichier :
: double ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;
5 quadruple . ! => 20
C'est ainsi que la dernière tâche de l'exercice en réutilise une précédente.
Les mots et les constantes utilisent tous deux le lowercase-kebab-case : des lettres minuscules reliées par des traits d'union (par exemple expected-bake-time ou preparation-time).
Dans cet exercice, tu vas écrire du code pour t'aider à cuisiner une excellente lasagne tirée de ton livre de cuisine préféré.
Tu as quatre tâches, toutes liées au temps passé à cuisiner la lasagne.
Définis la constante expected-bake-time, qui doit renvoyer le nombre de minutes que la lasagne doit passer au four.
D'après le livre de cuisine, la lasagne doit cuire au four pendant 40 minutes au total.
expected-bake-time .
! => 40
Définis le mot preparation-time. Il retire de la pile le nombre de couches que tu as ajoutées à la lasagne et laisse sur la pile le nombre de minutes que tu as passées à la préparer, en supposant que chaque couche prend 2 minutes à préparer.
4 preparation-time .
! => 8
Définis le mot remaining-time. Il prend le nombre de minutes que la lasagne a déjà passées au four et laisse sur la pile le nombre de minutes qu'il lui reste à y passer.
25 remaining-time .
! => 15
Définis le mot total-working-time. Il prend deux arguments sur la pile, d'abord le nombre de couches de la lasagne, puis le nombre de minutes que la lasagne a déjà passées au four, et laisse sur la pile le temps total de cuisson jusqu'à présent : le temps de préparation plus le temps déjà passé au four.
3 20 total-working-time .
! => 26
Inscris-toi sur Exercism pour apprendre et maîtriser Factor avec 47 concepts163 exercices, et un vrai mentorat humain, le tout gratuitement.