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
"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.
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 ].
).
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.
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
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...
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 :)
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.
> 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
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.
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.
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)