🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#60137
From: Marcin 'Qrczak' Kowalczyk
Date: Thu, 03 Nov 2005 12:43
56 lines
4753 bytes
Maciej Sobczak <no.spam@no.spam.com> writes:

>> Nie mogę więc powiedzieć, co by było przy goto, bo ono jest
>> niekompatybilne z moim modelem.
>
> Chodziło mi o break. Albo - bardziej ogólnie - o widoczność etykiet
> w zagnieżdżonej funkcji lokalnej. To też ciekawy temat, bo prowokuje
> pytanie, czym jest etykieta i czym się różni od identyfikatora
> obiektu.

Nawet takie etykiety, nie będące identyfikatorami obiektów, są
niekompatybilne z moim modelem. Rozwiązuję problem odrzucając pojęcie
etykiet.

> Np. wyobrażam sobie język imperatywny z semantyką transakcji
> (commit/rollback), gdzie etykiety mogą służyć do określenia miejsc
> w kodzie, gdzie można np. wycofać różne operacje. Co z takimi
> etykietami? Czy powinny być widoczne w funkcjach lokalnych
> (jeśli język je wspiera)?

Takie etykiety powinny zostać wyrażone za pomocą identyfikatorów
obiektów. Wtedy odpowiedź jest twierdząca.

Ale transakcje wyobrażam sobie inaczej; nie mam w nich doświadczenia,
żeby stwierdzić, kiedy to wyobrażenie nie wystarczy. Mianowicie
operacje wymagające potwierdzenia/anulowania są reprezentowane
jako funkcje, które jako jeden z argumentów biorą dalszy ciąg
transakcji. Jeśli ten dalszy ciąg się powiedzie, to po nim robi
się commit. Jeśli dalszy ciąg rzuci wyjątkiem, to rollback.

Składnia Koguta wspiera taki kontynuacyjny styl programowania. Symbol
=> oznacza to samo co { (m.in. wprowadza lokalną anonimową funkcję),
przy czym odpowiadające mu } jest niejawnie wstawiane na końcu bloku.

> Moje zdanie jest takie, że funkcje lokalne nie powinny widzieć
> *niczego* z ich zewnętrznego zakresu (ale można wykorzystać ich
> parametry do przekazania im jakiejś wartości albo referencji) - po
> prostu nie potrafię powiedzieć, gdzie miałbym się z tym zatrzymać.

Od tak ograniczających języków trzymam się z daleka. I nigdzie
się nie zatrzymuję.

Na szczęście większość pozwala swobodnie tworzyć lokalne funkcje
odwołujące się do środowiska z miejsca definicji. Poza tradycyjnie
uznawanymi za funkcyjne, w których to oczywiste (SML, OCaml, Haskell,
Clean, Mercury, Lisp, Scheme, Dylan, Nemerle, Kogut), lokalne funkcje
oferuje co najmniej Smalltalk, Perl, Python (zabraniając zmian tych
zmiennych z powodów składniowych), Ruby, Java (z koszmarną składnią
i zabraniając zmian tych zmiennych z głupich powodów), C#, JavaScript.
Były też próby w Eifflu, nie wiem jak się skończyły. Erlang kiedyś
nie miał, choć był nazywany funkcyjnym, ale teraz ma.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID: <87br11zytb.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> <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> <dk9su1$6su$1@sunnews.cern.ch> <87k6fqeq35.fsf@qrnik.zagroda> <dkcps0$2vq$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ę?
Supersedes: <877jbpdi1g.fsf@qrnik.zagroda>
Date: Thu, 03 Nov 2005 13:43:44 +0100
Organization: Klub Nieszkodliwych Manjaków
Lines: 56
Message-ID: <87br11zytb.fsf@qrnik.zagroda>
References: <djfrn5$i55$1@nemesis.news.tpi.pl> <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> <dk9su1$6su$1@sunnews.cern.ch> <87k6fqeq35.fsf@qrnik.zagroda> <dkcps0$2vq$1@sunnews.cern.ch>
NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1131021833 16953 217.96.225.87 (3 Nov 2005 12:43:53 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Thu, 3 Nov 2005 12:43:53 +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-Key: sha1:toGhpNcEoo6/Ad3F/ZCeozRgLDY=
Cancel-Lock: sha1:gxxqqcKmV/672O4G141jM7hakLY=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit