(akorát jako první je ve vektoru uložen počet jeho prvků (adresa_vektoru+0) a až pak obsah nultého (adresa_vektoru+4) prvku vektoru, počet prvků tak teoreticky pomocí slova [] načíst nejde).
Proč taky, když tuto informaci nám zanechají na zásobníku přímo slova vytvořená pomocí
VECTORu, tedy jednotlivé vektory.
DOES> v jeho definici sice nedělá nic (v daném případě je tam napsáno úplně zbytečně), ale každé slovo vytvořené pomocí
CREATE jednu věc přeci jen dělá vždycky: zanechá na zásobníku svou PFA. Vytvoříme-li si např. nový 3-složkový vektor
vec := (10, 20, 30), tj.
30 20 10 3 VECTOR vec
pak použití slova
vec způsobí, že na zásobníku je adresa jeho prvního datového členu, tj. počtu jeho složek, čili pomocí
vec @ získáme počet jeho složek. Jeho průměr pak získáme pomocí
vec AVERAGE, definovaného např. následovně:
: AVERAGE ( addr -- n )
DUP @ 0 ROT ( počet-složek 0 addr )
DUP @ ( počet-složek 0 addr počet-složek )
0 DO ( počet-složek mezisoučet-složek addr )
CELL + DUP @ ( počet-složek mezisoučet-složek addr-přičítané-složky přičítaná-složka )
ROT + SWAP ( počet-složek mezisoučet-složek addr-přičítané-složky )
LOOP
DROP SWAP / ; ( arit.průměr-složek )
Nejprve si na prvním řádku těla
AVERAGE uschováme počet složek vektoru a připravíme si místo pro mezisoučet inicialisovaný nulou. Následující smyčka
DO...LOOP se provede
počet-složek-krát, k adrese
addr přičítáme vždy jednu buňku (
CELL) a poskakujeme tak postupně po jednotlivých složkách vektoru, přičítajíce jejich obsah k mezisoučtu (kde byla na začátku nula). Po skončení smyčky zahodíme
addr-přičítané-složky, kterou už k ničemu nepotřebujeme, prohodíme operandy tak, jak je očekává dělení, a vydělíme (
/).
Pozn.:
CELL je konstanta určující, kolik bajtů tvoří jednu buňku. V zájmu přenositelnosti a přehlednosti se doporučuje používat ji místo číselné hodnoty. V definici slova
[] by taktéž bylo vhodné ji použít místo čísla 4:
: [] ( n addr1 -- addr2 )
CELL +
SWAP
CELLS + ;
(slovo
CELLS násobí velikostí buňky)