🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#60143
From: Maciej Sobczak
Date: Fri, 04 Nov 2005 13:13
90 lines
6187 bytes
Marcin 'Qrczak' Kowalczyk wrote:

>>Chodzi mi o to, że dostęp z funkcji lokalnych do ich zewnętrznego
>>zakresu *nie jest* (albo nie musi być) integralną częścią koncepcji
>>funkcji lokalnych.
> 
> Dla mnie jest.
> 
> Poza tymi 408 anonimowymi funkcjami używającymi lokalnego środowiska
> są 1004, które go nie używają i zostały przez kompilator wyniesione
> na toplevel i zaalokowane statycznie. Bywa tak i tak, a Ty uwzględniasz
> tylko tę łatwiejszą część.

Bo tylko ta część ma dla mnie sens.

>># the name space is not polluted with the names of entities that are
>>supposed to be used only once
>># the "locality of reference" in the source code is higher
>># the code is potentially shorter and more expressive
> 
> To są powody, żeby używać funkcji lokalnych zamiast globalnych.
> Nie są to powody, żeby zabierać tym funkcjom dostęp do lokalnego
> środowiska.

Przecież ich tak nie przedstawiam. Powody, dla których zabroniłbym 
takiego dostępu są inne.

> Owszem, w C++ nie ma jak technicznie dać im tego dostępu, ale to
> problem C++, nie mój.  C++ samo się na to skazało przez nieuwzględnienie
> odśmiecania i przez przymusowe niszczenie obiektów zawartych w zmiennych
> lokalnych, nawet jeśli będą jeszcze potrzebne.

Jeśli będą jeszcze potrzebne, to znaczy, że nie są lokalne. I to jest 
właśnie powód, dla którego nie mieszałbym pojęcia obiektu lokalnego i 
jego nielokalnego wykorzystania.
Dostęp do obiektów na zewnątrz funkcji lokalnej mógłby mieć różne formy 
(przez wartość, przez referencję) i być rozwiązywany w różnym czasie 
(przy definicji funkcji lub przy jej aplikacji). Już takie pobieżne 
rozpatrzenie tematu daje 3 sensowne możliwości (wartość/kopia ewaluowana 
w czasie definicji, wartość/kopia ewaluowana w czasie aplikacji, 
referencja). *Gdybym* chciał mieć taki dostęp, to dla każdego z tych 
trzech wskazałbym przykład, gdzie byłoby to "fajne" i gdzie ma sens.
I dla każdego z tych trzech potrzebowałbym różnej składni, żeby je 
rozróżnić.
I nowy Perl gotowy.

(Popraw mnie, jeśli się mylę. Z tego co zauważyłem, to Emacs Lisp 
odwołuje się do zmiennych z zewnętrznego zakresu w czasie aplikacji 
lambdy a nie w czasie jej definiowania. Chciałem w jednej procedurze 
stworzyć keymapę z lambdą tak, aby była dostępna później - niestety, 
wtedy już nie ma tych zmiennych, które istniały w czasie definiowania 
lambdy. Żeby wymusić ewaluację zmiennej w czasie definiowania lambdy a 
nie w czasie jej aplikacji, musiałem posklejać całość z konstrukcji typu 
(list 'lambda ...) - to właśnie pokazuje, że arbitralny wybór reguł 
widoczności nie musi być tym, co akurat będzie potrzebne. Chyba każde 
rozwiązanie prowadzi do nowego Perla.)

> W modelu C++ można sobie wyobrazić tylko półśrodek: tzw. downward
> closures

To słabą masz wyobraźnię. Ten temat był wałkowany kilka razy na 
comp.lang.c++.moderated. Paru ludzi miało ciekawe pomysły na ogólną 
implementację tego tematu.
Pytanie, czy to jest potrzebne. Nie w sensie teoretycznym (czyli: mamy 
paru gości, którzy się świetnie bawią i piszą na ten temat artykuły), 
ale praktycznym (czyli: używamy tego w realnych projektach, z realnymi 
procesami i standardami kodowania).

> Model C++ jest zakonserwowany w C++, a poza tym martwy: żaden
> projektant innego języka go nie wybiera dla nowych projektów.
> I bardzo dobrze.

(błąd logiczny - nie jesteś w stanie udowodnić tego, że "żaden 
projektant...", natomiast wskazanie co najmniej jednego projektanta, 
który tak właśnie robi, jest trywialne - również przez ogłoszenie, że 
samemu się właśnie zaczęło to robić)

Ada ma taki sam model. Co najważniejsze - zarówno Ada jak i C++ były 
tworzone w czasie, gdy "Twój" model był już znany (również GC, itp.). 
Czyli brak tych ficzerów to nie jest kwestia anachroniczności danych 
języków, ale raczej świadomych wyborów. Inna sprawa, że cele 
projektantów też ulegają ewolucji i np. dzisiaj jest duża presja na 
wprowadzenie GC do C++ (Ada i tak ma opcję GC, z której korzystają 
kompilatory produkujące kod dla... JVM, ale lambdy tam nie ma i nie 
będzie). Co z tego będzie? Nie wiem.


-- 
Maciej Sobczak : http://www.msobczak.com/
Programming    : http://www.msobczak.com/prog/
Technical Details
Message-ID: <dkfmp9$msh$1@sunnews.cern.ch>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!newsfeed01.sul.t-online.de!t-online.de!news.belwue.de!irazu.switch.ch!news-zh.switch.ch!switch.ch!cernne03.cern.ch!cern.ch!news
References: <djfrn5$i55$1@nemesis.news.tpi.pl> <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> <slrndmk3v4.p01.jajcus@serwis2.beta> <dkd731$2u6$1@sunnews.cern.ch> <87psphsc6n.fsf@qrnik.zagroda> <dkf5da$d8g$1@sunnews.cern.ch> <87mzkk8xc0.fsf@qrnik.zagroda>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!newsfeed01.sul.t-online.de!t-online.de!news.belwue.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: Fri, 04 Nov 2005 14:13:13 +0100
Organization: CERN - European Laboratory for Particle Physics
Lines: 90
Message-ID: <dkfmp9$msh$1@sunnews.cern.ch>
References: <djfrn5$i55$1@nemesis.news.tpi.pl> <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> <slrndmk3v4.p01.jajcus@serwis2.beta> <dkd731$2u6$1@sunnews.cern.ch> <87psphsc6n.fsf@qrnik.zagroda> <dkf5da$d8g$1@sunnews.cern.ch> <87mzkk8xc0.fsf@qrnik.zagroda>
NNTP-Posting-Host: abpc10883.cern.ch
Mime-Version: 1.0
X-Trace: sunnews.cern.ch 1131109993 23441 (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: <87mzkk8xc0.fsf@qrnik.zagroda>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit