Article View: pl.comp.lang.tcl
Article #126Re: Jak odwołać się do nazwy procedury?
From: Wojciech Kocjan
Date: Wed, 13 Jul 2005 06:25
Date: Wed, 13 Jul 2005 06:25
64 lines
3137 bytes
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-mailReferences:
<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