Article View: pl.comp.lang.c
Article #310204Re: Coroutines w (GNU) C
From: heby
Date: Thu, 30 Jan 2020 22:11
Date: Thu, 30 Jan 2020 22:11
130 lines
7239 bytes
7239 bytes
On 30/01/2020 00:54, Maciek Godek wrote:
>> Może sobie mieć. Istotne jest że stan ten nie przecieka nigdzie poza nią.
> W korutynach właśnie przecieka.
> Jeżeli mam:
>
> int c() {
> while(1) {
> yield(1);
> yield(2);
> }
> }
> to jaka będzie wartość wyrażenia c()?
1 i 2. W zależności od numeru wywołania. Gdzie tu wycieka jakiś stan
wewnetrzny? Napisałeś generator. Generator generuje. Dostałeś co
chciałeś. W czym problem?
>> Własnie odkryłeś że funkcje pure mogą mieć mutowalne, prywatne zmienne w
>> środku i dalej być pure.
> Mylisz "funkcje pure" z hermetyzacją.
Nie, nie mylę.
Pure function [...] Its evaluation has no side effects (no mutation of
local static variables, non-local variables, mutable reference arguments
or I/O streams).
Nic to nie piszą o tym że nie wolno mutować lokalnych zmiennych. Ale
spokojnie, to tylko internet, na pewno kłamią.
>>> A czysta funkcja robi tylko jedno: odwzorowuje wejście w wyjście. Zawsze dla tego samego wejścia ma dać to samo wyjście. Nie ma stanu wewnętrznego.
Korutyna może być pure gdy nie mutuje świata poza nią. Ale nie jest
fukcją tylko generatorem. Czyli ma *wiele* wyjśc a nie jedno. Ot i cała
tajemnica.
Twoje rozwiązanie ze zmiennymi statycznymi powoduje że nie jest pure. To
nie powoduje że nie działa. To powoduje tylko tyle że jest mało
użyteczne w świecie gdzie "pure" jest preferowane ... czyli prawie wszędzie.
> Funkcji nie da "się zatrzymać", bo ona "się nie wykonuje".
> Ona odwzorowuje wejście w wyjście,
Korutyne da się zatrzymać. Taka jej istota. Da się ją w tym stanie
przeplatać z innymi korutynami, ba nawet tymi samymi ale pracującymi z
innym kontekstem (w normalnych implementacjach: stosem).
I korutyna może ale nie musi zwracać nic, jedną lub wiele wartości.
>> Bycie pure to nie jest nie posiadanie kompletnie żadnego stanu. To jest
>> nie ingerowanie w stan poza tą funkcją. W C/C++ do tego używa się
>> zazwyczaj stosu.
> Może lepiej idź już spać.
Radze poczytać internety w kwesti co to jest pure.
Korutyna to nie jest funkcja w rozumieniu "pure function" ale moze byc
"pure coroutine".
Twoje nie są z powodu fundamentalnego błedu implementacyjengo w jump
oriented programming. Moje z boosta mogą, ale nie muszą być "pure". Mam
wybór.
>> To zabawne, bo moje korutyny też nie mają. Robią yield() i z ich puktu
>> widzenia nic się nie stało, jadą dalej.
> Jeżeli "jadą", to mają przebieg sterowania.
> Przebieg sterowania to jest właśnie "jechanie".
> I ono jest czymś istotnym dla korutyny.
Zaś kolor niebieski jest niebieski.
> Tutaj masz, proszę, poczytaj sobie:
> https://www.quora.com/What-is-functional-programming/answer/Panicz-Godek
Mam kilka książek, niektóre nawet czytałem. Dziękuję.
>> Korutyna zachowuje się jak funkcja z wieloma punktami wyjścia i
>> hermetycznym stanem pomiędzy.
> Funkcja nie ma czegoś takiego jak "punkt wyjścia". Funkcja odwzorowuje dziedzinę w przeciwdziedzinę.
Widzisz, problem jest w tym że jesteś czepialski i nie rozumiesz metafor.
Nie, korutyna nie jest funkcją ani nie ma obowiązku być pure.
To o co chdozi w tej dyskusji to fakt że:
a) moje korutyny mogą być bez side effectów i znimi, mam wybór
b) Twoje, z powodu dziadowskiej implementacji, mogą mieć tylko side
effecty lub wymagają dodatkowego kodu do zarządzania ich stanem, pzoa
tym posiadają masę wad, wszystkie wymienione na wiki.
> Pierdolić potrafi każdy.
Dlatego masz pełne prawo pisać na usenecie dowolnie bezuzyteczne kawałki
kodu, ale musisz pamietać że reszta świata może i ma prawo a nawet
obowiązek popukać się w czoło.
> Kodu nie napiszesz, ale nie dlatego, że to "poniżej godności", tylko dlatego, że to, co do tej pory mówiłeś o korutynach, nie miało sensu.
Napisałeś kod nazywając to "korutynami" który nie ma z nimi wiele
wspólnego. Zostałeś nawet z tego powodu wyśmiany, jak setki przed tobą
piszących ten sam kod, na głupiej wikipedii.
I mówisz że to co mówie nie ma sensu.
Nie miewasz przypadkiem czasem wrażenia że cały świat jest przeciwko Tobie?
> Określenie, żeby "odpalać naprzemiennie tę samą korutynę" jest całkowitą bzdurą.
Oczywiście. Dalej nie pojmujesz że istnieje coś takiego jak "kod" i
"kontekst wywołania".
W przypadku C tym konteksem jest stos.
Nic dziwnego że tego nie widzisz, twoje korutyny to kod i kontekst
zmielone razem w zmiennych statycznych.
> Naprzemiennie możesz odpalać dwie różne rzeczy
Widziałeś kiedyś dwa wątki pracujace na tych samych instrukcjach
maszynowych w tej samej pamieci, RÓWNOLEGLE?
To teraz użyj wyobraźni aby sobie wyobrazić że ta sama korutyna może
pracować na dwóch róznych kontekstach wywołania, naprzemiennie, nie
zakłucając się. boost to potrafi. Bo używa kontekstu stosu a nie
zmiennych statycznych.
> , a nie "dwie te same rzeczy", bo "dwie te same rzeczy" to jest jedna i ta sama rzecz.
Zgubiłem biedaku kontekst wywołania kodu i stąd te problem w pojmowaniu
dlaczego Twoje korutyny są tylko pośmiewiskiem na wikipedii.
Technical Details
Message-ID:
<r0vkb5$rj8$1@dont-email.me>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.samoylyk.net!news.uzoreto.com!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mailReferences:
<4375b52d-ba21-462a-8844-9bd1a02e9ece@googlegroups.com> <r0k8i5$ifg$1@dont-email.me> <ce3f0b08-658f-4248-b82c-09f093a7f20c@googlegroups.com> <r0kq6d$v6h$1@dont-email.me> <748c5d16-f4a8-43a0-8a56-bea0800e1e04@googlegroups.com> <r0n95e$35l$1@dont-email.me> <f3df206c-11d4-4b22-87ff-fc7aa00935f3@googlegroups.com> <r0nevq$9iq$1@dont-email.me> <ecae4ae1-0b06-4956-8df0-593fa0f1cd01@googlegroups.com> <r0njjv$740$1@dont-email.me> <0e0786af-7b58-4070-b8cd-81f1bda1f432@googlegroups.com> <r0q9iv$23b$1@dont-email.me> <b7cfec93-1d13-44e3-a924-0869447ed3c7@googlegroups.com> <r0seqp$av0$1@dont-email.me> <462689f9-f50d-4a96-8910-cb65757a017a@googlegroups.com> <r0st86$956$1@dont-email.me> <cc360fba-2eab-4928-8e14-36db20fa4a96@googlegroups.com> <r0sv2c$k80$1@dont-email.me> <c4bfeba1-23f9-4307-a084-078282879401@googlegroups.com> <r0t2t5$bun$1@dont-email.me> <ad3e2138-75af-4125-bb5e-ca7376fc8ef9@googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.samoylyk.net!news.uzoreto.com!eternal-september.org!feeder.eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail From: heby <heby@poczta.onet.pl> Newsgroups: pl.comp.lang.c Subject: Re: Coroutines w (GNU) C Date: Thu, 30 Jan 2020 23:11:50 +0100 Organization: A noiseless patient Spider Lines: 130 Message-ID: <r0vkb5$rj8$1@dont-email.me> References: <4375b52d-ba21-462a-8844-9bd1a02e9ece@googlegroups.com> <r0k8i5$ifg$1@dont-email.me> <ce3f0b08-658f-4248-b82c-09f093a7f20c@googlegroups.com> <r0kq6d$v6h$1@dont-email.me> <748c5d16-f4a8-43a0-8a56-bea0800e1e04@googlegroups.com> <r0n95e$35l$1@dont-email.me> <f3df206c-11d4-4b22-87ff-fc7aa00935f3@googlegroups.com> <r0nevq$9iq$1@dont-email.me> <ecae4ae1-0b06-4956-8df0-593fa0f1cd01@googlegroups.com> <r0njjv$740$1@dont-email.me> <0e0786af-7b58-4070-b8cd-81f1bda1f432@googlegroups.com> <r0q9iv$23b$1@dont-email.me> <b7cfec93-1d13-44e3-a924-0869447ed3c7@googlegroups.com> <r0seqp$av0$1@dont-email.me> <462689f9-f50d-4a96-8910-cb65757a017a@googlegroups.com> <r0st86$956$1@dont-email.me> <cc360fba-2eab-4928-8e14-36db20fa4a96@googlegroups.com> <r0sv2c$k80$1@dont-email.me> <c4bfeba1-23f9-4307-a084-078282879401@googlegroups.com> <r0t2t5$bun$1@dont-email.me> <ad3e2138-75af-4125-bb5e-ca7376fc8ef9@googlegroups.com> Mime-Version: 1.0 Injection-Date: Thu, 30 Jan 2020 22:11:49 -0000 (UTC) Injection-Info: reader02.eternal-september.org; posting-host="3716540961fe64618de2072a8fc60514"; logging-data="28264"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+rOtduJuoCdAfMD50tr4/1" User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.1 Cancel-Lock: sha1:rkRrX7aag6B3MMXImqCIVkqW6G8= In-Reply-To: <ad3e2138-75af-4125-bb5e-ca7376fc8ef9@googlegroups.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit