Article View: pl.comp.os.linux.programowanie
Article #60131Re: Jak zrobić program obliczający dużą silnię?
From: Maciej Sobczak
Date: Mon, 31 Oct 2005 09:11
Date: Mon, 31 Oct 2005 09:11
83 lines
6019 bytes
6019 bytes
Marcin 'Qrczak' Kowalczyk wrote: >>>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. OK. Jak już pisałem wcześniej - mogę to związać z pojęciem zakresu pętli i widoczności obiektów. Jeśli w jakimkolwiek miejscu widzę obiekty zadeklarowane w pętli, to mogę tą pętlę też przerwać. To właśnie obejmuje nie tylko ciąg instrukcji traktowany jako sekwencję, ale również lokalne rozgałęzienia w rodzaju instrukcji warunkowych (tak naprawdę to dopiero wtedy przerywanie pętli ma sens). Wywołanie funkcji w pętli powoduje, że powstaje nowy zakres, gdzie obiekty stworzone w pętli nie są widoczne (to też zależy od języka, ale mówię o "moich" językach, gdzie widoczność jest ustalana statycznie) - wtedy nie pozwalam też na przerwanie pętli. Jedno i drugie wchodzi w skład tematu, który nazwałbym: "widzę, gdzie jestem". Nie przerywam pętli, której nie widzę. > 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. Ja też jestem zdumiony, na ilu frontach można spieprzyć język programowania. Nie interesuje mnie ten przykład. Bardziej mnie interesują języki, w których taka gimnastyka nie występuje - bo albo w ogóle nie ma break (jak w "Twoich" językach) albo nie ma finally (jak w "moich"). >>>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 Sorry, nie zrozumiałem, o czym mówisz. Jeżeli pod pojęciem "głębszego wnętrza ciała pętli" rozumiesz "jakieś miejsce, gdzie ciągle widać pętlę", to oczywiście przerwania pętli powinno być możliwe i nadal jest jej logiczną częścią. >>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. No właśnie nie jest przezroczyste, bo powstaje kod, który nie widzi pętli, którą przerywa. Taki kod (czyli tą funkcję) można wywołać w inny sposób, i wtedy przestaje mieć sens. Staje się niejawnie związany z pętlą, z której jest wywoływany i ten niejawny związek sprawia, że kod jest trudniejszy w utrzymaniu. Fakt, że token to poprawia. Jeżeli natomiast mówisz o funkcji nienazwanej, której nie da się wywołać inaczej niż w tym miejscu, gdzie została zdefiniowana "w locie" (lambda), to ten problem znika, ale nadal będę twierdził, że jest to niepotrzebnie ciasny model. Zamiast mówić, że ciało pętli jest lokalnie zdefiniowaną i zaaplikowaną funkcją, wolę powiedzieć, że ciało pętli jest składniową częścią pętli i ma do dyspozycji dedykowane mechanizmy jej przerwania, wznowienia, czy co tam jeszcze może być potrzebne. -- Maciej Sobczak : http://www.msobczak.com/ Programming : http://www.msobczak.com/prog/
Technical Details
Message-ID:
<dk4n41$aue$1@sunnews.cern.ch>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.de!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> <djsle0$q36$1@sunnews.cern.ch> <877jbx7q2t.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!newsfeed00.sul.t-online.de!newsfeed01.sul.t-online.de!t-online.de!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: Mon, 31 Oct 2005 10:11:29 +0100 Organization: CERN - European Laboratory for Particle Physics Lines: 83 Message-ID: <dk4n41$aue$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> <djsle0$q36$1@sunnews.cern.ch> <877jbx7q2t.fsf@qrnik.zagroda> NNTP-Posting-Host: abpc10883.cern.ch Mime-Version: 1.0 X-Trace: sunnews.cern.ch 1130749889 11214 (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: <877jbx7q2t.fsf@qrnik.zagroda> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit