> Při běhu programu se jméno proměnné vždy nahradí adresou, na které je uložena
> hodnota proměnné
Ve skutečnosti se adresou nahradí jméno každého slova, nikoliv jen proměnné. Navíc to není adresa, na níž je hodnota uložena, ale adresa, na níž je, zjednodušeně řečeno, uloženo slovo, které tuto hodnotu obsahuje ve svém těle.
Ještě k minulému dílu:
> Uvnitř smyčky je možné používat speciální klíčové slovo i,
> pomocí kterého...
Ve Forthu žádná speciální klíčová slova nejsou, což je právě jedno z jeho základních paradigmat. Slovo i je navíc ukázkou jednoho z nejtriviálnějších slov jazyka, které může být implementováno např. takto:
Ad adresa: toto vsak plati pouze pro Forthy, ktere provadeji klasicke neprime provadeni, tj. program se ve skutecnosti sklada pouze z neprimych adres. Moderni Forthy (moderni ve smyslu casovem, ne nutne kvalitativnim :-) vetsinou primo provadi preklad a tak jedina slova, ke kterym je zapotrebi znat adresu, je prave promenna.
Ad smycky: nespravne jsem se vyjadril; v te vete jsem pouze chtel vyjadrit, ze se opravdu jedna o "specialni" slovo, nikoli o pouhe oznaceni indexu (na prvni pohled to tak vypada). To "klicove" samozrejme neplati, dekuji za upozorneni.
Máte pravdu, že spousta dnešních F. kompiluje přímo do strojového kódu, nicméně i tak se kromě primitiv, jejichž sémantika se zakompiluje pomocí několika málo instrukcí, musí často kompilovat i adresy slov, třeba za instrukcí CALL. Nešlo mi o to, že by tvrzení nebylo správné, ale o to, že to svádí k domněnce, že proměnná má jakoby nějaké zvláštní postavení oproti jiným slovům. Navíc, většina kompilátorů jakýchkoliv jazyků kompiluje adresu proměnné.
Abych jen nešťoural, Váš seriál se mi líbí a jsem rád, že se tu něco o tomto zajímavém jazyku objevilo:)
Zatim jsem neprisel na to jak z toho ven, ale od urciteho cisla vyse pocita faktorial chybne.
4 factorial cr . cr
12
ok
coz neni zrovna spravne cislo.
Pri kompilaci faktorialu poprve mi "rve" v okamziku rekurzivniho volani factorial, ze toto slovo nezna. To jsem vyresil nadefinovanim prazdneho slova faktorial a opetovnym prekladem...
Pokud factorial prelozim vicekrat, udela chybu pozdeji. Po dvojim (vlastne uz trojim) prelozeni dela chybu az u 6ky. Takhle ta rekurze fungovat nebude. Jak to resit korektne?
Pouzivam Gforth.
U nekterych dialektu Forthu (odpovidajicch napriklad ANS norme) se musi uvnitr slova, ktere se ma rekurzivne opakovat, misto jmena tohoto slova pouzit slovo "recursion". Je to tedy neco, jako nahrada za forward deklaraci u Pascalu.
Standardne treba na rekurziu pouzit slovo RECURSE. Ale su vynimky: Napriklad pri pouziti kompilatoru 4tH funguje definicia faktorialu presne tak ako ju popisuje pan Tisnovsky.
Tu je priklad ako to funguje standardne:
( Rekurzia vo FORTHe )
: fac
dup 0=
if
drop 1
else
\ dup 1- fac * \ toto funguje s kompilatorom 4tH
dup 1- recurse * \ standardny pristup: RECURSE
then
;
11 0 do
i . ." ! = " i fac . cr
loop
Funkce pro vypocet nejvetsiho spolecneho delitele se vetsinou nazyva GCD
(greatest common divisor) a ne LCD. Take by byl vhodne doplnit, ze „pomocí
známého postupu vypočítá největší společný dělitel“ je velmi
nestastne napsano – jedna se o Eukliduv algoritmus.