neni COUNT definovano jako : COUNT ( ^addr --- ^addr+1 n ) ... ; ?
takze vrati delku retezce a adresu s vlastnim zacatkem retezce (coz je vlastne adresa o jedno vetsi). Nemate teda nikde toto slovo definovany,ani z textu nelze definice moc poznat, pouze v ukazkovem prikladu COPY$ je po zavolani count ( druhy prvni prvni ) --- ( druhy prvni prvni delka ), coz je dle me spatne a melo by byt ... --- ( druhy prvni prvni+1 delka )..jinak by vlastne bylo volani DUP a nasledne DROP zbytecne.
Pravdopodobne jste pri definovani COUNT mel na mysli nevyhodu zustatku adresy retezce na zasobniku..
--bim
Názory k článku
Programovací jazyk Forth a zásobníkové procesory (8)
tisnik (neregistrovaný)
1. 3. 2005 20:39
Nový
Re: count
celé vlákno
Tou nevyhodou COUNT jsem mel na mysli prave nechani adresy retezce na zasobniku. Samozrejme to neni vzdy nevyhoda, jenom IMHO nazev toho slova neodpovida presne jeho cinnosti, resp. ponekud se to vymyka beznemu chapani slov ve Forthu (ty ve vetsine pripadu neco ze zasobniku odeberou a ulozi na nej vysledek). U COUNT se nekdy stava, ze se na tu adresu zapomene, coz se samozrejme v delsim programu spatne hleda (ja vim, kazde slovo by se melo ihned po vytvoreni otestovat a potom na nej postvat .S, ale jsme jenom lidi :-)
Marek Brunda (neregistrovaný)
1. 3. 2005 20:59
Nový
Re: count
celé vlákno
> ... ty ve vetsine pripadu neco ze zasobniku odeberou a ulozi na nej vysledek
A to je prave presne to, co dela COUNT. Odebere ze zasobniku adresu pocitaneho retezce a ulozi na nej adresu a pocet znaku nepocitaneho retezce:
( addr -- addr+1 u )
: count dup c@ >r 1+ r> ;
A to je prave presne to, co dela COUNT. Odebere ze zasobniku adresu pocitaneho retezce a ulozi na nej adresu a pocet znaku nepocitaneho retezce:
( addr -- addr+1 u )
: count dup c@ >r 1+ r> ;
tisnik (neregistrovaný)
2. 3. 2005 8:06
Nový
Re: count
celé vlákno
Ano, s tim naprosto souhlasim, ale proc se to potom jmenuje COUNT? To jmeno naznacuje jinou funkci, nez to ve skutecnosti provadi, coz mi trosku vadi (a zacatecnikum jeste vic).
Marek Brunda (neregistrovaný)
1. 3. 2005 15:10
Nový
COUNT
celé vlákno
>... slovo COUNT, které je součástí ANS-Forthu. Toto slovo má jedinou nevýhodu -
>ponechává na zásobníku operandů délku řetězce.
Prominte, ale tuto vetu jsem vubec nepochopil:) Slovo COUNT nema zadnou nevyhodu, protoze je urceno prave k tomu, aby vam z adresy pocitaneho retezce vratilo dvojici ( adresa pocet_znaku ). Napr:
( addr ) COUNT TYPE
Vami definovane slovo LENGTH$ je ekvivalentni prostemu C@:
: LENGTH$ C@ ;
Jinymi slovy, pokud nepotrebujete adresu, nepisete COUNT SWAP DROP, ale proste napisete C@
>ponechává na zásobníku operandů délku řetězce.
Prominte, ale tuto vetu jsem vubec nepochopil:) Slovo COUNT nema zadnou nevyhodu, protoze je urceno prave k tomu, aby vam z adresy pocitaneho retezce vratilo dvojici ( adresa pocet_znaku ). Napr:
( addr ) COUNT TYPE
Vami definovane slovo LENGTH$ je ekvivalentni prostemu C@:
: LENGTH$ C@ ;
Jinymi slovy, pokud nepotrebujete adresu, nepisete COUNT SWAP DROP, ale proste napisete C@
Marek Brunda (neregistrovaný)
1. 3. 2005 15:39
Nový
PLACE
celé vlákno
: place over over >r >r char+ swap chars cmove r> r> c! ;
Proc tak slozite? Na prvni pohled je videt, ze:
OVER OVER >R >R R> R> C! je to same jako OVER OVER C!
Takze:
: place over over c! char+ swap chars cmove ;
Neni to jednodussi?:)
Proc tak slozite? Na prvni pohled je videt, ze:
OVER OVER >R >R R> R> C! je to same jako OVER OVER C!
Takze:
: place over over c! char+ swap chars cmove ;
Neni to jednodussi?:)
tisnik (neregistrovaný)
1. 3. 2005 20:56
Nový
Re: PLACE
celé vláknoTady se priznam k jedne veci: kdyz jsem hledal, jak je ve skutecnosti implementovane slovo PLACE, narazil jsem na vyse zmineny priklad (je to tak tusim uvedeno v "kForthu" nebo v "4th").
Taky me to bylo hned divne, co tim autor myslel (tim zbytecnym ulozenim a naslednym vybranim hodnot pres zasobnik navratovych adres), spis to vypadalo tak, ze mezi ulozenim hodnot a jejich vyberem se mely provadet mimo CMOVE dalsi operace, ktere se nakonec neprovadely. No nakonec jsem pro jistotu nechal puvodni zneni toho slova s tim, ze to asi nejaky hlubsi vyznam ma :-(
Emil Jeřábek (neregistrovaný)
1. 3. 2005 15:54
Nový
uvedení na pravou míru
celé vlákno
"Standardní programovací jazyk Pascal" žádné řetězce s délkou omezenou 255 nemá. Původní standard (ISO 7185:1983) zná pouze řetězce s konstantní délkou "packed array [1..N] of char". Nový standard (ISO 10206:1991) má předdefinovaný typ "string (N)", který se syntakticky chová jako typové schéma. V obou případech je potenciální délka řetězce omezená pouze rozsahem typu integer. Je snad zbytečné dodávat, že "způsob úschovy řetězce v operační paměti" standard nijak neřeší, to je věc implementace.
tisnik (neregistrovaný)
1. 3. 2005 20:46
Nový
Re: uvedení na pravou míru
celé vlákno
Mate pravdu, misto standardniho Pascalu (tj. Pascalu dle standardu) jsem myslel Turbo prekladace od Borlandu. Ja vim, ze se zrovna tyto prekladace od standardu odlisuji (pojeti souboru atd.), ale v tomto pripade mi nedoslo, ze standardni Pascal opravdu datovy typ retezce neznal (pouze konstantni retezec).
Mimochodem, kdyz uz jsme u toho Pascalu: Nikdy mi nebylo jasne, co to vlastne je write a writeln. Procedury to asi nejsou ze? Spis se mi to vzdycky vymykalo ze vsech Pascalovskych gramatik. (ptam se jenom z toho duvodu, ze se mi nechce cist tu ISO normu, urcite to tam nekde bude zminene).
Mimochodem, kdyz uz jsme u toho Pascalu: Nikdy mi nebylo jasne, co to vlastne je write a writeln. Procedury to asi nejsou ze? Spis se mi to vzdycky vymykalo ze vsech Pascalovskych gramatik. (ptam se jenom z toho duvodu, ze se mi nechce cist tu ISO normu, urcite to tam nekde bude zminene).
Emil Jeřábek (neregistrovaný)
2. 3. 2005 14:11
Nový
Re: uvedení na pravou míru
celé vlákno
Write a writeln jsou procedury. Sice ponekud netypicke (maji specialni syntax pro seznam argumentu), plati pro ne podobna omezeni jako pro jine preddefinovane procedury a funkce (nelze je predat jako argument jine funkci, a nelze je reexportovat z modulu), ale presto procedury. To mj. znamena, ze jejich jmena nejsou klicova slova, ale identifikatory, lze je tudiz zastinit jinou deklaraci (napr. "var write: integer;").
tisnik (neregistrovaný)
3. 3. 2005 12:47
Nový
Re: uvedení na pravou míru
celé vlákno
Aha, takze to je takova Pascalovska perverze :-) Normalni uzivatel nema moznost vytvaret procedury s promennym poctem parametru, ale tvurce Pascalu tuto moznost evidentne mel (nic proti, touto vlastnosti trpi spousta jazyku, akorat se Pascal z me neznameho duvodu uci na skolach). Jak vlastne vypada hlavicka takoveto procedury?

