Article View: pl.comp.lang.tcl
Article #23Re: Optymalizacja
From: Derek Kuliński / takeda
Date: Thu, 02 Jun 2005 02:57
Date: Thu, 02 Jun 2005 02:57
66 lines
3758 bytes
3758 bytes
On Tue, 31 May 2005 11:44:21 +0200, Googie wrote:
> Użytkownik "Derek Kuliński / takeda" <d.kulinski@gmail.com> napisał:
>
>> Ma ktoś pomysł jak poniższą procedurę zoptymalizować? Działać działa, ale
>> nie jest to ładne rozwiązanie. Bardzo nie podoba mi się powtarzający się
>> kod.
>
> Mnie się udało sprowadzić to do takiej postaci: (nie testowałem czy działa -
> nie mam na stanie żadnych botów).
> Generalnie "optymalizacja" sprowadza się do krótszego zapisu powtarzającego
> się kodu (a więc to co Ci się nie podobało :) ). Oprócz tego wyrzuciłem z
> pętli sprawdzanie 'if {$modes == ""} {.......}', bo i tak można ustawiać "+"
> lub "-" na wstępie oraz przy "resetowaniu" wartości modes.
[ ... cut ... ]
Heh, zawsze jest jakiś bug jak się kodu nie sprawdzi: :P
| [18:33:25] <takeda> .tcl ::r_protect::combine_modes #z [list 1 2 3 4] [list 5 6 7 8]
| [18:33:25] <testbot> Tcl: {MODE #z -RRR 5 6 7} {MODE #z +RR 8 1 2} {MODE #z +RR 3 4}
| [18:33:32] <takeda> .tcl ::r_protect::old_combine_modes #z [list 1 2 3 4] [list 5 6 7 8]
| [18:33:32] <testbot> Tcl: {MODE #z -RRR 5 6 7} {MODE #z -R+RR 8 1 2} {MODE #z +RR 3 4}
Poprawiłem, kod jest trochę nmniej zgrabny niż Twój, ale na pewno lepszy
niż oryginalny.
| proc combine_modes {add_r rm_r} {
| set maxlen ${::modes-per-line}
|
| set output [list]
| set masks [list]
| set modes ""
| foreach {var sig} [list rm_r "-" add_r "+"] {
| if {![llength [set $var]]} {continue}
| append modes $sig
| foreach mask [set $var] {
| if {$modes == ""} {set modes $sig}
| append modes "R" ; lappend masks $mask
| if {[llength $masks] >= $maxlen} {
| lappend output "$modes [join $masks]"
| set modes "" ; set masks [list]
| }
| }
| }
|
| if {[llength $masks] > 0} {
| lappend output "$modes [join $masks]"
| }
|
| return $output
| }
To llength jest do sytuacji, kiedy któraś z list jest pusta (właściwie
częsty przypadek w tym skrypcie)
Z kolei set zamienione na append i if {$modes == ""} {set modes $sig} jest
po to aby wyeliminować problem który pokazałem powyżej.
BTW: Tego triku z foreach nie zajarzyłem, bo zapisałeś listę w trochę
dziwny (dla mnie) sposób =)
Ja staram się go unikać, bo to jest częsty powód problemów ze znakami
takimi jak {}[]\ itp.
--
takeda@IRCnet.EFnet, ICQ# 15827691, TLEN: taked4, YahooIM: takeda64
http://eggwiki.takeda.tk - nowa ulepszona strona !!!
Technical Details
Message-ID:
<1flyxpprlsvwi$.dlg@takeda.tk.stupid.worms.and.spammers.sending.mails.to.msgid>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!wsisiz.edu.pl!news.ceti.pl!not-for-mailReferences:
<6cfos1e7qd1w$.dlg@takeda.tk.stupid.worms.and.spammers.sending.mails.to.msgid> <d7hb73$koa$1@srv.cyf-kr.edu.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!wsisiz.edu.pl!news.ceti.pl!not-for-mail
From: Derek Kuliński / takeda <d.kulinski@gmail.com>
Newsgroups: pl.comp.lang.tcl
Subject: Re: Optymalizacja
Date: Wed, 1 Jun 2005 19:57:28 -0700
Organization: CETI S.C. (Krakow, Poland)
Lines: 66
Message-ID: <1flyxpprlsvwi$.dlg@takeda.tk.stupid.worms.and.spammers.sending.mails.to.msgid>
References: <6cfos1e7qd1w$.dlg@takeda.tk.stupid.worms.and.spammers.sending.mails.to.msgid> <d7hb73$koa$1@srv.cyf-kr.edu.pl>
NNTP-Posting-Host: node-402413e2.sna.onnet.us.uu.net
Mime-Version: 1.0
X-Trace: druid.ceti.pl 1117681049 22875 64.36.19.226 (2 Jun 2005 02:57:29 GMT)
X-Complaints-To: abuse@ceti.pl
NNTP-Posting-Date: Thu, 2 Jun 2005 02:57:29 +0000 (UTC)
User-Agent: 40tude_Dialog/2.0.15.1
X-EMAIL: 5570bmv02@NOsneakemailSPAM.com - remove CAPITAL letters
X-Face: ptH}o2-v0T<^mQ%"Un18TXgE#jj}qUfAK;3\x;'$hO%[N&Jr^1FC~dtAe&p%]WWfXhhT_G%@!$|Nw,nq|M07r2[Jf._,ZqGWv@aULt6&Y+`2Wp9y]|=K.GgSR=]7ObD?8S|{I:D=+1K_'tn/:T0pyTQN=x).#~Z="SWp0V)P5D"8]rf=j5|{;O{0]8X;GHjl6p1R\VXngOe
X-Antivirus: avast! (VPS 0522-6, 06/01/2005), Outbound message
X-Antivirus-Status: Clean
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit