🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #60130

Re: Jak zrobić program obliczający dużą silnię?

#60130
From: Marcin 'Qrczak' Kowalczyk
Date: Fri, 28 Oct 2005 13:01
95 lines
6518 bytes
Maciej Sobczak <no.spam@no.spam.com> writes:

>> Ta gramatyka w brutalny sposób sięga do wnętrza ciała pętli,
>> tak samo jak goto.
>
> Nie widzę tu brutalności. Nie traktuję ciała pętli jak czarnej
> skrzynki, tylko jak ciąg instrukcji.

Nie jako ciąg instrukcji, tylko jako drzewo ze wszystkimi rodzajami
zagnieżdżonych instrukcji. Wyskoczenie z pętli może się odbyć
z miejsca dowolnie zagłębionego w tym drzewie, a nie tylko między
instrukcjami ciągu.

Czy wykonują się try...finally przerwane przez takie wyskoczenie?
W Javie tak. Efekt tej intrakcji trzeba było osobno zaprojektować,
on nie wynika sam przez się z semantyki poszczególnych konstrukcji.
Gdyby try...finally definiować przez try łapiące wyjątki, to prawie
by działało, ale przy tej interakcji efekt byłby inny, bo try łapiące
wyjątki w Javie nie złapie return ani break, a try...finally owszem.

>> Jeśli pozwolić na przerywanie pętli również z głębszego wnętrza
>> ciała pętli
>
> To mamy sieczkę. Nie widzę powodu, dla którego należałoby takie coś
> uprawiać.

Przecież o ile już zwykły break na to pozwala (jeśli tylko między
szczytem pętli a miejscem wyskoczenia nie ma innej pętli ani switcha),
o tyle break z etykietą służy przede wszystkim właśnie do tego.
Do wyskoczenia bezpośrednio z poziomu ciągu instrukcji będącego
ciałem pętli wystarcza zwykły break bez etykiety.

> Można użyć, ale nie zgadzam się z tym, że jest to kompleksowe
> załatwienie czegokolwiek. Kod, który przestaje być ciałem pętli a
> zaczyna być funkcją, staje się oderwany od pojęć związanych z pętlą
> i nie powinien posługiwać się czymś takim, jak przerwanie pętli.

Nie zgadzam się, że staje się oderwany od pojęć związanych z pętlą.
Funkcja to po prostu sposób na umieszczenie kawałka kodu w jednym
miejscu i użycie go w kilku miejscach, podobnie jak zwykła zmienna to
sposób na użycie jednej wartości w kilku miejscach. Przemieszczenie
wyrażenia do funkcji i aplikacja tej funkcji zamiast wpisania tego
wyrażenia żywcem jest przezroczyste względem wszelkich konstrukcji
użytych w wyrażeniu, również jeśli one wyskakują z pętli.

> Czy język wspiera tą konwencję w jakiś sposób? Po czym poznajesz,
> że rzucono właśnie ten "bilet powrotny" a nie coś innego?

Lokalnie w źródle programu: po tym, że użyto funkcji Escape, a nie
jakiejś innej.

W generycznych konstrukcjach łapiących wyjątki: to ich nie powinno
obchodzić, bo wszystkie wyjątki dla nich nieprzeznaczone powinny
traktować tak samo. Jeśli bardzo chcą, to mogą to poznać po tym,
że to jest wyjątek typu ESCAPE_TOKEN, a nie jakiegoś innego.

> Jeżeli używasz jednego mechanizmu na dwa różne sposoby (w sensie
> konwencji, układu kodu, itp.), to w czym to jest lepsze od dwóch
> dedykowanych mechanizmów?

W tym, że z punktu widzenia mojego odpowiednika try...finally oba
mechanizmy załatwia się tak samo. To samo dotyczy wszelkich innych
konstrukcji, które łapią wszystkie wyjątki i obsługują je w generyczny
sposób.

Na przykład konstrukcja "wykonaj dany kod z timeoutem - jeśli czas się
skończy, to przerwij" nie przeszkadza w przerywaniu pętli z wnętrza
tej konstrukcji i wiszący timeout będzie poprawnie anulowany, jeśli
kod skończy się przed czasem wyskokiem z pętli.

Inny przykład: sygnały (zarówno uniksowe, jak i używane wewnętrznie,
podobne do wyjątków, tylko asynchroniczne). Lokalnie (w pętli)
ustanowiona funkcja obsługi sygnału może wprost przerwać pętlę!
C zna tylko globalne funkcje obsługi sygnałów, ja się tak nie
ograniczam.

> Rozumiem też, że tworzysz ten "token" niezależnie od tego, czy pętla
> będzie przerwana, czy nie (bo nie wiesz tego przed jej wykonaniem).
> Czyli w przypadku gdy nie było konieczności przerwania pętli, to
> stworzyłeś sobie bez potrzeby jakiś obiekt, który w ogóle nie był
> wykorzystany.

Owszem. Nie przejmuję się tym, mój język i tak ma sporo różnych
narzutów. Z drugiej strony, alokacja obiektu albo nawet grupy obiektów
jest tania (zwykle 5 instrukcji maszynowych).

Jeśli przerwanie pętli jest w głównym ciągu instrukcji, to nie trzeba
stosować Escape - można po prostu warunkowo kontynuować pętlę, bez
żadnych wyjątków. Escape jest potrzebne tylko kiedy miejsce przerwania
pętli jest oddalone od samej pętli.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID: <877jbx7q2t.fsf@qrnik.zagroda>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <djfrn5$i55$1@nemesis.news.tpi.pl> <dji80k$2a5$2@atlantis.news.tpi.pl> <20051024135514.GA237@siebert> <djij31$st1$1@sunnews.cern.ch> <20051024162624.GA1132@siebert> <djleog$fok$1@nemesis.news.tpi.pl> <1t4bv9mozvw38.12szxw58iqmbp.dlg@40tude.net> <djn9lh$ktl$1@nemesis.news.tpi.pl> <e2pcznjzv2gh$.1drgaxj9rqzhj.dlg@40tude.net> <djnjtf$suk$2@nemesis.news.tpi.pl> <1i7bbr8l84m9o$.8ttxld9ccdq4.dlg@40tude.net> <djnq5h$8ae$1@atlantis.news.tpi.pl> <gmqro8ttahov.aorv2e8thz25.dlg@40tude.net> <87wtk0iiqw.fsf@qrnik.zagroda> <djq3rj$4fm$1@sunnews.cern.ch> <87y84fz1bn.fsf@qrnik.zagroda> <djqg9q$1sg$1@sunnews.cern.ch> <87ll0ezpyl.fsf@qrnik.zagroda> <djsle0$q36$1@sunnews.cern.ch>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl>
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: Jak    zrobić program
 obliczający dużą silnię?
Date: Fri, 28 Oct 2005 15:01:46 +0200
Organization: Klub Nieszkodliwych Manjaków
Lines: 95
Message-ID: <877jbx7q2t.fsf@qrnik.zagroda>
References: <djfrn5$i55$1@nemesis.news.tpi.pl> <dji80k$2a5$2@atlantis.news.tpi.pl> <20051024135514.GA237@siebert> <djij31$st1$1@sunnews.cern.ch> <20051024162624.GA1132@siebert> <djleog$fok$1@nemesis.news.tpi.pl> <1t4bv9mozvw38.12szxw58iqmbp.dlg@40tude.net> <djn9lh$ktl$1@nemesis.news.tpi.pl> <e2pcznjzv2gh$.1drgaxj9rqzhj.dlg@40tude.net> <djnjtf$suk$2@nemesis.news.tpi.pl> <1i7bbr8l84m9o$.8ttxld9ccdq4.dlg@40tude.net> <djnq5h$8ae$1@atlantis.news.tpi.pl> <gmqro8ttahov.aorv2e8thz25.dlg@40tude.net> <87wtk0iiqw.fsf@qrnik.zagroda> <djq3rj$4fm$1@sunnews.cern.ch> <87y84fz1bn.fsf@qrnik.zagroda> <djqg9q$1sg$1@sunnews.cern.ch> <87ll0ezpyl.fsf@qrnik.zagroda> <djsle0$q36$1@sunnews.cern.ch>
NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl
Mime-Version: 1.0
X-Trace: nemesis.news.tpi.pl 1130504549 23721 217.96.225.87 (28 Oct 2005 13:02:29 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Fri, 28 Oct 2005 13:02:29 +0000 (UTC)
X-Face: .B/ouEO}=VFkSJWE}s0@!:diHI.Z,<Ilt`:~@*]7rnn^K_y"XV8AXf^E)x*|3yVg:$FCq0Y )iGn@Z[SOA<+p}TkAv'Lzu$w{z2?F);0Xt>`m}AqK#Vjuscq(Vf1B}H[)v\9tBN}>AdP,QSRbhO]=v 3?;I+cN/Z0HKPm_Eg99/pFrU!WfpjgQ!z":>A~qt0^4):0-UuPB(6^>j!mN$)RIb)rRhXeK:+MLPW[ RVb7Kepvby-ww6_zci7Yy_@IrWW
User-Agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)
Cancel-Lock: sha1:Y8/VyeggyECBuG/9T3aUZelTuJU=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit