
Si vous avez bien lu le passage sur K2000, vous avez du voir cette construction étrange:
1000
begin
1 - dup 0=
until
dropCette 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:
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.
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:
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...