Parcours
/
Factor
Factor
/
Exercices
/
Les lasagnes succulentes de Leah
Les lasagnes succulentes de Leah

Les lasagnes succulentes de Leah

Exercice d'apprentissage

Introduction

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.

Commentaires

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.

Mots

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:.

Effets de pile

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.

Définir un mot

: 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.

Constantes

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.

Appeler un mot depuis un autre

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.

Conventions de nommage

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).

Instructions

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.

1. Stocke le temps de cuisson attendu dans une constante

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

2. Calcule le temps de préparation en minutes

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

3. Calcule le temps de cuisson restant en minutes

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

4. Calcule le temps de travail total en minutes

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
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Factor Exercism

Prêt à commencer Les lasagnes succulentes de Leah ?

Inscris-toi sur Exercism pour apprendre et maîtriser Factor avec 47 concepts163 exercices, et un vrai mentorat humain, le tout gratuitement.