Si vous avez bien lu le passage sur K2000, vous avez du voir cette construction étrange: 1000 begin 1 - dup 0= until drop Cette construction étrange compte de 1000 à 0... sans jamais nommer de variable locale!
En réalité, nous utilisons des variables locales allouées sur la pile.
| Code |
Action |
Etat de la pile après |
1000 |
Pousse la valeur '1000' en haut de la pile |
1000 |
begin |
Démarre une boucle |
1000 |
1 |
Pousse la valeur '1' sur le haut de la pile |
1000,1 |
- |
Soustrait la valeur en haut de la pile à la valeur immédiatement en dessous. A la première itération, ce code soustrait '1' à '1000'. Les deux opérandes sont retirés de la pile et le résultat placé en haut de la pile. |
999 |
dup |
DUPlique la valeur en haut de la pile. Elle y est donc 2 fois... |
999,999 |
0= |
Teste la valeur en haut de la pile pour égalité à 0, dépile l'opérande, met sur la pile la valeur 'vrai' si l'égalité est réalisée et 'faux' sinon. |
999,faux |
until |
Continue la boucle tant que faux est en haut de la pile |
0 (voir note) |
drop |
Elimine la valeur en haut de la pile |
|
Note: En sortie de boucle, la valeur testée est nécessairement 0. A la première itération, la pile est à 999 ...
Une pile est un espace de stockage (en théorie) illimité, que l'on manipule avec 3 opérations:
- push pousse une valeur arbitraire en haut de la pile
- drop jette la valeur en haut de la pile
- swap intervertit la valeur au sommet de la pile et celle juste en dessous



Et alors?
Imaginons que les mots puissent modifier cette pile: par exemple, prendre deux valeurs en haut de la pile, et en placer deux autres toujours en haut. Ça ne vous dit rien? Appellons plutôt les deux mots dépilés des 'paramètres' et ceux empilés des 'valeurs de retour'. Vous l'aurez compris, la pile permet de faire des fonctions auxquelles on peut passer des paramètres.
Une convention
Vous avez surement vu le commentaire à coté du nom des fonctions: : main ( -- ). Ce commentaire est bien entendu conventionnel: il veut dire que la fonction ne dépile pas de mot ni n'en empile. Par exemple, le fichier lib/tty-rs232.fs, qui décrit le port série, contient 4 fonctions: : tty-init ( -- ) 0b00100000 TXSTA c! 64 SPBRG c! TRISC 6 bit-clr ; : emit ( c -- ) begin TXIF bit-set? until TXREG c! ; : key ( -- c ) begin RCIF bit-set? until RCREG c@ ; : key? ( -- f ) RCIF bit-set? ; En pratique, on dipose d'opérations arithmétiques qui peuvent agir sur cette pile:
- + prend les deux valeurs en haut de la pile, les additionne et met le résultat au sommet de la pile
- / prend les deux valeurs en haut de la pile, et divise la valeur sous le sommet par la valeur au sommet et place le résultat au sommet
Ceux qui connaissent la notation polonaise inversée (mais si, les calculatrices de chez HP...) ne seront pas perdus, les autres auront un peu plus de mal...