Article View: pl.comp.os.linux.programowanie
Article #60129Re: Jak zrobić program obliczający dużą silnię?
From: Maciej Sobczak
Date: Fri, 28 Oct 2005 07:53
Date: Fri, 28 Oct 2005 07:53
78 lines
5416 bytes
5416 bytes
Marcin 'Qrczak' Kowalczyk wrote:
>>Przerywanie pętli jest wtedy częścią "gramatyki" tej pętli, podobnie
>>jak obecnie samo 'break' - to tylko nadzbiór tej koncepcji.
>
> 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. Jeżeli pętlę potraktujemy jako coś, co ma
własny zakres (i np. może deklarować obiekty lokalne), to dopóki jesteś
w tym zakresie, to możesz przerwać pętlę.
> Niektórzy (Knuth?) proponowali pętlę z wieloma punktami wyjścia,
> niekoniecznie na początku i na końcu. One były zawsze na "wierzchu"
> ciała pętli, wykonywane tylko w zależności od warunku logicznego.
> Semantyka takiej pętli nie sięga do wnętrza innych instrukcji,
> traktuje je jako czarne skrzynki. To jest najczystsza semantycznie
> wersja przerywania pętli.
Mi się podoba - cała logika pętli - *łącznie* z jej przerwaniami - jest
na jednym poziomie w kodzie.
> 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ć.
> to albo robimy to przez wzbogacenie semantyki wybranych
> konstrukcji [...] albo załatwiamy sprawę kompleksowo: używamy już
> istniejącego mechanizmu wyjątków.
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.
Twoja argumentacja jest wynikiem tego, że przyjąłeś pewien ciasny
schemat patrzenia na program. Wyjątki do przerwania pętli mogą być
najlepsze w Twoim ciasnym schemacie, ale nie są takie w innych językach,
które na różne koncepcje oferują dedykowane konstrukcje i pozwalają
dzięki temu jawnie wyrazić w kodzie to, co chce się osiągnąć.
> Drugie rozwiązanie ma tę zaletę, że są tylko dwa możliwe zakończenia
> obliczenia wyrażenia czy wykonania instrukcji: przez zwrócenie wyniku
> albo rzucenie wyjątku.
I to jest właśnie ten efekt - jeżeli traktujesz każdy element programu
jako coś, co produkuje jakiś wynik, to Twoja argumentacja jest słuszna.
Ale są języki, w których program składa się również z czynności a nie
tylko z wyrażeń.
> Jak mówiłem, przerwanie pętli moim sposobem wymaga dostępu do
> wartości, którą uzyskuje się w miejscu, do którego sterowanie dochodzi
> po przerwaniu (na zewnątrz pętli).
Czyli robisz sobie z wyjątku taki "token" albo "bilet powrotny".
Tylko że nie widzę tu niczego, co by pasowało do słowa "wymaga". To jest
*konwencja* ("patrzcie, jeśli tak właśnie wykorzystuję wyjątek, to mam
na myśli przerwanie pętli"), ale nie kompleksowe rozwiązanie. 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? 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?
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.
Etykiety pętli nie wymagają tworzenia żadnego obiektu i w tym kontekście
są całkowicie darmowe.
--
Maciej Sobczak : http://www.msobczak.com/
Programming : http://www.msobczak.com/prog/
Technical Details
Message-ID:
<djsle0$q36$1@sunnews.cern.ch>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!news.germany.com!solnet.ch!solnet.ch!news-zh.switch.ch!switch.ch!cernne03.cern.ch!cern.ch!newsReferences:
<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>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!news.germany.com!solnet.ch!solnet.ch!news-zh.switch.ch!switch.ch!cernne03.cern.ch!cern.ch!news From: Maciej Sobczak <no.spam@no.spam.com> Newsgroups: pl.comp.os.linux.programowanie Subject: Re: Jak zrobić program obliczający dużą silnię? Date: Fri, 28 Oct 2005 09:53:37 +0200 Organization: CERN - European Laboratory for Particle Physics Lines: 78 Message-ID: <djsle0$q36$1@sunnews.cern.ch> 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> NNTP-Posting-Host: abpc10883.cern.ch Mime-Version: 1.0 X-Trace: sunnews.cern.ch 1130486016 26726 (None) 137.138.37.241 X-Complaints-To: news@sunnews.cern.ch User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.12) Gecko/20050922 Red Hat/1.7.12-1.1.3.2.SL3 X-Accept-Language: en-us, en In-Reply-To: <87ll0ezpyl.fsf@qrnik.zagroda> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit