Article View: pl.comp.os.linux.programowanie
Article #60143Re: Jak zrobić program obliczający dużą silnię?
From: Maciej Sobczak
Date: Fri, 04 Nov 2005 13:13
Date: Fri, 04 Nov 2005 13:13
90 lines
6187 bytes
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!newsReferences:
<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