🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.tcl
Article #126

Re: Jak odwołać się do nazwy procedury?

#126
From: Wojciech Kocjan
Date: Wed, 13 Jul 2005 06:25
64 lines
3137 bytes
kokoryn napisał(a):
> Jest mi to potrzebne do uzyskania modelu podobnego do tego, jaki jest
> stosowany przy tworzeniu widgetów w Tk. Tam każdy widget ma swoją
> procedurę - u mnie analogicznie każda procedura obsługuje pewien
> "obiekt", którego stan muszę przechowywać pomiędzy kolejnymi
> wywołaniami procedury. Mógłbym to zrobić za pomocą zmiennych
> globalnych, ale nie chcę zaśmiecać globalnej przestrzeni nazw, więc
> pomyślałem, że będę trzymał te dane w jednej globalnej tablicy. Może
> to jest wyważanie otwartych drzwi, ale chyba nie - nic mi nie wiadomo
> o jakimś odpowiedniku słowa kluczowego static z C++ w Tcl.

Jest wiele przykładów na Wiki. Na początek błagam pomyśl o IncrTcl - 
robienie mini OO jako "sztuka dla sztuki" nie jest dobre. Jeśli 
koniecznie nie chcesz to napisz chociaż dlaczego.

Jeśli już nie może być Itcl, to jest taki bardzo fajny trik:

# obsluguje obiekt
proc obsluga_obiektu {id cmd args} {
     upvar ::daneobiektu($id) dane
     switch -- $cmd {
         inicjalizuj {
             set dane 0
         }
         pobierz {
             return $dane
         }
         ustaw {
             set dane [lindex $args 0]
         }
         dodaj {
             incr dane
         }
         skasuj {
             unset dane
             rename $id {}
         }
     }
}

# tworzy obiekt
proc obiekt {nazwa} {
     set body ""
     append body "return \[eval \[concat"
     append body " \[list obsluga_obiektu $nazwa\]"
     append body " \$cmd \$args\]\]"
     proc $nazwa {cmd args} $body

     # zainicjalizuj wartosc - niekoniecznie, ale jest ladniej
     $nazwa inicjalizuj
}

Przy okazji zmiana obsługi jak dany "obiekt" działa moze po prostu być 
zrobiona poprzez source pliku z procedurą obsluga_obiektu.

>>Wiesz grupa jest nowa, i raczej dużo osób nie wie. Jeżeli na innej grupie
>>widzisz, że ktoś dyskutuje o tcl, możesz poinformować że taka grupa
>>niedawno zostałą stworzona.
> Chyba jest to rozsądne rozwiązanie.

Może follow up :-)

-- 
WK
Technical Details
Message-ID: <db2c4n$mu$1@atlantis.news.tpi.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!nemesis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <b4g7d1lb34n5638g0daao7mq3i0jhivh8v@4ax.com> <1wzocj9rlwvcg$.dlg@takeda.tk.invalid> <1ob8d1tdlj2bjuml0lm01gkbkkhdv5de1i@4ax.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!nemesis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Wojciech Kocjan <mojeimie@kocjan.org>
Newsgroups: pl.comp.lang.tcl
Subject: Re: Jak odwołać się do nazwy procedury?
Date: Wed, 13 Jul 2005 08:25:25 +0200
Organization: tp.internet - http://www.tpi.pl/
Lines: 64
Message-ID: <db2c4n$mu$1@atlantis.news.tpi.pl>
References: <b4g7d1lb34n5638g0daao7mq3i0jhivh8v@4ax.com> <1wzocj9rlwvcg$.dlg@takeda.tk.invalid> <1ob8d1tdlj2bjuml0lm01gkbkkhdv5de1i@4ax.com>
NNTP-Posting-Host: dq2.dataquest.pl
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1121235927 734 195.116.54.236 (13 Jul 2005 06:25:27 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Wed, 13 Jul 2005 06:25:27 +0000 (UTC)
User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317)
X-Accept-Language: pl, en-us, en
In-Reply-To: <1ob8d1tdlj2bjuml0lm01gkbkkhdv5de1i@4ax.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit