18.1.3.2.1. Zásobník

Modul zásobník služí pro práci se zásobníkem dlouhých čísel. Je použit jako zásobník čísel naší kalkulačky. Bylo by vhodné vydělit tento modul do samostatného souboru, ale pro jednoduchost jej nechávám zde.

\ === Zásobník ===
.( Zásobník) cr

Datová struktura zásobníku se skládá ze dvou objektů. Pole dlouhých čísel

create stack 20 cells allot

A ukazatele do tohoto pole

variable stackp

Ukazatel hned inicializujem. Necháme ho ukazovat na dno našeho zásobníku

stack stackp !

Uložení čísla na zásobník.

: >stack ( n. → ) ( → n. )
        stackp @ 2!             \ ulož n. na zásbník
        stackp @ 4 + stackp ! ; \ posuň ukazatel dopředu

Vyjmutí čísla ze zásobníku

: stack> ( → n. ) ( n. → )
        stackp @ 4 - stackp !   \ vrať ukazatel zpět
        stackp @ 2@ ;           \ vyjmi n. ze zásobníku

Právě nadefinovaná slova si hned otestujeme.

TESTING >stack stack>
{ 34567. >stack -> }
{ stack> -> 34567. }
{ 134167. 2. >stack >stack -> }
{ stack> stack> -> 134167. 2. }

Protože budeme potřebovat vybírat a ukládat čísla na zásobník v párech, nedefinujeme si pro to slova 2>stack a 2stack>

: 2>stack ( n1. n2. → ) ( → n1. n2. )
        >stack >stack ;
: 2stack> ( → n1. n2. ) ( n1. n2. → )
        stack> stack> ;

A otestujeme si jestli jsou v pořádku

TESTING 2>stack 2stack>
{ 34567. 3. 2>stack -> }
{ 2stack> -> 34567. 3.}

Nyní již můžeme přistoupit k operacím nad naším zásobníkem. Začneme sčítáním.

: stack+ ( → ) ( n1. n2. → n. )
        2stack> D+ >stack;

A opět si je hned odzkoušíme

TESTING stack+
{ 1. 56. 2>stack stack+ stack> -> 57. }