🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #310205

Re: Coroutines w (GNU) C

#310205
From: Maciek Godek
Date: Thu, 30 Jan 2020 22:58
115 lines
6740 bytes
W dniu czwartek, 30 stycznia 2020 23:11:51 UTC+1 użytkownik heby napisał:
> 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?

Miejsce zatrzymania jest stanem wewnętrznym.

> Napisałeś generator. Generator generuje. Dostałeś co 
> chciałeś. W czym problem?

Udostępniłem stan wewnętrzny konsumentowi.
Nie ma problemu. Tylko to nie jest "pure function".

> >> 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ą.

Jasne, możesz sobie robić co chcesz, jeżeli stan nie jest widoczny z zewnątrz.
A w przypadku powyższej korutyny stan jest widoczny z zewnątrz, bo albo jesteś w takim stanie, że dostaniesz 1, albo w takim, że dostaniesz 2.

> >>> 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.

?

Gdzie tak piszą?

> 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.

Gdzie "pure" co jest preferowane?
"Pure mineral water"?

> > 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).

Dlatego nie jest "czysta" w takim sensie, w jakim "czysta funkcja" jest "czysta".

> I korutyna może ale nie musi zwracać nic, jedną lub wiele wartości.

A czysta funkcja musi zwrócić wartość.

> >> 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.

No to dajesz linki do tych swoich internetów.

> Korutyna to nie jest funkcja w rozumieniu "pure function" ale moze byc 
> "pure coroutine".

Łooo!
I pewnie może też być "pure fun".

> >> 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

Nie mogą, bo yield jest side effectem. Chyba że nie jest, to wtedy nie są korutynami, tylko funkcjami.

> Nie miewasz przypadkiem czasem wrażenia że cały świat jest przeciwko Tobie?

Raczej nie.

> > 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.

Boost potrafi. Moje rozwiązanie nie potrafi (chyba że ktoś by chciał generować ten sam kod funkcji wielokrotnie z makra, ale to średni pomysł).
Dlatego problem, że "dwie te same korutyny będą sobie nawzajem nadpisywać stan", nie może wystąpić.
Technical Details
Message-ID: <81aea895-2ec2-4576-8de5-e01c1e392999@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin2!goblin.stu.neva.ru!aioe.org!peer03.am4!peer.am4.highwinds-media.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
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> <r0vkb5$rj8$1@dont-email.me>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a05:620a:16d6:: with SMTP id a22mr8093955qkn.266.1580425097210;        Thu, 30 Jan 2020 14:58:17 -0800 (PST)
X-Received: by 2002:a81:378e:: with SMTP id e136mr5509434ywa.261.1580425097005; Thu, 30 Jan 2020 14:58:17 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!goblin2!goblin.stu.neva.ru!aioe.org!peer03.am4!peer.am4.highwinds-media.com!peer01.iad!feed-me.highwinds-media.com!news.highwinds-media.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Thu, 30 Jan 2020 14:58:16 -0800 (PST)
In-Reply-To: <r0vkb5$rj8$1@dont-email.me>
Complaints-To: groups-abuse@google.com
Injection-Info: google-groups.googlegroups.com; posting-host=83.25.200.96; posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
NNTP-Posting-Host: 83.25.200.96
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> <r0vkb5$rj8$1@dont-email.me>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <81aea895-2ec2-4576-8de5-e01c1e392999@googlegroups.com>
Subject: Re: Coroutines w (GNU) C
From: Maciek Godek <godek.maciek@gmail.com>
Injection-Date: Thu, 30 Jan 2020 22:58:17 +0000
X-Received-Bytes: 7488
X-Received-Body-CRC: 1888510676
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit