🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Pogaduchy o językach (było coś o dużej silni)

#60150
From: Marcin 'Qrczak' Kowalczyk
Date: Mon, 07 Nov 2005 14:19
76 lines
5348 bytes
Maciej Sobczak <no.spam@no.spam.com> writes:

>> To się nie skaluje do większych przykładów. Listowanie zmiennych
>> wolnych każdej lokalnej funkcji będzie przykre.
>
> I bardzo dobrze! O to właśnie chodzi, dokładnie tak samo jak z
> reinterpret_cast, static_cast, itd. - one też się nie "skalują" do
> większych przykładów. To *ma* wystawać z kodu i być widoczne.

Po co język ma do tego zniechęcać? Do reinterpret_cast rozumiem,
niech zniechęca, ale do lokalnych funkcji - nie.

Wyróżniać się powinny przede wszystkim operacje, które mają zachowanie
niezdefiniowane albo bardzo trudno przewidywalne, kiedy się ich źle
użyje. Tyle że w C++ jest ich za dużo, żeby to było praktyczne.

> A w sytuacji, gdy programista zrobi potwora na 20 takich zmiennych,
> to ma być wskazówką, że robi coś podejrzanego, bo np. usiłuje
> stworzyć kod zupełnie pozbawiony struktury.

Mój kod używa 7 zmiennych i koncepcyjnie nie jest potworny, a w C++
z Twoją hipotetyczną biblioteką wygląda potwornie. W czystym C++
wyglądałby jeszcze gorzej.

N zmiennych używanych przez funkcję lokalną jest tak samo potworne
albo niepoworne jak N zwykłych zmiennych lokalnych.

W tym przypadku sens lokalnych funkcji jest taki, że wynik części
instrukcji ma być wsadzony do środka wyniku pewnej zwykłej funkcji,
w miejsce zadecydowane przez ową funkcję. Ona nie tylko decyduje
o miejscu, ale też podaje pewnien parametr tym instrukcjom. Zatem
instrukcje są wyrażone lokalną funkcją, która jest przekazywana przez
argument do tamtej. Ten schemat jest użyty trzy razy w jednym miejscu.
Oczywiście wewnętrzne instrukcje używają parametrów funkcji, w której
to wszystko się dzieje, i jej zmiennych lokalnych.

> Jeżeli sam nie ma hamulców, to może chociaż dostanie po łapach
> podczas code review od kogoś, kto to będzie musiał przeczytać
> i zrozumieć.

Jasne, jeździjmy po ulicach z włączonym ręcznym. Hamulec - niech
będzie, ale tylko kiedy robię coś niestosownego, a nie cały czas.
Ograniczenie bardziej by się przydało przy guziku "autodestrukcja",
a tutaj akurat w C++ go brakuje.

>> Fajne, nie?
>
> Super. I co to pokazuje?

Że Twoja proteza nie pozwala stwierdzić, że C++ wspiera lokalne
funkcje. W języku, który je normalnie wspiera, są nieporównywalnie
wygodniejsze w użyciu niż przy pomocy Twojej konstrukcji. Różnica
w czytelności jest tak duża, że jedno rozwiązanie jest akceptowalne,
a drugie nie.

Czyli C++ z Twoim rozwiązaniem jeśli się uprzeć, to spełnia literę
wymagań, ale w taki sposób, że jest to prawie bezużyteczne. Powinieneś
być politykiem.

> Problem z tym przykładem polega na tym, że usiłujesz swój model
> wyrazić w C++ - koncentrujesz się na środkach a nie na celach.
> Gdybyś koncentrował się na celach, to zauważyłbyś, że wiele
> kompilatorów i translatorów było pisanych w C++ (i w czymkolwiek
> innym) i nikt takiej sieczki tam nie napisał (pomijając to, że
> w C++ nie ma lambdy).

Wypraszam sobie, oryginalny kod w moim języku nie był sieczką.

Oczywiście że można całość wyrazić całkiem inaczej. Ale dlaczego
miałbym być do tego zmuszony przez ograniczenia języka? Uważam mój
schemat za zgrabny, tylko C++ nie pozwala mi go sensownie zapisać.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID: <877jbkee0p.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> <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> <dkfmp9$msh$1@sunnews.cern.ch> <87ek5wt6iw.fsf@qrnik.zagroda> <dkj057$2bj$1@sunnews.cern.ch> <87mzkihhww.fsf@qrnik.zagroda> <dkn05f$91f$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: Pogaduchy o  językach (było coś o
 dużej silni)
Date: Mon, 07 Nov 2005 15:19:50 +0100
Organization: Klub Nieszkodliwych Manjaków
Lines: 76
Message-ID: <877jbkee0p.fsf@qrnik.zagroda>
References: <djfrn5$i55$1@nemesis.news.tpi.pl> <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> <dkfmp9$msh$1@sunnews.cern.ch> <87ek5wt6iw.fsf@qrnik.zagroda> <dkj057$2bj$1@sunnews.cern.ch> <87mzkihhww.fsf@qrnik.zagroda> <dkn05f$91f$1@sunnews.cern.ch>
NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1131373206 14922 217.96.225.87 (7 Nov 2005 14:20:06 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Mon, 7 Nov 2005 14:20:06 +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:KGn3IG62VfOTVOXMSaWj5YFMlLM=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit