-
X-Received: by 10.31.136.77 with SMTP id k74mr65763vkd.4.1503567513141; Thu, 24 Aug
2017 02:38:33 -0700 (PDT)
X-Received: by 10.31.136.77 with SMTP id k74mr65763vkd.4.1503567513141; Thu, 24 Aug
2017 02:38:33 -0700 (PDT)
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask
.pl!news.nask.org.pl!news.unit0.net!weretis.net!feeder6.news.weretis.net!feeder
.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews
.com!nntp.giganews.com!x187no412489ite.0!news-out.google.com!a26ni145qta.0!nntp
.google.com!v29no283068qtv.0!postnews.google.com!glegroupsg2000goo.googlegroups
.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Thu, 24 Aug 2017 02:38:32 -0700 (PDT)
In-Reply-To: <6...@g...com>
Complaints-To: g...@g...com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=213.192.95.134;
posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
NNTP-Posting-Host: 213.192.95.134
References: <f...@g...com>
<1...@g...com>
<7...@g...com>
<b...@g...com>
<a...@n...v.pl>
<2...@g...com>
<a...@n...v.pl>
<on23a3$85s$1@node1.news.atman.pl>
<a...@n...v.pl>
<on75ke$g4u$1@node2.news.atman.pl>
<5...@g...com>
<onfotu$lh6$1@node1.news.atman.pl>
<0...@g...com>
<3...@g...com>
<6...@g...com>
<c...@g...com>
<d...@g...com>
<5...@g...com>
<c...@g...com>
<3...@g...com>
<6...@g...com>
<c...@g...com>
<6...@g...com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <f...@g...com>
Subject: Re: Co jest nie tak z C++ (było: Rust)
From: g...@g...com
Injection-Date: Thu, 24 Aug 2017 09:38:33 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Lines: 262
Xref: news-archive.icm.edu.pl pl.comp.programming:211273
[ ukryj nagłówki ]W dniu czwartek, 24 sierpnia 2017 10:25:26 UTC+2 użytkownik Maciej Sobczak napisał:
> > Mogę podać inny przykład, bliższy temu, o czym tutaj jest mowa.
> >
> > for (int i = 0; i < ticks_per_frame; i++) {
> > for_each(in_seq(sectors), bind2nd(mem_fun(&Sector::update), 0.07));
> > for_each(in_seq(portals), bind2nd(mem_fun(&Portal::update), 0.07));
> > for_each(in_seq(ropes), bind2nd(mem_fun(&Rope::update), 0.07));
> > }
>
> Faktycznie koszmarek.
Najgorsze jest to, że Stroustrup sam do czegoś takiego zachęcał.
> > Dla odmiany taki chociażby Python pozwoliłby wyrazić te konstrukcje
> > np. tak:
> >
> > for instance in range(ticks_per_second):
> > for sector in sectors:
> > sector.update(0.07)
>
> A gdzieś tak od pół dekady C++ pozwala tak:
>
> for (Sector & s : sectors)
> s.update(0.07);
Niestety, owe przeboje miały miejsce ponad dekadę temu.
Z tego co widziałem, w późniejszym kodzie zrobiłem sobie
coś takiego:
for_every(body , bodies)
(*body)->update(0.07);
gdzie for_every zdefiniowałem sobie jako następujące makro:
#define for_every(ITERATOR, COLLECTION) \
for(typeof(COLLECTION.begin()) ITERATOR = COLLECTION.begin(); \
ITERATOR != COLLECTION.end(); ++ITERATOR)
aż się dziwię, że byłem wtedy na tyle mądry, żeby nie napisać
#define in ,
Ale to był już okres schyłkowy, po którym dałem sobie spokój z C++em
(poza tym, że czasem go trochę używałem, jak potrzebowałem np. tablicy
haszującej albo innej kolekcji odmiennej od tablicy i ew. listy linkowanej)
> > > Ale przecież operatory w Wolframie też można wypowiedzieć.
> > > Np. operator indeksowania (to te podwójne nawiasy) nazywa się
> > > Part.
> >
> > Dziwne. Nie przyszło mi do głowy, żeby [[_ ;; ;; _]] wymówić "Part".
>
> Dziwne. Tak się właśnie ten operator nazywa. Podobnie, + nazywa się Plus. Itd.
Że + nazywa się Plus, to bym jeszcze może odgadnął.
> > Prędzej wymówiłbym to jako "otwórz nawias kwadratowy, otwórz nawias
> > kwadratowy, coś, spacja, średnik, średnik, spacja, średnik, średnik,
> > spacja, coś, zamknij nawias kwadratowy, zamknij nawias kwadratowy".
>
> Jasne. A wywołanie funkcji w SmallTalku wymawiasz "ttl, otwórz
> nawias okrągły, coś, zamknij nawias okrąły". Nie silmy się na
> takie trolowanie.
Akurat w Smalltalku masz zupełnie inną składnię, w której nie ma nawiasów.
Na matematyce uczono mnie, żeby f(x) czytać jako "f od x" albo
"wartośćć f w punkcie x". Nie uczono mnie, jak czytać [[_ ;; ;; _]]
> > Wątpliwości w dalszym ciągu wzbudza rola podkreślnika po argumencie
> > po lewej stronie znaku ":=",
>
> To jest wzorzec, który akceptuje cokolwiek. Czyli jest to definicja funkcji, która
ma jeden argument dowolnego typu. Można wzorzec ograniczyć np tak:
Napisałem "wątpliwości", a nie "ciekawość" ;]
> oddsEvens[x_List] := ...
>
> i wtedy jest to funkcja, która ma jeden argument typu List.
> W tym przypadku można byłoby tak zrobić, ale wtedy taka funkcja działałaby tylko z
listami, a akurat nie tylko listy mają taką strukturę, którą moglibyśmy chcieć w ten
sposób uporządkować. Dlatego wolałem zostawić szerszy wzorzec.
>
> http://reference.wolfram.com/language/ref/Blank.html
>
> > oraz to, dlaczego do wyrażenia tożsamości
> > użyto symbolu powszechnie używanego w informatyce w roli przypisania.
>
> Bo to jest przypisanie. Tak się właśnie definiuje funkcje.
>
> http://reference.wolfram.com/language/ref/SetDelayed
.html
Może w Mathematice, ale nie w matematyce. W matematyce
do określania tożsamości używa się symbolu =. Tego samego
symbolu używa się w ISWIM czy Haskell (w taki sam sposób).
> > Podwójnych podwójnych średników też nie lubię.
>
> To napisz x[[1;;-1;;2]], wtedy będzie widać, że indeksowanie jest od 1 do końca. Ta
spacja między średnikami to opuszczone -1.
Włos na głowie jeży się coraz bardziej.
> > Zgadzam się.
> > Gdybyśmy zresztą nawet nie dysponowali funkcją Parts, moglibyśmy
> > ją sobie zdefiniować przy pomocy cons, car, cdr i rekurencji.
>
> I to jest właśnie coś, czego nie lubię.
> Indeksowanie jest naturalną operacją i dla komputera (w sensie: hardware) bardziej
podstawową. Dlatego wolę, jeśli język ją wspiera bezpośrednio.
>
> W ogóle, w naturze nie ma procesów rekurencyjnych.
> To jest na siłę wciskany ludziom kit, że rekurencja jest
> podstawą innych rzeczy. Dlatego języki promujące rekurencję
> jako podstawową konstrukcję są nienaturalne - zarówno w nauce,
> jak i w wykonaniu.
To nie jest wciskanie ludziom kitu. Rekurencja w ogólności
jest prostsza do zrozumienia dla ludzi. Jeżeli spojrzeć na
rzeczy, które dzieją się w logice, to praktycznie wszystkie
podstawowe aksjomatyki mają charakter rekurencyjny, a bardzo
wiele dowodów jest indukcyjnych. Istnieje wiele zagadnień,
na przykład w kombinatoryce i teorii języków, które
mają bardzo naturalny sposób wyrazu przy pomocy rekurencji,
i których wyrażenie bez rekurencji w praktyce wymaga
"emulowania rekurencji" (np. tworzenia jawnych stosów).
Z rekurencją jest jednak taki problem, że o ile przy programowaniu
funkcyjnym jest prosta, o tyle analiza programów proceduralnych
używających rekurencję potrafi przyprawić o zawrót głowy.
> > Że języki, które znamy, warunkują sposób, w jaki myślimy,
>
> Niezupełnie. Pierwszy język może to warunkować
> (i Wittgensteinowi chodziło o język naturalny).
> Natomiast później nasze myślenie może warunkować pozostałe wybory.
Nie sądzę, żeby Wittgensteinowi chodziło ściśle o język naturalny.
Wittgenstein pisał "Traktat Logiczno-Filozoficzny" pod silnym wpływem
pism Fregego, który stworzył swój własny formalizm do precyzyjnego
zapisywania myśli (który finalnie ewoluował w coś, co dzisiaj znamy
jako rachunek predykatów). Ciekawostką nieujętą w komiksie jest to,
że Frege traktował swoją pracę jako realizację idei Leibniza zwanej
"calculus ratiocinator" albo "characteristica universalis", polegającej
na stworzeniu rachunku opisującego ludzkie myślenie. (Od innej strony
-- właśnie języka naturalnego -- do tej idei podszedł profesor Andrzej
Bogusławski z Uniwersytetu Warszawskiego, którego praca zainspirowała
Annę Wierzbicką do rozwinięcia systemu zwanego "Naturalnym Metajęzykiem
Semantycznym", będącego próbą ekstrakcji podstawowych "atomów znaczeniowych"
pozwalających opisać ludzkie rozumienie. Ot, ciekawostka)
Nota bene ta historia (tzn. o Fregem i Wittgensteinie) została bardzo
ładnie opowiedziana w komiksie pt. Logicomix, wydanym również w
języku polskim (zdaje się że wydawnictwo W.A.B.)
I oczywiście, ja się z Tobą zgadam, że nie jest tak, że "wszystko
jest językiem" -- że nasze doświadczenie jest w dużej mierze pozajęzykowe.
Ale trochę prawdy jest w tym Wittgensteinowskim stwierdzeniu.
> > Nie wiem zresztą, czy miał przekonać. Raczej miał stanowić
> > ilustrację tego, w jaki sposób ta maksyma odzwierciedla się
> > w kontekście języków programowania. Sądzę, że -- mimo wszystkich
> > zarzutów, jakie wysnułeś, dotyczących rozwiązania wymyślonego
> > przez Kaya (i które nb nijak się mają do tego, co chciałem
> > zakomunikować) -- stanowi dobrą ilustrację.
>
> Tak. Kiepski język prowadzi do kiepskiego myślenia
> i w rezultacie do kiepskich programów. :-)
Tak. To jest wniosek na poziomie ogólnym.
Z kolei nieznajomość historii prowadzi do tego,
że nie rozumiemy wartości tego, co posiadamy.
Allen Newell to naprawdę był niegłupi facet,
ale w czasach "po wynalezieniu Lispa" trudno
zrozumieć, jak ktoś mógł wpaść na coś tak pokracznego,
jak IPL.
> > Skoro mowa o kontekście, może zamiast pokazywać przykład
> > w Mathematice, która stosunkowo niewiele różni się od ISWIMa z lat 60.,
> > może spróbowałbyś pokazać rozwiązanie tego zadania w nowoczesnym
> > języku, jakim jest C++, żebyśmy zobaczyli
>
> Dlaczego? Ty nie pokazałeś przykładu w C++. :-)
:)
Ja swoje stanowisko dotyczące C++ staram się jasno artykułować.
W moim odczuciu to nie jest dobry język do formułowania myśli.
W jakimś sensie jest to wartościowy eksperyment dla tych, którzy
potrafią się uczyć na cudzych błędach, bo wydaje mi się, że
nie ma błędu, którego projektanci C++ by nie popełnili.
Jeżeli Twój stosunek do C++ jest równie sceptyczny, co mój,
to może ten apel powinienem skierować do entuzjastów tego
języka. Ktoś się podejmie?
Następne wpisy z tego wątku
- 24.08.17 12:20 M.M.
- 24.08.17 13:02 g...@g...com
- 24.08.17 15:42 fir
- 24.08.17 15:46 g...@g...com
- 24.08.17 17:32 M.M.
- 24.08.17 18:10 fir
- 24.08.17 20:11 Mateusz Bogusz
- 24.08.17 21:24 fir
- 24.08.17 21:32 g...@g...com
- 24.08.17 23:48 Adam M
- 25.08.17 00:23 g...@g...com
- 25.08.17 01:12 M.M.
- 25.08.17 06:04 AK
- 25.08.17 06:05 AK
- 25.08.17 06:06 AK
Najnowsze wątki z tej grupy
- Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
Najnowsze wątki
- 2024-12-23 Riga => Specjalista ds. public relations <=
- 2024-12-23 Łódź => Specjalista ds. Sprzedaży <=
- 2024-12-23 Kraków => International Freight Forwarder <=
- 2024-12-23 Co nalezy do Cinkciarza, a co do Conotoxia ?
- 2024-12-23 Poznań => Key Account Manager <=
- 2024-12-23 Warszawa => Presales / Inżynier Wsparcia Technicznego IT <=
- 2024-12-23 Rzeszów => Spedytor Międzynarodowy <=
- 2024-12-23 Warszawa => Infrastructure Automation Engineer <=
- 2024-12-23 Białystok => Analityk w dziale Trade Development (doświadczenie z Po
- 2024-12-23 Warszawa => Site Reliability Engineer (SRE) <=
- 2024-12-23 Warszawa => DevOps Engineer <=
- 2024-12-23 Warszawa => Senior Account Manager <=
- 2024-12-23 Katowice => Regionalny Kierownik Sprzedaży (OZE) <=
- 2024-12-23 Katowice => Administrator IT - Wirtualizacja i Konteneryzacja <=
- 2024-12-23 Mińsk Mazowiecki => Spedytor Międzynarodowy <=