🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#127
From: Wojciech Kocjan
Date: Wed, 13 Jul 2005 06:11
73 lines
3237 bytes
kokoryn napisał(a):
> 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
>   }
> }

Prościej byłoby to zrobić w ten sposób:

proc create_proc {name params body} {
     # mybody wstawione bedzie na poczatku procedury
     set mybody ""

     # sprawia, ze zmienna np ::tab(jakasfunkcja) bedzie w tej
     # procedurze widoczna jakos zmienna lokalna mytab
     append mybody "upvar #0 ::tab($name) mytab" \n

     # stworzenie procedury - mozna nawet skorzystac z [uplevel]
     proc $name $params "$mybody\n$body"
}

Wtedy robisz sobie:

create_proc jakasfunkcja {} {
     set mytab 10
}

Bardzo czesto prosciej jest robic to inaczej:

namespace eval dane {}

proc jakasfunkcja {} {
     upvar #0 ::dane::jakasfunkcja mojedane
     return "Moje dane to $mojedane"
}

Nie ma sensu dla jednej linijki tworzyc automatu.

> W jaki sposób powinienem odwołać się do nazwy procedury w miejscu
> oznaczonym "???" tak, aby móc zapisać coś do tablicy pod odpowiednim
> indeksem? Wydawało mi się, że polecenie info powinno dawać taką
> możliwość, ale z dokumentacji wynika, że nie daje.

set nazwamojejprocedury [lindex [info level [info level]] 0]

Nie jest to najprostsze, ale bardzo logiczne, wystarczy o [info level] 
poczytac :-)

> Przy okazji chciałem powiedzieć, że jestem trochę zawiedziony tak małą
> aktywnością na pl.comp.lang.tcl. Nie spodziewałem się wprawdzie
> jakiegoś wielkiego ruchu, ale na pl.comp.lang.c i pl.comp.programming
> cały czas przewijają się jakieś dygresje (czasem nawet całe dyskusje)
> o Tcl (stąd zresztą dowiedziałem się o tym języku), więc sądziłem, że
> ludzie biorący w nich udział będą pisać tutaj, gdy grupa ruszy. Cóż,
> mam nadzieję, że z czasem grupa się rozkręci.

No ale trochę to rozkręcanie grupy potrwa...

-- 
WK
Technical Details
Message-ID: <db2b9q$qdf$1@atlantis.news.tpi.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!nemesis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <b4g7d1lb34n5638g0daao7mq3i0jhivh8v@4ax.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.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:11:02 +0200
Organization: tp.internet - http://www.tpi.pl/
Lines: 73
Message-ID: <db2b9q$qdf$1@atlantis.news.tpi.pl>
References: <b4g7d1lb34n5638g0daao7mq3i0jhivh8v@4ax.com>
NNTP-Posting-Host: dq2.dataquest.pl
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1121235067 27055 195.116.54.236 (13 Jul 2005 06:11:07 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Wed, 13 Jul 2005 06:11:07 +0000 (UTC)
User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317)
X-Accept-Language: pl, en-us, en
In-Reply-To: <b4g7d1lb34n5638g0daao7mq3i0jhivh8v@4ax.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit