Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Názory k článku
Squeak: návrat do budoucnosti (3)

deda.jabko
deda.jabko (neregistrovaný)
24. 2. 2004 0:41 Nový

LISPu natruc

celé vlákno

pripada mne, ze co do syntaxe se autori smalltalku docela inspirovali u lispu, ale natruc zmenili prefixovou notaci na postfixovo-infixove neco. mozna to bylo proto, aby se zbavili zavorkoveho pekla, ale pritom tu vzniklo dalsi peklo ve kterem si programator musi uvedomovat, v jakem poradi se zpravy zasilaji

Vít Profant
Vít Profant (neregistrovaný)
24. 2. 2004 9:07 Nový

Re: LISPu natruc

celé vlákno

No, já nevím jak komu, ale mně ta syntaxe přidadá celkem čitelná. Naproti tomu, když jsem se pokoušel hacknout jistý e-lispový balík Emacsu, se zlou jsem se potázal...

ondrej
ondrej (neregistrovaný)
24. 2. 2004 11:02 Nový

Re: LISPu natruc

celé vlákno

Ne, pokud vim tak se zpravy jednoduse posilaji podle poradi zapisu. Nexistuji tu treba ruzne priority operatoru. Proste to cti zleva doprava. Pripada mi to mnohem citelnejsi nez Lisp, kde se zavorka pouziva na vsechno. Smalltalk ma ruzne znaky pro ruzne ucely.

Pavel Křivánek
Pavel Křivánek (neregistrovaný)
24. 2. 2004 12:15 Nový

Re: LISPu natruc

celé vlákno

Zprávy se čtou sice zleva doprava, ale nesmíte zapomínat na to, že se nejdříve vyhodnocují unární zprávy, poté binární a nakonec slovní.

Karel Zak
Karel Zak (neregistrovaný)
24. 2. 2004 9:55 Nový

Zpravy

celé vlákno

Moc nerozumim tomu >>"poslana zprava #to:do:"

Vladimir Kadlec
Vladimir Kadlec (neregistrovaný)
24. 2. 2004 10:43 Nový

Re: Zpravy

celé vlákno

"to:do:" je opravdu jedna zprava (lze si predstavit jako metodu, ktera ma dva parametry). To, zda je "do:" pri "1 to: 10 do: ..." zprava pro 10 nebo soucast zpravy pro 1 se rozhoduje podle urcitych pravidel, ktera si tedka nepamatuju ;-) (asociativita, ...). Ale v tomto pripade to je jednoznacne, protoze 10 (SmallInteger) nema zpravu (metodu) "do:".

P.S. Do odkazu pod clankem bych mozna doplnil:
http://smalltalk.cincom.com/
ktery je pro nekomercni ucely take zdarma.

Zbyněk Křivka
Zbyněk Křivka (neregistrovaný)
24. 2. 2004 10:56 Nový

Re: Zpravy

celé vlákno

1. Hodnoty parametrů se od jmén selektorů ("to" & "do") odděleny právě těmi dvojtečkami. Tedy např.:

objektik posliJeden: param1 aDruhejParametr: param2.

je příklad jedné zprávy s dvěma parametry a jmenuje se "posliJeden:aDruhejParametr:".

2. Co se týče druhého dotazu, tak zpráva "to:do:" je implementována pouze ve třídě Number. Pokud bys chtěl provádět cyklus typu "foreach" pro soubor nějakých objektů, tak k tomu se používají takzvané kolekce (abstraktní třída Collection a její potomci) a jejich metoda "do:" (např.
#(jablko hruska svestka) do: [:ovoce | ovoce snist ].
).

Jiri Svoboda
Jiri Svoboda (neregistrovaný)
24. 2. 2004 11:07 Nový

Kam mam psat ten kod?

celé vlákno

Uz si pripadam jako blbec. :-)
Minuly tyden jsem si stahnul a zprovoznil Squeak, ale pokud chci napsat nejaky svuj kod, tak vubec netusim, kam ho napsat. Sice jsem se dostal do nejakych editoru, neco tam i napsal, ale stejne jsem neprisel na to, jak to spustit (zminka "oznacit a spustit" mi prijde komicka - oznacit umim, ale co dal?).
Taky nevim, jak neco zastavit. Spustil jsem nejakyho tusim Beethovena a on hral a hral, pri dalsim klepnuti se logicky spustil druhy a hrali pres sebe. No, musel jsem quitnout. :-)
Cekal jsem, ze se to treba dozvim v dnesnim clanku, ale zatim ne, takze se ptam. Predem diky za odpoved.

Pavel Křivánek
Pavel Křivánek (neregistrovaný)
24. 2. 2004 12:28 Nový

Re: Kam mam psat ten kod?

celé vlákno

K psaní jednoúčelových prográmků se nejvíce hodí Workspace (kliknutí na plochu - open - workspace). Kód určený k vykonání se označí, stiskne nad ním pravé či prostřední tlačítko myši (dle nastavení v preferences), čímž se rozbalí kontextové menu, kde máte možnost zvolit
do it - provedení kódu
print it - provedení kódu a vypsání výsledku (za označený kód)
atd.
K ukončení probíhajícího výpočtu lze slouží kombinace kláves Alt+. (tečka)

Ovládání prostředí Squeaku bude popisováno později

junix
junix (neregistrovaný)
24. 2. 2004 14:41 Nový

Re: Kam mam psat ten kod?

celé vlákno

Dobra rada nad zlato :) konecne se mi diky tvemu prispevku podarilo napsat nejaky kod, jen jeste drobnost...
Kdyz pouziju ten Transcript na nejaky vystup, tak ten vystup uvidim kde? Vzdycky kdyz dam "do it" tak se to provede, ale vystup nevidim a kdyz dam "print it" tak se to provede a za kod se vypise vysledek, ale ne vystup...

OldFrog
OldFrog (neregistrovaný)
24. 2. 2004 14:51 Nový

Re: Kam mam psat ten kod?

celé vlákno

Vystup se ukaze v okne Transcriptu. Viz. Tools -> Transcript.

Frantisek Rysanek
Frantisek Rysanek (neregistrovaný)
24. 2. 2004 11:09 Nový

tesim se na dalsi dily

celé vlákno

Precetl jsem peclive cely dil a zatim jsem schopen chapat vsechny prezentovane syntakticke/semanticke konstrukce. Neabsolvoval jsem technickou vysokou skolu, je to pro mne nove.

Zatim mi to cele prijde spis velice sverazne nez nejak extra mocne. Pokud clanek ctu optikou meho dosavadniho zivota s C++, napada mne spousta semantickych konstrukci, ktere ve smalltalku nejsem schopen dosud popsanou syntaxi vyjadrit.

Velice mne zaujalo rozliseni pojmu "rovnost" (=) a "identita" (==), coz mi pripomina rozdil mezi porovnavanim (predavanim?) hodnot a odkazu.
Zatim z clanku vyplyva vsudypritomnost "copy constructions" - i pri nejjednodussim predavani zpravy se musi vytvaret (a rusit) mraky intermediate objektu.
A prave neco jako reference (nebo s odpustenim pointery) jsou prvni vec, ktera mi v dosud uvedenem popisu schazi.
Taky mne lehce sokuje, ze cela ta vec (kompilator, vytvorene aplikace) se zda fungovat v jedinem namespace... nebo se pletu? (Zeby neco naznacovala zahadna zminka o "sdilenych slovnicich"?)
A to je jen zacatek.

Odpustte ze blbe prudim s "pokrocilou" teorii u clanku, ktery ma slouzit k navnadeni laiku a zacatecniku.
Bezpochyby je ode mne nefer, ze rejpu do "zacatecnickeho" clanku a jsem liny studovat dokumentaci a dalsi zdroje. Rekneme ze nejde o lenost, ale o nedostatek casu... Vsecky odkazy, co jsem zatim letmo nasel na webu, konci prave tam, kde konci zacatecnicke konstrukce.
Ve SmallTalku bych potencialne rad nalezl hotovy nastroj, ktery by mi umoznil jednoduse vyjadrit vysokourovnovou semantiku, kterou si v C++ musim napred slozite explicitne implementovat, metaprogramovat apod.

Takze jsem opravdu zvedav, jak to cele dopadne.
Jen tak dal :)

Pavel Křivánek
Pavel Křivánek (neregistrovaný)
24. 2. 2004 12:42 Nový

Re: tesim se na dalsi dily

celé vlákno

Tak tedy trochu předběhneme.
Ve Smalltalku existují pouze reference na objekty. V proměnné nikdy nemůže být objekt jako takový, vždy je v ní pouze reference. Tedy všechny parametry jsou předávány odkazem.
Ve Squeaku skutečně vše funguje v jednom namespace. Sdílené slovníky sice jistou obdobou jmenných prostorů jsou, ale mají poněkud jiný význam než v C++.
Prosím, zkuste uvést některé sémantické konstrukce, které Vám nedávají spát.

Frantisek Rysanek
Frantisek Rysanek (neregistrovaný)
25. 2. 2004 8:57 Nový

Re: tesim se na dalsi dily

celé vlákno

> Ve Smalltalku existují pouze reference na objekty.
> V proměnné nikdy nemůže být objekt jako takový,
> vždy je v ní pouze reference.
> Tedy všechny parametry jsou předávány odkazem.
>
takže při přiřazení se dělá něco jako hard link?

Tomu úplně nerozumím. Jsou situace, kdy chci přiřadit z proměnné do proměnné jenom referenci na instanci nějaké třídy (shallow copy). Pak jsou situace, kdy chci vytvořit novou instanci podle stávajícího mustru (deep copy).
Takže pokud nechci kopírovat referenci, ale vyrobit zgruntu novou instanci, musím nový objekt explicitně zkonstruovat? A pak přiřadit obsah? Nebo lze nějakou syntaxí volat copy-constructor?

Nebo jste to myslel tak, že i při "deep copy" na úrovni zdrojového kódu se ve skutečnosti ve střevech smalltalku provede kopie "těla instance" a použíjí se reference (hardlinky) na původní member objekty? Proč ne, všechny member objekty jsou po kopii stejné - takže teprve při přiřazení nové hodnoty některému member objektu se tento "rozštěpí"...
Pokud vím, tento přístup používá např. Perl při práci s "literály" (řetězci a hodnotami zadanými přímo ve zdrojovém kódu).

Jinak řečeno, domnívám se, že mi vykládáte cosi o vnitřnostech smalltalku - o tom, jak je optimalizována práce s daty, aby se neprovádělo zbytečně mnoho kopií. Já bych rád věděl, jak se to tváří navenek, vůči programátorovi aplikace v jazyce smalltalk. Opravte mě pokud se pletu.

Já jsem se ptal, zda je ve smalltalkové syntaxi nějak explicitně rozlišena kopie obsahu od vytváření reference (pointeru). Když říkám pointer, nemám na mysli nutně Cčkový/strojový low-level pointer do paměti - a když říkám reference, nemám na mysli svéráznou C++ referenci s její povinnou inicializací apod. Řekněme, že mám na mysli něco jako perlovou referenci - prostě script-space odkaz na další datový objekt. Taková věc je podle mého nezbytná pro práci s dynamickými daty - spojovými seznamy a jakoukoli složitější topologií objektů (řekněme orientovaný graf).

Ještě jinak řečeno, potřebuju vyjadřovat vzájemné vztahy mezi instancemi, které jsou jiného druhu než "tato instance se skládá z těchto dalších instancí" (member objektů).

Pro ilustraci přikládám prográmek v C++ - nejsou tam spojové seznamy, ale můj mentální bludný kruh to snad trochu vysvětlí :-)

Ještě jednou se omlouvám, že předbíhám - kdyžtak mě odkažte na budoucí díly seriálu. Děkuji za čas, který věnujete vzdělávání blaženě nevědomé veřejnosti (mluvím za sebe) :-)

// ========== testovaci program ===========

#include <fstream>
#include <string>

class vagon
{
public:
string naklad;
void ukaz_naklad() { cout << naklad

Pavel Křivánek
Pavel Křivánek (neregistrovaný)
25. 2. 2004 10:07 Nový

Re: tesim se na dalsi dily

celé vlákno

V syntaxi jazyka to uvedeno vyjádřeno není, protože to prostě není třeba.
Pokud chcete vytvořit kopii objektu, uděláte to jednoduše pomocí jedné z následujících zpráv dle potřeby:

object copy
object clone
object shallowCopy
object copyTwoLevel
object deepCopy
object veryDeepCopy
atd.

Tyto zprávy jdou samozřejmě přetěžovat (přetěžuje se hlavně zpráva copy)

== je binární zpráva zaslaná objektu, která porovná referenci na objekt se s referencí na svůj parametr. Reference na objekt je v podstatě jeho ID.
= je zpráva, která porovná jejich obsah (uživatelsky)

Pokud ještě v něčem tápete, pak se klidně zeptejte.

Frantisek Rysanek
Frantisek Rysanek (neregistrovaný)
26. 2. 2004 9:24 Nový

Re: tesim se na dalsi dily

celé vlákno

Vytecne, tohle je presne to, co mi schazelo.

Dekuji, tesim se na dalsi pokracovani :)

podlesh
podlesh (neregistrovaný)
24. 2. 2004 14:29 Nový

Re: reference

celé vlákno

Drtiva vetsina objektovych jazyku pouziva reference (plus nejake ty primitivni typy, conscely ci struktury, ale to se netyka "cistych" jazyku jako smalltalk). Takze docela chapu, ze to autor opomenul napsat.

Neldor
Neldor (neregistrovaný)
24. 2. 2004 12:47 Nový

konstantni pole - zavorky nebo uvozovky? :-)

celé vlákno

> Konstantní pole ... jsou tvořena konstantami
> v _uvozovkách_ za znakem mřížky. Například
> #(1 2 3 4 5)
Me to spis pripada jako zavorky, nez jako uvozovky ;-).

Pavel Křivánek
Pavel Křivánek (neregistrovaný)
24. 2. 2004 13:18 Nový

Re: konstantni pole - zavorky nebo uvozovky? :-)

celé vlákno

Děkuji za upozornění, opraveno.

Barger
Barger (neregistrovaný)
24. 2. 2004 15:29 Nový

Squeak web server

celé vlákno

Aj takto moze vyzerat squeak v podobe samostatneho web servra :

http://www.barnett.sk:8080/20302862.asHtmlLink - Moje bookmarky napriklad.

mamm
mamm (neregistrovaný)
24. 2. 2004 16:39 Nový

tecka

celé vlákno

Strednik v C neoddeluje vyrazy, je soucasti prikazu. Prikazy oddeluje napr. v Pascalu. Takze rozhodne nema "stejnou" funkci.

Pisete, ze posledni tecka je nepovinna. Posledni tecka zdrojoveho kodu (v souboru), nebo posledni tecka nejake sekvenkce? Tedy napr. jako ve Fortranu, kde mohou byt prikazy oddeleny strednikem nebo koncem radku.

Jak se Smalltalk vyrovnava s desetinnou teckou a teckou oddelujici prikazy?

Jinak se mi clanek moc libi, klidne by mohl byt trochu podrobnejsi. Diky.

Pavel Křivánek
Pavel Křivánek (neregistrovaný)
24. 2. 2004 17:24 Nový

Re: tecka

celé vlákno

Příměr ke středníku v Pascalu by byl skutečně vhodnější.

Nepovinná je poslední tečka v sekvenci výrazů. Ta se používá ve výrazovém poli, blocích a metodách. Zde všude tedy nemusí být poslední tečka uváděna (např. v příkladu cyklu for za zprávou cr uvedena není)

Jedná-li se o desetinou tečku nebo o konec příkazu pozná podle toho, zda následuje přijatelná číslice.
např.:
{ 3.14. 5.5 } = #(3.14 5.5)
{ 3.14.5 } = #(3.14 5)
{ 3.14.5.6 } = #(3.14 5.6)
{ 16r3.F.5.6 } = #(3.9375 5.6)

Pavel Křivánek
Pavel Křivánek (neregistrovaný)
24. 2. 2004 17:29 Nový

Re: tecka

celé vlákno

Ještě poznámka:

#(3.14.5.5) = #(3.14 #. 5.5)

oddělující tečka je tedy v tomto případě konstatního pole brána jako symbol

Zasílat nově přidané příspěvky e-mailem