-
21. Data: 2011-10-16 16:44:51
Temat: Re: lambda, clojures
Od: Bronek Kozicki <b...@s...net>
On 15/10/2011 11:38, f...@g...SKASUJ-TO.pl wrote:
> Umialby ktos mi wytlumaczyć o co z tym chodzi, i np jak
> ewentalnie mogloby to sie przydac na gruncie c? Juz kiedys
czytaj tutaj
http://www.informit.com/guides/content.aspx?g=cplusp
lus&seqNum=254 i
dwie następne strony
B.
-
22. Data: 2011-10-16 17:11:56
Temat: Re: lambda i clojures
Od: " " <f...@g...SKASUJ-TO.pl>
teraz dla odmiany bez problemu wydaje sie zrozumialem o co ci chodzi
ale o ile tak to jest to dziwne (przynajmniej na gruncie c)
chodzi ci o cos takiego:
wskaznikDoFunkcji funkcjaOut()
{
int x;
int y;
return funkcjaIn() {
//uzywa tu x i y
}
}
to ze funkcjaIn chce dzialac na zmiennych z funkcji out
to mozna uznac jeszcze za dosyc naturalne (i nie ma
z tym semantycznie problemu, mozna np przeciagnac przez argumenty
dziwniejsze jest to ze ktos chce uzywac funkcjiIn po zniszczeniu
funkcjiOut - jesli tylko o to w tym chodzi to x i y mozna zrobic
statycznymi i osiagnie sie efekt ze wszystko ok chyba ze
chodzi o cos innego/wiecej
dalej nie rozumiem w jakich wypadkach to moze sie jakos specjalnie
przydac (moze sa jakies wypadki ale dla mnie to osobliwie nietypowe,
(musialbym sie zastanowic) chyab ze ta funkcja jest wstawiona jedna
w druga dla picu i mozna je traktowac jak rownolegle ktore chca
po prostu operowac na tych wspoldzielonych statikach
:/ troche dziwna sprawa
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
23. Data: 2011-10-16 17:56:45
Temat: Re: lambda i clojures
Od: Piotr Chamera <p...@p...onet.pl>
W dniu 2011-10-16 19:11, f...@g...SKASUJ-TO.pl pisze:
> teraz dla odmiany bez problemu wydaje sie zrozumialem o co ci chodzi
> ale o ile tak to jest to dziwne (przynajmniej na gruncie c)
>
> chodzi ci o cos takiego:
>
>
> wskaznikDoFunkcji funkcjaOut()
> {
> int x;
> int y;
>
> return funkcjaIn() {
>
> //uzywa tu x i y
>
> }
>
> }
> to ze funkcjaIn chce dzialac na zmiennych z funkcji out
> to mozna uznac jeszcze za dosyc naturalne (i nie ma
> z tym semantycznie problemu, mozna np przeciagnac przez argumenty
> dziwniejsze jest to ze ktos chce uzywac funkcjiIn po zniszczeniu
Jeśli spojrzeć na to tak, że funkcjaIn jest rezultatem zwracanym
przez funkcjaOut, to jest całkiem naturalne, że tego rezultatu
używamy nadal po zakończeniu działania funkcjiOut.
> funkcjiOut - jesli tylko o to w tym chodzi to x i y mozna zrobic
> statycznymi i osiagnie sie efekt ze wszystko ok chyba ze
> chodzi o cos innego/wiecej
to nie zadziała. Co się stanie w tym przypadku
jeśli a i b będą static?
(jakieś pseudo C, mam nadzieję, że zrozumiałe):
funkcja funkcjaOut(int a, int b)
{
return funkcjaIn(int x) {
return a * x + b;
}
}
funkcja1 = funkcjaOut(1 2);
funkcja2 = funkcjaOut(-2 5);
i rysujemy sobie wykres dwu funkcji:
for i = -10; i <= 10; i++ {
plot(funkcja1(i));
plot(funkcja2(i));
}
> dalej nie rozumiem w jakich wypadkach to moze sie jakos specjalnie
> przydac (moze sa jakies wypadki ale dla mnie to osobliwie nietypowe,
Korzystanie z tego jest naturalne, kiedy język udostępnia odpowiednie
mechanizmy...
> (musialbym sie zastanowic) chyab ze ta funkcja jest wstawiona jedna
> w druga dla picu i mozna je traktowac jak rownolegle ktore chca
> po prostu operowac na tych wspoldzielonych statikach
-
24. Data: 2011-10-16 20:19:19
Temat: Re: lambda i clojures
Od: Bronek Kozicki <b...@s...net>
On 16/10/2011 13:24, f...@g...SKASUJ-TO.pl wrote:
> nadal nie rozumiem tego cholerstwa, cos takirgo jak
> z tym licznikiem mozna zrobic na statycznych zmiennych
> wewnatrz funkcji, nie wiem jaka jest roznica miedzy tym
> co moznazrobic na tych zm statycznych a tym czego nie mozna
> zrobic i potrzebne sa te closures i wogole do czego
różnica jest taka że licznik statyczny jest zainicjowany raz i już,
czyli może "pochwycić" tylko jeden kontekst. Closure pochwyci nowy
kontekst za każdym razem gdy jest utworzone, ale zachowa go przy każdym
wykonaniu. To jest tak jakbyś sobie doczepił do wskaźnika na funkcję
wskaźnik na stos (jaki był w momencie utworzenia tego wskaźnika).
B.
-
25. Data: 2011-10-17 04:38:26
Temat: Re: lambda i clojures
Od: Maciej Pilichowski <P...@g...com>
On Sun, 16 Oct 2011 05:25:53 +0000 (UTC), " "
<f...@g...SKASUJ-TO.pl> wrote:
>a czym sie rozni od zwyklej normalnej 'niepowiazanej' funkcji?
W C masz cos takiego jak funkcje (globalne jakby nie patrzec) i
zmienne globalne, zgadza sie? I zmienne globalne sa dostepne do uzytku
wewnatrz funkcji.
No to zejdz o stopien nizej i dostaniesz funkcje lokalne (okreslone
wewnatrz innej funkcji) oraz zmienne lokalne. Rzecz w tym, ze jesli te
wewnetrzna funkcje gdzies zapamietasz, to ona z kolei bedzie pamietac
wartosc zmiennych lokalnych funkcji matki, nawet jesli dostep do tych
samych zmiennych juz jest dawno niemozliwy.
Func<double,bool> foo()
{
int x = 5;
return (int y) => y<x;
}
Funkcja matka tutaj to foo i tworzy ona metode, ktora wiaze sie ze
zmienna (lokalna) x. Po wygenerowaniu funkcji (czyli zakonczeniu
dzialania foo) nadal wygenerowana funkcja bedzie widziala wartosc x.
milego dnia, hej
--
Teraz JOW! -- wybory 2011: http://terazjow.pl
Moja wyprzedaz wszystkiego: ksiazki, plyty, filmy.
http://www.garaz.pol.pl/
-
26. Data: 2011-10-17 05:17:38
Temat: Re: lambda i clojures
Od: p...@p...onet.pl
> On 16/10/2011 13:24, f...@g...SKASUJ-TO.pl wrote:
> > nadal nie rozumiem tego cholerstwa, cos takirgo jak
> > z tym licznikiem mozna zrobic na statycznych zmiennych
> > wewnatrz funkcji, nie wiem jaka jest roznica miedzy tym
> > co moznazrobic na tych zm statycznych a tym czego nie mozna
> > zrobic i potrzebne sa te closures i wogole do czego
>
> różnica jest taka że licznik statyczny jest zainicjowany raz i już,
> czyli może "pochwycić" tylko jeden kontekst. Closure pochwyci nowy
> kontekst za każdym razem gdy jest utworzone, ale zachowa go przy każdym
> wykonaniu. To jest tak jakbyś sobie doczepił do wskaźnika na funkcję
> wskaźnik na stos (jaki był w momencie utworzenia tego wskaźnika).
>
>
> B.
ok, traza rozumiem, jesli wlasnie o to chodzi, tj o mozliwosc robienia sobie
instancji 'szablonowych' funkcji
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
27. Data: 2011-10-17 05:25:33
Temat: Re: lambda i clojures
Od: p...@p...onet.pl
> to nie zadziała. Co się stanie w tym przypadku
> jeśli a i b będą static?
> (jakieś pseudo C, mam nadzieję, że zrozumiałe):
>
> funkcja funkcjaOut(int a, int b)
> {
> return funkcjaIn(int x) {
> return a * x + b;
> }
> }
>
> funkcja1 = funkcjaOut(1 2);
>
> funkcja2 = funkcjaOut(-2 5);
>
> i rysujemy sobie wykres dwu funkcji:
>
> for i = -10; i <= 10; i++ {
> plot(funkcja1(i));
> plot(funkcja2(i));
> }
>
>
>
ok, dobry przyklad, zwlaszcza o ile o to wlasnie chodzi w tych closures
a mozliwe ze wlasnie o to, to powyzej mozna by zrobic tak by dzialalo
zalezy co robilby ten return na funkcji (zdaje sie ze wlasnie to robia
implementacje owych closures), ja ew predzej bym sie zastanowil czy
to warto miec wbudowane - ale odloze to rozwazanie do przyszlosci,
a chwilowo pozostane w zadowoleniu ze teraz wiecej kojarze o co chodzi,
tnx, pzdr
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
-
28. Data: 2011-10-17 06:32:28
Temat: Re: lambda i clojures
Od: Piotr Chamera <p...@p...onet.pl>
W dniu 2011-10-17 07:17, p...@p...onet.pl pisze:
>> On 16/10/2011 13:24, f...@g...SKASUJ-TO.pl wrote:
>
>>> nadal nie rozumiem tego cholerstwa, cos takirgo jak
>>> z tym licznikiem mozna zrobic na statycznych zmiennych
>>> wewnatrz funkcji, nie wiem jaka jest roznica miedzy tym
>>> co moznazrobic na tych zm statycznych a tym czego nie mozna
>>> zrobic i potrzebne sa te closures i wogole do czego
>>
>> różnica jest taka że licznik statyczny jest zainicjowany raz i już,
>> czyli może "pochwycić" tylko jeden kontekst. Closure pochwyci nowy
>> kontekst za każdym razem gdy jest utworzone, ale zachowa go przy każdym
>> wykonaniu. To jest tak jakbyś sobie doczepił do wskaźnika na funkcję
>> wskaźnik na stos (jaki był w momencie utworzenia tego wskaźnika).
>>
>>
>> B.
>
> ok, traza rozumiem, jesli wlasnie o to chodzi, tj o mozliwosc robienia sobie
> instancji 'szablonowych' funkcji
>
Możesz też pomyśleć o tym od strony języków obiektowych:
(w uproszczeniu) funkcja tworząca closure to konstruktor, przechwycony
stan zmiennych to stan obiektu, utworzona i zwrócona funkcja to metoda,
która na tym stanie operuje.
-
29. Data: 2011-10-17 07:18:25
Temat: Re: lambda i clojures
Od: "Stachu 'Dozzie' K." <d...@g...eat.some.screws.spammer.invalid>
On 2011-10-16, Piotr Chamera <p...@p...onet.pl> wrote:
> W dniu 2011-10-16 16:17, Stachu 'Dozzie' K. pisze:
>> On 2011-10-16, Piotr Chamera<p...@p...onet.pl> wrote:
>> [...]
>>> Ok mamy jedną funkcję, która korzysta ze statycznego licznika.
>>> Teraz potrzebujemy dwie funkcje, które korzystają z tego samego
>>> licznika - jedna go zwiększa, druga zmniejsza. W C to będzie
>>> wyglądało... ?
>>
>> Da się. Wydziela się takie funkcje do osobnej jednostki kompilacji,
>> a tam umieszcza zmienną static.
>>
>> Na prostych przykładach nie wyjaśnisz firowi jaka jest różnica między
>> domknięciem i funkcją z zestawem statycznych zmiennych, a bardziej
>> skomplikowanych nie pojmie, bo jest za głupi. W ogóle nie rozumiem czemu
>> z nim dyskutujesz.
>
> Słyszałem kiedyś coś takiego ,,nie ma głupich uczniów, są tylko
> nieodpowiedni nauczyciele" - próbuję siebie w roli nauczyciela :)
To poćwicz najpierw z kimś pojętniejszym :)
> A tak serio - siedzę nad nudną robotą i od czasu do czasu muszę sobie
> zrobić przerwę...
OK, to mi w zupełności wystarczy za powód. Sam czasem tak robię.
> Programistą nie jestem, robię to tylko hobbystycznie,
> C nie znam prawie wcale, ostatnio w wolnym czasie uczę się Lispu
> i pomyślałem, że może spróbuję podać jakiś prosty przykład a dyskusja
> się rozwinie i pojawią się jakieś ciekawsze przykłady albo nowe dla
> mnie zagadnienia.
Ciekawszym byłby przykład, gdy z funkcji zwracasz funkcję (czy zestaw
funkcji), która coś robi ze swoim własnym licznikiem. Żeby dało się mieć
cztery czy pięć liczników naraz. To już by pokazywało dlaczego
domknięcia są silniejszym mechanizmem niż zmienne static, czy to lokalne
(jedna na wszystkie wywołania funkcji), czy to globalne (zmienna ukryta
i niedostępna dla innych jednostek kompilacji).
--
Secunia non olet.
Stanislaw Klekot
-
30. Data: 2011-10-17 07:20:50
Temat: Re: lambda i clojures
Od: "Stachu 'Dozzie' K." <d...@g...eat.some.screws.spammer.invalid>
On 2011-10-16, Piotr Chamera <p...@p...onet.pl> wrote:
[...]
>> dalej nie rozumiem w jakich wypadkach to moze sie jakos specjalnie
>> przydac (moze sa jakies wypadki ale dla mnie to osobliwie nietypowe,
>
> Korzystanie z tego jest naturalne, kiedy język udostępnia odpowiednie
> mechanizmy...
Ano jest naturalne. W Perlu używałem domknięć przez całkiem długi czas
w ogóle nie wiedząc co to jest domknięcie.
--
Secunia non olet.
Stanislaw Klekot