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
Názory k článku
Squeak: návrat do budoucnosti (3)
Re: LISPu natruc
celé vláknoNo, 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...
Re: LISPu natruc
celé vláknoNe, 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.
Re: LISPu natruc
celé vláknoZprá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í.
Zpravy
celé vláknoMoc nerozumim tomu >>"poslana zprava #to:do:"
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.
Re: Zpravy
celé vlákno1. 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 ].
).
Kam mam psat ten kod?
celé vláknoUz 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.
Re: Kam mam psat ten kod?
celé vláknoK 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
Re: Kam mam psat ten kod?
celé vláknoDobra 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...
Re: Kam mam psat ten kod?
celé vláknoVystup se ukaze v okne Transcriptu. Viz. Tools -> Transcript.
tesim se na dalsi dily
celé vláknoPrecetl 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 :)
Re: tesim se na dalsi dily
celé vláknoTak 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.
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
Re: tesim se na dalsi dily
celé vláknoV 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.
Re: tesim se na dalsi dily
celé vláknoVytecne, tohle je presne to, co mi schazelo.
Dekuji, tesim se na dalsi pokracovani :)
Re: reference
celé vláknoDrtiva 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.
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 ;-).
Re: konstantni pole - zavorky nebo uvozovky? :-)
celé vláknoDěkuji za upozornění, opraveno.
Squeak web server
celé vláknoAj takto moze vyzerat squeak v podobe samostatneho web servra :
http://www.barnett.sk:8080/20302862.asHtmlLink - Moje bookmarky napriklad.
tecka
celé vláknoStrednik 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.
Re: tecka
celé vláknoPří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)
Re: tecka
celé vláknoJeš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

