IT pro otrlé

O lidech, o vztazích, o politice, o názorech, o opicích a o ufonech.

Moderátor: Faskal

Odpovědět
Uživatelský avatar
York
Příspěvky: 11647
Registrován: 24. 2. 2012, 17:31

Re: IT pro otrlé

Příspěvek od York » 24. 5. 2019, 19:47

Anonymní funkce je prostě jen nepojmenovaná funkce. Tzn. nemůžeš ji zavolat, ani se na ni jakkoliv jinak odkázat jinak, než na místě, kde ji definuješ - až na to, že to není vždycky pravda.

Třeba v tom mém příkladu jsem tu fuknci hned přiřadil do proměnné component.onClose, čili od té chvíle ji můžu zavolat přes component.onClose(). Podobně když ji předáš jako parametr do nějaké funkce, tak uvnitř té nějaké funkce se na ni můžeš odkazovat přes jméno toho parametru. Striktně anonymní je tudíž asi jen funkce, kterou rovnou zavoláš - pak z ní máš jen návratovou hodnotu a případné side effecty.


"Dědičnost z nadřazené funkce" (tzn. to, že s ní sdílí proměnné) není vlastnost anonymity funkce, ale toho, že je to closure. V Javascriptu je to tuším tak, že když napíšeš funkci do jiné funkce, tak je to vždycky closure (arrow funkce se liší jen v tom, že můžeš vyjmenovat, které proměnné chceš capturnout, zatímco nearrow funkce capturne automaticky všechny, které vidí v kontextu, kde je ... hmm, definovaná nebo zavolaná? Jedno z toho.). V zásadě ale může existovat jazyk (a nejspíš taky existuje), kde může existovat anonymní funkce, která necapturuje proměnné, tj. to není closure.
Naposledy upravil(a) York dne 24. 5. 2019, 19:48, celkem upraveno 1 x.

Uživatelský avatar
Sosacek
Příspěvky: 21507
Registrován: 14. 7. 2004, 18:30

Re: IT pro otrlé

Příspěvek od Sosacek » 24. 5. 2019, 19:47

Anonymni funkce je proste funkce co nema jmeno, proto je anonymni - v lambda kalkulu jsou treba vsechny funkce anonymni (a vede to na masivni psycha, jako y kombinator).

Mit funkci co nema jmeno je uzitecne pokud ji nekam posilas - typci ukazuji callbacky, ale mnohem lepsi priklad jsou funkce vyssich radu jako map, reduce, fold, filter, etc.

Priklad:

Kód: Vybrat vše

>>> l = [1, 2, 3]
[1, 2, 3]
>>> map(lambda x: x+1, l)
[2, 3, 4]
Mam list l, moji funkci, ktera pricte k cislu jednicku (to lambda x slouzi k tomutez co zavorky v js), a zabudovanou funkci vyssiho radu map, ktera dostane funkci, aplikuje ji na kazdou polozku seznamu a vrati mi vysledek. Funkce vyssich radu jsou chytre - moje prace je rict, co se deje s jednou veci, prace autora mapy je rict jak vzit funkci a aplikovat ji na vsechno.

Muzes to napsat takhle:

Kód: Vybrat vše

>>> l = [1, 2, 3]
[1, 2, 3]
>>> def add1(x):
...     return x+1
... 
>>> map(add1, l)
[2, 3, 4]
ale neni duvod to delat - ta funkce je na jedno pouziti. Nema jmeno, protoze ho nepotrebuje. A dokonalosti neni dosazeno ne kdyz neni co pridat, ale kdyz neni co odebrat. Vec na jedno pouziti si jmeno nezaslouzi.

Viz https://en.wikipedia.org/wiki/Anonymous_function
And, for an instant, she stared directly into those soft blue eyes and knew, with an instinctive mammalian certainty, that the exceedingly rich were no longer even remotely human.
-- William Gibson, Neuromancer, 1984

Uživatelský avatar
Sosacek
Příspěvky: 21507
Registrován: 14. 7. 2004, 18:30

Re: IT pro otrlé

Příspěvek od Sosacek » 24. 5. 2019, 19:48

York píše:
24. 5. 2019, 19:47
"Dědičnost z nadřazené funkce" (tzn. to, že s ní sdílí proměnné) není vlastnost anonymity funkce, ale toho, že je to closure. V Javascriptu je to tuším tak, že když napíšeš funkci do jiné funkce, tak je to vždycky closure (arrow funkce se liší jen v tom, že můžeš vyjmenovat, které proměnné chceš capturnout, zatímco nearrow funkce capturne automaticky všechny, které vidí v kontextu, kde je ... hmm, definovaná nebo zavolaná? Jedno z toho.). V zásadě ale může existovat jazyk (a nejspíš taky existuje), kde může existovat anonymní funkce, která necapturuje proměnné, tj. to není closure.
Tak to muzes rovnou vysvetlit co je to closure, heh.

EDIT: https://en.wikipedia.org/wiki/Closure_( ... ogramming)
And, for an instant, she stared directly into those soft blue eyes and knew, with an instinctive mammalian certainty, that the exceedingly rich were no longer even remotely human.
-- William Gibson, Neuromancer, 1984

Uživatelský avatar
OnGe
malý zelený křečopažout
Příspěvky: 10379
Registrován: 5. 2. 2010, 09:27
Bydliště: Prdelná lhota (čti Praha)
Kontaktovat uživatele:

Re: IT pro otrlé

Příspěvek od OnGe » 24. 5. 2019, 21:10

Eleshar_Vermillion píše:
24. 5. 2019, 14:28
K čemu jsou (ve zkratce) přesně dobré anonymní funkce?
Do podrobna už to tu bylo, ale jelikož jsi to chtěl ve zkratce:

- když chceš udělat něco, na co potřebuješ funkci, ale nebudeš ji potřebovat nikde jinde. Typicky callback, nebo nějaký generátor.
- když si tu funkci dáš do proměnné, abys ji nemusel pojmenovávat a pojmenuješ místo toho proměnnou. Což je super, protože tam pak můžeš přiřadit jinou funkci a ono to bude dělat něco jiného. Takže si pak nemůžeš být jistý, co ta funkce v té proměnné zrovna dělá. Čímž se dostáváme k 3. bodu:
- když to chceš znepřehlednit a přidělat někomu práci. Ideální pro soukromé věci.

Takže kromě callbacků to nebývá moc potřeba.
Nežít je jediná životní prohra

výběr z vlastní zahrádky:



:idea: RPG kuchyně: 2010 - 2013 - 2017
:?: Horní progressbar - to se budete divit... možná
:?: Dolní progressbar - dávám tomu rok... maximálně dva

Uživatelský avatar
Eleshar_Vermillion
černá eminence
Příspěvky: 14181
Registrován: 18. 6. 2003, 20:31
Bydliště: Praha

Re: IT pro otrlé

Příspěvek od Eleshar_Vermillion » 24. 5. 2019, 21:20

OK, furt jsem jen teoretik. Vyrozuměl jsem, že smyslem samostatné funkce/procedury jest, aby ji šlo volat z různých míst a člověk nemusel jak kokot psát/kopírovat stejnou věc na více místech (nemluvě o problémech s údržbou). Rozumím-li správně pojmu callback, tak jde o to, že dávám samotnou funkci jako argument jiné proceduře, ale tam bych očekával, že by mělo stačit narvat někam dříve do modulu a jen předat výsledek?
\\[T]// PRAISE THE SUN! \\[T]//

Uživatelský avatar
York
Příspěvky: 11647
Registrován: 24. 2. 2012, 17:31

Re: IT pro otrlé

Příspěvek od York » 24. 5. 2019, 21:30

OnGe píše:
24. 5. 2019, 21:10
Což je super, protože tam pak můžeš přiřadit jinou funkci a ono to bude dělat něco jiného.
Jo, jak píše OnGe, to je zrovna věc, který se je obecně dobrý vyhejbat :-)

Jsou ale výjimky - třeba právě různý handlery, onClick() a podobně. A pak libovolnej polymorfismus (tam teda ty handlery spadaj taky).

Uživatelský avatar
Resurrection
Příspěvky: 4700
Registrován: 26. 9. 2006, 10:34

Re: IT pro otrlé

Příspěvek od Resurrection » 25. 5. 2019, 06:11

Eleshar_Vermillion píše:
24. 5. 2019, 19:30
Takže je za tím furt snaha mít věci, které patří k sobě, zřetelně u sebe v jedněch závorkách (tj. v rámci jedné funkce, která to... enkapsuluje?
Přesně toto. Nic víc, nic míň. Ať už je to ten callback nebo ty různé map/reduce/sort/for_each, kam dáváš funkci (vlastně taky callback) co manipuluje jen jeden element. Chceš to všechno mít na jednom místě, abys pak nemusel lovit někde v jinym kódu funkci, která to dělá. Což ale samozřejmě je možné a taky se to dělá. Funkce je funkce, ať už anonymní nebo ne.
a dědí věci z té nadřazené funkce?
To už je detail a je to na tobě. Buď si do toho "capture list" (ty hranaté závorky) něco dáš nebo nedáš, pokud to tvůj jazyk umožňuje. Některé prostě vezmou všechno kolem ať chceš nebo ne a ty hranaté závorky ani nemají (nepotřebují).
ale s tím, že dotyčná procedura už se nejspíš jinde neopakuje, takže ji nepotřebuju pojmenovávat?
Což je nejtypičtější důvod, proč to dělat. Ale jak bylo řečeno, lze to stejné dělat i normálníma (pojmenovanýma) funkcema. Onge to nedoporučuje používat, jiní ano. Tisíc programátorů, tisíc názorů. :-)

EDIT: Dám ještě jeden jednoduchý příklad srovnání, tentokrát v JS:

Nejdřív neanonymně:

Kód: Vybrat vše

function print(message)
{
    console.log(message)
}

function noAnonymous()
{
    var array = [1,2,3,4,5]
    for(var i in array)
   {
       print(array[i])
   }
}
A teď anonymně:

Kód: Vybrat vše

function anonymous()
{
    var array = [1,2,3,4,5]
    array.forEach(function(element) { console.log(element) })
}
Je to možná kratší, ale funkčně je to totéž.
Secrets are power.

Uživatelský avatar
York
Příspěvky: 11647
Registrován: 24. 2. 2012, 17:31

Re: IT pro otrlé

Příspěvek od York » 25. 5. 2019, 11:06

Resurrection píše:
25. 5. 2019, 06:11

Kód: Vybrat vše

function print(message)
{
  console.log(message)
}

function noAnonymous()
{
  var array = [1,2,3,4,5]
  for(var i in array)
  {
    print(array[i])
  }
}
Lepší je použít operátor 'of', ten iteruje rovnou values. Používání 'var' by ti měl zakázat linter (vždycky let nebo const). Navíc v tomhle případě tu funkci print() vůbec nepotřebuješ, takže by to vypadalo takhle:

Kód: Vybrat vše

function noFunction()
{
  const array = [ 1, 2, 3, 4, 5 ];

  for (const item of array)
  {
    console.log(item);
  }
}

edit: Nebo dokonce takhle:

Kód: Vybrat vše

function noFunction()
{
  for (const number of [ 1, 2, 3, 4, 5 ])
  {
    console.log(number);
  }
}
edit2: Ještě jsem přejmenoval tu iterační proměnnou - 'number' líp vystihuje, co vlastně iterujeme a printujeme, takže se to pak snáz čte.
Naposledy upravil(a) York dne 25. 5. 2019, 11:13, celkem upraveno 1 x.

Uživatelský avatar
Sosacek
Příspěvky: 21507
Registrován: 14. 7. 2004, 18:30

Re: IT pro otrlé

Příspěvek od Sosacek » 25. 5. 2019, 11:13

Ja myslim, ze hrat code golf nebyla pointa.
And, for an instant, she stared directly into those soft blue eyes and knew, with an instinctive mammalian certainty, that the exceedingly rich were no longer even remotely human.
-- William Gibson, Neuromancer, 1984

Uživatelský avatar
York
Příspěvky: 11647
Registrován: 24. 2. 2012, 17:31

Re: IT pro otrlé

Příspěvek od York » 25. 5. 2019, 11:16

Sosacek píše:
25. 5. 2019, 11:13
Ja myslim, ze hrat code golf nebyla pointa.
To sice ne, ale psát čitelnej kód není nikdy od věci, takže proč ten příklad nevyužít. Navíc to dost souvisí s tím, kdy a proč používat anonymní funkce - při iteraci polí fakt ne, 'for...of' je mnohem přehlednější zápis než forEach('function() {}').

Uživatelský avatar
Eleshar_Vermillion
černá eminence
Příspěvky: 14181
Registrován: 18. 6. 2003, 20:31
Bydliště: Praha

Re: IT pro otrlé

Příspěvek od Eleshar_Vermillion » 25. 5. 2019, 15:46

Resurrection píše:
25. 5. 2019, 06:11

Kód: Vybrat vše

function anonymous()
{
    var array = [1,2,3,4,5]
    array.forEach(function(element) { console.log(element) })
}
Asi chápu - pointa je počítám v tom, že .forEach vyžaduje funkci a nelze dovnitř narvat jen tak nějaký kód.
Čili chci to v podstatě pokaždé, kdy používám něco, co volá funkci, ale používám to na jednom místě a už ji nebudu volat jinde.
\\[T]// PRAISE THE SUN! \\[T]//

Uživatelský avatar
York
Příspěvky: 11647
Registrován: 24. 2. 2012, 17:31

Re: IT pro otrlé

Příspěvek od York » 25. 5. 2019, 15:52

Eleshar_Vermillion píše:
25. 5. 2019, 15:46
Asi chápu - pointa je počítám v tom, že .forEach vyžaduje funkci a nelze dovnitř narvat jen tak nějaký kód.
Čili chci to v podstatě pokaždé, kdy používám něco, co volá funkci, ale používám to na jednom místě a už ji nebudu volat jinde.
V zásadě jo. Ale i tak má smysl tu funkci pojmenovat, protože jména funkcí slouží současně jako komentáře v kódu - řekneš tím, co se s tím elementem bude dít.

Kód: Vybrat vše

function named()
{
  const array = [ 1, 2, 3, 4, 5 ];
  
  array.forEach(print(element));
}

Uživatelský avatar
OnGe
malý zelený křečopažout
Příspěvky: 10379
Registrován: 5. 2. 2010, 09:27
Bydliště: Prdelná lhota (čti Praha)
Kontaktovat uživatele:

Re: IT pro otrlé

Příspěvek od OnGe » 4. 6. 2019, 11:51

Máte nějaký tip, jak dělat s javascriptem a nezbláznit se z toho?
Nežít je jediná životní prohra

výběr z vlastní zahrádky:



:idea: RPG kuchyně: 2010 - 2013 - 2017
:?: Horní progressbar - to se budete divit... možná
:?: Dolní progressbar - dávám tomu rok... maximálně dva

Uživatelský avatar
York
Příspěvky: 11647
Registrován: 24. 2. 2012, 17:31

Re: IT pro otrlé

Příspěvek od York » 4. 6. 2019, 12:09

OnGe píše:
4. 6. 2019, 11:51
Máte nějaký tip, jak dělat s javascriptem a nezbláznit se z toho?
Use Typescript.

edit: A tslint.

Uživatelský avatar
OnGe
malý zelený křečopažout
Příspěvky: 10379
Registrován: 5. 2. 2010, 09:27
Bydliště: Prdelná lhota (čti Praha)
Kontaktovat uživatele:

Re: IT pro otrlé

Příspěvek od OnGe » 4. 6. 2019, 12:40

Ptal jsem se, jak se z toho nezbláznit. Udělat si z interpretovaného jazyku kompilovaný mi nepřipadá jako dorbá cesta. Nebo v čem je to pak lepší?
Nežít je jediná životní prohra

výběr z vlastní zahrádky:



:idea: RPG kuchyně: 2010 - 2013 - 2017
:?: Horní progressbar - to se budete divit... možná
:?: Dolní progressbar - dávám tomu rok... maximálně dva

Odpovědět

Zpět na „Realita a pseudorealita“

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host