Article View: pl.comp.lang.tcl
Article #130Re: Jak odwołać się do nazwy procedury?
From: Artur
Date: Fri, 29 Jul 2005 07:38
Date: Fri, 29 Jul 2005 07:38
113 lines
4308 bytes
4308 bytes
kokoryn schrieb:
> witam
>
> Piszę skrypt, w którym tworzę dynamicznie kilka procedur wg pewnego
> schematu. Każda taka procedura ma oczywiście inną nazwę i chciałbym
> żeby ta nazwa mogła posłużyć jako indeks w globalnej tablicy, gdzie
> każda procedura będzie mogła przechowywać jakieś swoje dane. Z grubsza
> wygląda to tak:
>
> array set tab {}
>
> proc create_proc {name}\
> {
> proc $name {}\
> {
> global tab
> set tab(???) costam
> }
> }
>
Kilka komentarzy
1) Nazwe procedury mozna otrzymac przez introspekcje:
info level 1
2) jesli procedury roznia sie tylko nazwa, ktora jest uzywana dla
dostepu do jakis globalnych dannych to lepiej posluzyc sie nazwa
jako referencja do danych
proc universal name {
set ::tab($name) costam
}
Rozwiazanie jest nawet lepsze bo nie definiuje zbyt duzo proc
co zasmieca pamiec
uzycie jest prawie te samo zamiast
$name
universal $name
W Tk mozna czesto zauwazyc podobny kod
proc handler struct_ref {
upvar #0 $struct_ref mydata
set mydata 2
}
upvar umozliwia uzywanie zmiennej mydata jakby lokalnej (nawet jako
array)
3) Czesto zamiast definiowac procs w locie lepiej poprostu trzymac
skrypty
i uzywac eval. Tak dziala Tk w opciach -command script
set script($name) "......"
eval script($name)
Tu nie ma tak duzo problemow z kontekstem zmiennych (scoping).
W Tcl wszystko jest "string" .
4) Uzywanie duzej ilosci globalnych zmiennych nie jest czesto dobrym
pomyslem.
(bo ponowne uzycie albo przejzystosc programu, side effects).
Najlepsze procedury to takie ktore wogole nie maja "side effects",
czyli
sa niezalezne od globalnego kontekstu i nie zmieniaja go.
To odpowiada matematycznej idei funkcji.
Mozna co prawda definiowac namespaces co takze robi Tk ale to tak
naprawde
nie robi wielkiej roznicy.
namespace eval ::private { variable data costam }
proc handler struct_ref {
upvar ::private_namespace::$struct_ref mydata
puts $mydata
}
handler data
Takie zabawy nie sa ale dla poczatkujacych
5) Reczywiscie wszystkie pure-Tcl OO-frameworks
(i Tk) uzywaja podobnych schematow.
Nazwa objektu jest nazwa procedury, ktora obsluguje metody objektu.
I w tym momecie juz prawie konstrujemy nowy OO-framework dla Tcl.
Glowna idea OO jest miec dane i funkcje na danych w jednym miejscu
(objekcie).
W celach edukacyjnych mozna przez podobne przyklady wytlumacyc
poco OO istnieje. Chociaz wydaje mi sie, ze objekty sa
idea bardziej naturalna nie procedury.
Przyklad w XOTcl
package requrie XOTcl
Class Myclass -parameter tab
Myclass instproc doit {} {
my instvar tab
puts $tab
}
# uzycie
Myclass create myInstace -tab costam
myInstance doit
Oczywiscie XOTcl jest bardziej dojrzaly i szybszy niz rozwiazania,
ktore mozna napisac od reki ale dla celow edukacyjnych warto jest
sie
troche pomeczyc.
(sorry za ogonki, ale nie mam polskiego systemu)
Artur Trzewik
Technical Details
Message-ID:
<1122622726.319051.156300@f14g2000cwb.googlegroups.com>Path:
mbox-mo1.pugleaf.net!number1.nntp.dca.giganews.com!border1.nntp.dca.giganews.com!border2.nntp.dca.giganews.com!nntp.giganews.com!nx01.iad01.newshosting.com!newshosting.com!news.glorb.com!postnews.google.com!f14g2000cwb.googlegroups.com!not-for-mailReferences:
<b4g7d1lb34n5638g0daao7mq3i0jhivh8v@4ax.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!number1.nntp.dca.giganews.com!border1.nntp.dca.giganews.com!border2.nntp.dca.giganews.com!nntp.giganews.com!nx01.iad01.newshosting.com!newshosting.com!news.glorb.com!postnews.google.com!f14g2000cwb.googlegroups.com!not-for-mail From: "Artur" <mail@xdobry.de> Newsgroups: pl.comp.lang.tcl Subject: Re: Jak odwołać się do nazwy procedury? Date: 29 Jul 2005 00:38:46 -0700 Organization: http://groups.google.com Lines: 117 Message-ID: <1122622726.319051.156300@f14g2000cwb.googlegroups.com> References: <b4g7d1lb34n5638g0daao7mq3i0jhivh8v@4ax.com> NNTP-Posting-Host: 62.154.222.235 Mime-Version: 1.0 X-Trace: posting.google.com 1122622731 30079 127.0.0.1 (29 Jul 2005 07:38:51 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Fri, 29 Jul 2005 07:38:51 +0000 (UTC) In-Reply-To: <b4g7d1lb34n5638g0daao7mq3i0jhivh8v@4ax.com> User-Agent: G2/0.2 Complaints-To: groups-abuse@google.com Injection-Info: f14g2000cwb.googlegroups.com; posting-host=62.154.222.235; posting-account=LCgZWAwAAABJR_8tjAef_hUAajXeKdEF Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit