Hlavní navigace

Názor k článku Squeak: návrat do budoucnosti (3) od Frantisek Rysanek - > Ve Smalltalku existují pouze reference na objekty. >...

  • Článek je starý, nové názory již nelze přidávat.
  • 25. 2. 2004 8:57

    Frantisek Rysanek (neregistrovaný)

    > 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