Možná by nebylo od věci začít i ty nejjednodušší slova/programy hned od počátku opatřovat typicky forthovskými komentáři, ať je vidět, co které slovo očekává na zásobníku a co na něj pro změnu vrací. (Stupidní příklady: swap ( n1 n2 -- n2 n1) nebo @ ( a -- (a) ).)
Máte pravdu, od příštího dílu, ve kterém se již budou probírat složitější slova, budu "zásobníkové diagramy" (na lepší překlad jsem prozatím nepřišel) používat.
Pochopil jsem spravne, ze na konci tela smycky musi byt na zasobniku totez, co na jeho zacatku, aby loop vedel k cemu pricitat a kam az jit? Jak pak dostat ven (do programu, nikoliv na monitor) hodnoty? zvlast, kdyz bude vice nez jedna (ktera by sla dostat ven rotaci prez tri prvky)?
Nevím, jestli chápu úplně správně váš dotaz, ale cyklus pro svou práci využívá zásobník návratových adres, tzn. že s uživatelským zásobníkem můžete během vykonávání cyklu pracovat naprosto nezávisle.
Pro počítaný cyklus je počitadlo uloženo na zásobníku návratových adres (return stack), takže svoje výpočty na zásobníku operandů nemusíte "vyrovnávat". Pomocí slova i (pouze íčko) je však možné počitadlo uložit na zásobník operandů a tam s ním pracovat, například vytisknout jeho hodnotu.
PostScript je opravdu trosicku upraveny Forth. Uz jsem o tom psal v jednom z prvnich dilu. Upravy spocivaji hlavne v odlisnostech v datovych typech, jinym principem tvorby slov a samozrejme mnozstvim hotovych slov (kresleni usecek, bitmap, prikaz show atd.)
Duvod, proc je PostScript odvozen od Forthu je nasledujici: jednoduchy a rychly interpreter, snadna rozsiritelnost, tvorba maker (viz vystupy z AutoCADu), snadna implementace v HW tiskaren.
Mě by zajímalo, jak by to bylo u více vnořených cyklů třeba do loop do sebe. Jak se třeba dostanu do obou řídících proměnných obbou cyklů, když mám jenom jedno slovo i.
Tady bych nijak nepremyslel, budme radi, ze aspon muzeme dostat iterator aktualni smycky do zasobniku. Pokud nebudeme plnit zasobnik, je to bez problemu. Pokud ano, budeme muset porad swapovat nebo rotovat :-( , zalezi na zpusobu plneni zasobniku. Par prikladu:
: cykl 5 0 do cr i 3 0 do dup . loop drop loop cr ; cykl
( tato veticka vypise pet radku, na kterych se znazorni trikrat po sobe se opakujici obsah iteratoru, je zde take videt, ze to budeme po sobe uklizet )
: cykl 6 1 do cr i i i + i do dup 10 * i + . loop drop loop cr ; cykl
( Po zadani dostaneme na vystupu trojuhelnik z dvojcifernych cisel. Prvni cifra je vnejsi iterator a druha je vnitrni. )
: cykl 4 1 do i 5 0 do dup 10 * i + swap loop drop loop ; cykl
( nyni mame v zasobniku 15 hodnot, po iteratoru ani stopy )
: cykl 4 1 do cr 5 0 do . loop loop cr ; cykl
( pro prehlednost si muzeme obsah zasobniku prohlednout pomoci stejneho cyklu )
... radost pracovat ve Forthu :-)
Ne, proc? Jde mi jenom o to, abych to po sobe uklidil, proto jsem napsal: "... po iteratoru ani stopy." Kdyz je toho vic, tak to s tim uklidem neni sranda :-(
MNO... PO DELSI PRAXI S FORTHEM - JESTE JSEM NEPOUZIL VNORENY CYKLUS V JEDNOM SLOVE. A TO DELAM I S GRAFIKOU...
KDYZ PISU VE FORTHU, DBAM NA TO, ABY SLO POCHOPIT VYZNAM KAZDEHO SLOVA. VIDEL SNAD NEKDO DOKUMENTACI K FORTHOVSKEMU RESENI? MYSLITE ZE ANO? NENE, TO JE DOKUMENTACE PROBLEMATIKY...
Pokud máte více vnořených cyklů, lze používat slova "i" a "j", některé implementace Forthu mají zabudované i "k". Mnohem lepší je však vnitřní smyčky vytvořit jako samostatná slova, vyhnete se tak problémům při přístupu k nižším úrovním zásobníku (někdy to je samozřejmě nemožné nebo neefektivní, záleží na situaci).
Pan docent je asi tolerantní pán, můj překladač CMP Forth je bohužel jiného názoru (píšu v něm krásně mrňavé programy pod MS-DOS pro svého miláčka HP200LX)
Taky jsem prosel kurzem pana Honzika (s odstupem casu se mi zdaji cim dal vic zajimave a prinosne), ale ono jde o to, ze nektere jazyky ty chyby castecne odchytnou pri behu a u nekterych jazyku se na ne prijde az pri provozovani programu. Forth patri, spolu s C-ckem mezi jazyky, ktere davaji programatorum naprostou volnost, ale take zodpovednost za to, co napisou.
Me se ze vsech jeho kurzu zachovalo v pameti jen uslovi "defenzivni programovani" a casto se jim ridim - jinak bych rekl, ze jsem jeho vlivem (bohuzel?) pomerne nedotcen.
To, ze se chyby o jednicku nepocitaji bylo tusim platne jen u zkousek - pokud by algoritmus ujel o jeden krok, tak se to tolerovalo.
BTW: taky jste meli na Hruskovych prednaskach o RISCu "hodne" a "zle" bryle? ;-)
Z prednasek pana Hrusky si krome jeho skveleho vykladu Lambda kalkulu (vysvetlovani na mimozemstanech) pamatuji hlavne vetu: "Syntaxi C++ povazuji za spatny vtip".
O RISCu ani nevim, ze by vypravel - bud to zrovna ten semestr neprobiral, nebo jsem cirou nahodou :-) na te prednasce nebyl.
Obavam se (podle prikladu, ze 10 10 do loop nema zkoncit), ze ta prvni 10 neni pocet opakovani ale cislo, na kterem ma do loop zkoncit. To by vysvetlovalo ze 10 1 do loop probehne 9x, (coz je chyba +-1) ale pak by 10 5 do loop probehl 5x coz uz by asi ani pan Honzik netoleroval.