🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#60128
From: Marcin 'Qrczak' Kowalczyk
Date: Thu, 27 Oct 2005 20:04
50 lines
4341 bytes
Maciej Sobczak <no.spam@no.spam.com> writes:

> 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.

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.

Jeśli pozwolić na przerywanie pętli również z głębszego wnętrza
ciała pętli, to albo robimy to przez wzbogacenie semantyki wybranych
konstrukcji (if, case, pętle, try) o możliwość wyskakiwania z nich
(być może połączoną z wołaniem destruktorów i wykonywaniem
try...finally) albo załatwiamy sprawę kompleksowo: używamy już
istniejącego mechanizmu wyjątków.

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. Wszystkie konstrukcje obudowujące kod do
wykonania są przygotowane na te dwie możliwości i to wystarczy.
Nie trzeba się zastanawiać, co powinno się stać, kiedy ten kod
w środku zechce zrobić goto, break czy return na zewnątrz.

> Schowanie czegoś w funkcji (nie mówię o lambdach, tylko o nazwanych
> funkcjach) powoduje taki problem, że można tą funkcję wykorzystać
> z innego kontekstu, gdzie może nie być żadnej pętli do przerwania.

Lokalnej funkcji ani funkcji nieeksportowanej z modułu nie użyjesz
w innym miejscu, jeśli ten moduł jej jawnie nie udostępni jakimiś
innymi kanałami.

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). Nie można "bezkontekstowo" napisać
instrukcji, która przerwie całkiem nieznaną jej pętlę. Nie ma więc
mowy o użyciu takiej funkcji przez pomyłkę. Jeśli ona w ogóle nie jest
lokalna (zdefiniowana wewnątrz całej pętli albo będąca ową pętlą),
tylko dostępna z zewnątrz, to jej interfejs musi uwzględniać
przekazanie informacji, którą pętlę przerwać.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID: <87ll0ezpyl.fsf@qrnik.zagroda>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.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>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.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: Thu, 27 Oct 2005 22:04:34 +0200
Organization: Klub Nieszkodliwych Manjaków
Lines: 50
Message-ID: <87ll0ezpyl.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>
NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl
Mime-Version: 1.0
X-Trace: nemesis.news.tpi.pl 1130443517 8332 217.96.225.87 (27 Oct 2005 20:05:17 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Thu, 27 Oct 2005 20:05:17 +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:6dTxKfwfMtM5W5sMwTf+Ah7tHAk=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit