🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#130
From: Artur
Date: Fri, 29 Jul 2005 07:38
113 lines
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-mail
References: <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