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.