🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#60131
From: Maciej Sobczak
Date: Mon, 31 Oct 2005 09:11
83 lines
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!news
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>

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