Parcours
/
Factor
Factor
/
Exercices
/
Mélange de cargaison
Mélange de cargaison

Mélange de cargaison

Exercice d'apprentissage

Introduction

Bienvenue dans Factor ! Factor est un langage concaténatif : au lieu d'appeler des fonctions comme square(add(2, 3)), tu écris une suite de mots de gauche à droite, 2 3 + square, qui se transmettent des valeurs par l'intermédiaire d'une pile de données partagée. Imagine une pile de caisses de fret sur un quai, la plus récente posée sur le dessus.

Commentaires

Un ! commence un commentaire de ligne : Factor ignore tout, depuis le ! jusqu'à la fin de la ligne. Les exemples ci-dessous utilisent ! pour indiquer ce que fait le code.

La pile de données

Écrire un littéral le place au sommet de la pile. Le code se lit de gauche à droite.

1 2 3    ! stack (bottom → top): 1 2 3

Chaque mot lit ses entrées au sommet de la pile et y écrit ses sorties. . dépile la valeur du sommet et l'affiche ; .s affiche la pile entière sans rien consommer, ce qui est bien pratique pour voir ce qu'un bout de code a laissé derrière lui.

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 du sommet de la pile et laisse les sorties à leur place. Les noms qui figurent à l'intérieur servent à la documentation pour les humains : la pile elle-même est positionnelle, pas nommée. Le sommet de la pile correspond au nom le plus à droite.

Définir un mot

: lance une définition de mot, vient ensuite l'effet de pile, puis le corps, et ; la termine. Le compilateur de Factor vérifie que le corps laisse bien ce que l'effet de pile déclare.

: restow ( a b -- b a ) swap ;

Mots de réorganisation

Ces mots du kernel réorganisent le sommet de la pile sans faire le moindre calcul : ils ne font que déplacer des caisses :

dup  ( x   -- x x   )    ! copy the top crate
drop ( x   --       )    ! remove the top crate
swap ( x y -- y x   )    ! flip the top two
over ( x y -- x y x )    ! copy the second crate onto the top
nip  ( x y -- y     )    ! remove the second crate
rot  ( x y z -- y z x )  ! roll the third crate up to the top

Pense à dup quand une caisse doit alimenter deux mots, à drop pour jeter une caisse, à swap quand les deux caisses du sommet sont dans le mauvais ordre, à over ou nip pour travailler avec la caisse du dessous, et à rot pour ramener au sommet une caisse enfouie.

La famille plus large (-rot, dupd, swapd, 2dup, …) suit la même idée ; tu rencontreras ces mots plus tard.

Comment les mots se composent

Les mots écrits à la suite s'exécutent de gauche à droite : chaque mot agit sur la pile laissée par le mot précédent. Voici ce que swap nip fait à la pile 1 2 (du bas vers le haut), mot par mot :

1 2     ! 1 2     the starting crates
swap    ! 2 1     swap flipped the top two
nip     ! 1       nip dropped the 2nd-from-top crate (the 2)

Et voici dup rot sur les mêmes caisses de départ, là encore mot par mot :

1 2     ! 1 2     the starting crates
dup     ! 1 2 2   dup copied the top crate
rot     ! 2 2 1   rot rolled the 3rd-from-top crate up to the top

Conventions de nommage

Les mots utilisent le lowercase-kebab-case : des lettres minuscules reliées par des traits d'union.

Tour: stack shuffling

Instructions

Tu es un matelot qui réarrime des caisses de marchandises sur le quai. Chaque tâche est un mot unique dont le corps n'utilise que des mots de réorganisation de la pile, sans aucune arithmétique.

1. Échange les deux caisses du haut

Définis le mot swap-crates. Il retire deux caisses de la pile et les repose dans l'ordre inverse.

1 2 swap-crates .s
! 2
! 1

2. Élimine la caisse renversée

Définis le mot clear-spill. Il retire trois caisses de la pile et laisse les deux du bas, en écartant celle du haut.

1 2 3 clear-spill .s
! 1
! 2

3. Garde une copie de la caisse du dessous

Définis le mot peek-under. Il retire deux caisses de la pile et les repose en plaçant par-dessus une copie de la caisse inférieure.

1 2 peek-under .s
! 1
! 2
! 1

4. Range le pont

Définis le mot tidy-deck. Il retire trois caisses de la pile, dans l'ordre x y z, et laisse derrière lui z z y : écarte la caisse du fond, puis place deux copies de la caisse du haut sous celle du milieu.

1 2 3 tidy-deck .s
! 3
! 3
! 2
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Factor Exercism

Prêt à commencer Mélange de cargaison ?

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