Article View: pl.comp.os.linux.programowanie
Article #60133Re: Jak zrobić program obliczający dużą silnię?
From: Maciej Sobczak
Date: Wed, 02 Nov 2005 08:21
Date: Wed, 02 Nov 2005 08:21
88 lines
5315 bytes
5315 bytes
Marcin 'Qrczak' Kowalczyk wrote:
>>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).
>
> Zgodnie z tym kryterium powinno też obejmować lokalne funkcje.
> I u mnie obejmuje, a u Ciebie nie.
U Ciebie nie obejmuje, bo nie masz break.
U mnie nie obejmuje, bo nie mam lokalnych funkcji. :)
Gdybym je miał, to i tak sceptycznie podchodzę do tematu dostępności
obiektów lokalnych. Nawet gdybym na to pozwolił, to nie pozwoliłbym na
ingerowanie z ich poziomu w logikę pętli, które strukturalnie są
zewnętrzne w stosunku do tych funkcji.
W Twoim przypadku wyjątki pomagają ulepić jakiś schemat kontroli
sterowania pomiędzy poziomami, ale to jest *skutek* modelu, który
przyjąłeś a nie obiektywnie dobre rozwiązanie. Ja tego nie kupuję.
>>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) -
>
> A ja mówię o moim, gdzie jest ustalana statycznie *i* obejmuje obiekty
> zdefiniowane w pętli.
Czy obejmowałaby też etykiety (gdybyś je miał)?
Konkretniej:
Masz pętlę albo inną strukturę z etykietą i w tej strukturze definiujesz
i aplikujesz lokalną funkcję. Czy w tej lokalnej funkcji pozwoliłbyś na
dostęp do tej etykiety i jej wykorzystanie?
Składnia z czapki, oparta o C++:
etykieta:
while (true)
{
string msg = "Hi";
void () { cout << msg; break etykieta; } ();
// ^ . . . . . . . . . . . . . . . . . . ^ ^
// | | |
// | ,-----------------------' |
// lokalna funkcja |
// |
// i jej aplikacja --'
}
Tu masz przykład na dostęp z funkcji lokalnej do obiektów zdefiniowanych
w pętli (msg) *oraz* do etykiety.
Pozwoliłbyś na to? Wygląda fajnie, ale ja zabroniłbym *obu* tych rzeczy.
> Musi być coś zamiast finally, żeby język był praktyczny.
Oczywiście, tylko że ja na to patrzę odwrotnie (i historycznie chyba mam
rację): to właśnie finally jest "czymś zamiast". Z takimi efektami, jak
wspomniałeś.
>>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.
>
> Ależ widzi. Tyle że jeśli się uprzeć, to można zbudować kod, który
> będzie próbował przerwać pętlę po tym, jak ona się już zakończyła.
> Takie życie.
No właśnie mi się to nie podoba.
> Sytuacja jest podobna do próby operacji na pliku po jego zamknięciu.
U Ciebie, tak. U mnie nie, bo nie używam tokena. Przerwanie pętli jest
częścią jej struktury i *nie da się* przerwać pętli nie mając pętli -
dla mnie to jest błąd statyczny a nie "takie życie".
--
Maciej Sobczak : http://www.msobczak.com/
Programming : http://www.msobczak.com/prog/
Technical Details
Message-ID:
<dk9su1$6su$1@sunnews.cern.ch>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!news.studio.net.pl!newsfeed.silweb.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!irazu.switch.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> <dk4n41$aue$1@sunnews.cern.ch> <87vezdanl0.fsf@qrnik.zagroda>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news2.icm.edu.pl!news.studio.net.pl!newsfeed.silweb.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!irazu.switch.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: Wed, 02 Nov 2005 09:21:22 +0100 Organization: CERN - European Laboratory for Particle Physics Lines: 88 Message-ID: <dk9su1$6su$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> <dk4n41$aue$1@sunnews.cern.ch> <87vezdanl0.fsf@qrnik.zagroda> NNTP-Posting-Host: abpc10883.cern.ch Mime-Version: 1.0 X-Trace: sunnews.cern.ch 1130919681 7070 (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: <87vezdanl0.fsf@qrnik.zagroda> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit