Názory k článku
Funkce v programovacím jazyku Lua - uzávěry
Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vlákno
#!/usr/bin/python
def generateClosure():
start = []
def function():
start.append('X')
print start
return function
f1 = generateClosure()
f2 = generateClosure()
f1(); f1(); f1(); f1()
f2(); f2(); f2(); f2()
vypise
['X'] ['X', 'X'] ['X', 'X', 'X'] ['X', 'X', 'X', 'X'] ['X'] ['X', 'X'] ['X', 'X', 'X'] ['X', 'X', 'X', 'X']V praxi se s timto omezenim da bez problemu zit.
Re: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vlákno2. Java má ten problém, že nutí uživatele vytvářet třídy i tam, kam se absolutně nehodí. Na tom se shodneme.
3. Jednodušší na používání asi často jsou, ale to neznamená je vhodné je často používat. Aby byl kód dobře čitelný, je vhodné jasně popsat vstupy a výstupy. K popisu vstupů logicky patří hlavička funkce, možné výstupy se často zjistí taky v hlavičce (alespoň typ návratové hodnoty). Sahat mimo funkci, ať už jde o globální proměnné nebo jiný nelokální prostor vždycky znamená zavádění chaosu do rozhraní funkce a k tomu by měl být safra dobrý důvod (viz bod 1).
Re: Uzávěry v Pythonu a jinde
celé vláknoad 3. A ono je někde zakázáno dokumentovat uzávěry? To se ke mě nedoneslo.
Re: Uzávěry v Pythonu a jinde
celé vlákno3. Zakázáno to jistě není. Přesto si myslím, že rozhraní funkce by mělo být uvedeno v hlavičce a co se týče parametrů, je tomu tak vždy. Zda bude dokumentace každé proměnné z vnějšku uzávěru v kódu obsažena a hlavně to, zda ta dokumentace zůstane platná i po každé změně v tom uzávěru, je otázka. Větší problém ale vidím v tom, že na tu vnější proměnnou může sahat i kdokoliv jiný a dělat si s ní, co se mu zamane. V takovém případě ta dokumentace té funkce samotné nebude moc platná.
Re: Uzávěry v Pythonu a jinde
celé vlákno"1. Callbacky jsou výjimka, která se počítá, jinak bych je přece neuváděl. map() a filter() chcete srovnávat s tím příkladem v článku? A z hlediska použití, nebo implementace?"
Tak dobře, třeba jiný příklad. CL-PPCRE je lispová knihovna, která implementuje regulární výrazy. Přesto, že je psaná v Lispu, je chvílemi rychlejší než implementace regulárních výrazů v Perlu (která je v Cčku, ale je nutno přiznat, že lépe zvládá některé okrajové případy - resp. případy, které by okrajové být měly). Kompiluje regulární výraz do stromu uzávěrů, který se zavolá se vstupními daty a běží pekelně rychle. S objekty a metodami by to asi tak dobře nešlo.
CL-PPCRE je v zásadě kombinátorová knihovna s předřazeným parserem. Viděl jsem i jiné podobné, třeba jednu pěknou XML knihovnu ve Scheme. Poměrně abstraktní, ale hezky to korespondovalo s doménou dotyčného problému. Tak nějak mi přijde, že použít místo toho ty pythoní konstrukce by bylo právě jako použít if a goto. (Jak přesně se v Pythonu parciálně aplikuje syntaxe? Nejde to, že? Aha!) Mimochodem, kombinátorové knihovny už lezou i do Pythonu. (PyParsing, třeba...)
Re: Uzávěry v Pythonu a jinde
celé vláknoCo je parciální aplikace syntaxe a proč by měla zajímat programátora v Pythonu? Pokud jde o tzv. currying, doporučuji podívat se na standardní modul functools, konkrétně na funkci partial(). To je koneckonců i lepší náhrada uzávěrů v některých případech (parametrizované callbacky).
Re: Uzávěry v Pythonu a jinde
celé vlákno... Ty knihovny neznám, takže nemohu posoudit, nakolik to hezky koresponduje s doménou problému, ...
... Implementace korutin v Pythonu existují také, ikdyž nevím, nakolik se dají srovnat s možnostmi Lua...
... Co a jak byste měl uvádět v Lua Vám předepisovat nebudu, tento jazyk neznám a je to Vaše věc..."Neznám, nemohu posoudit, nevím, neznám" - toho by jste se asi měl držet. Když nevím, neznám a nemohu posoudit, tak nevyvozuji závěry a nepoučuji ostatní. Namístě by bylo začít třeba tímhle: Structure and Interpretation of Computer Programs aspoň první dvě kapitoly. Je to učivo prvního ročníku na MITu. Opírat svoje přesvědčení o neznalost je totiž přinejmenším pochybné.
Re: Uzávěry v Pythonu a jinde
celé vlákno2. Nepřišel jsem poučovat jiné, ale diskutovat (to znamená i zkorigovat svoje názory, pokud se mýlím). Což jste možná nepochopil, stejně jako nechápete nebo nechcete chápat, co je slušná diskuse.
3. Za odkaz na text děkuji, ale raději bych fakt viděl nějaký praktický příklad. Ten jsem od Vás zatím neviděl, samé arogantní příspěvky a jinak nic (kromě tohohle odkazu, samozřejmě). Takhle působíte sice jako všeználek, ale s mizerným přínosem.
Re: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoMimochodem, není ten "funktor" v Pythonu jen "anonymní uzávěr" se složitou syntaxí (protože se musí definovat třída a konstruktor)? To by právě možná byl docela dobrý příklad toho, kdy je uzávěr lepší. :-)
3. Mezi metodou objektu sahající na atributy objektu a mezi funkcí sahající na bindingy se scopem širším než tělo její funkce v podstatě není žádný rozdíl. :-) Obojí představuje "šahání jinam než dovnitř funkce" a v obou případech je dotyčný binding vytvořen jinde než v těle funkce a jindy než při jejím volání. To je mimochodem důvod, proč se lexikální scope tolik ujal: Je mnohem čitelnější (je statický) než dynamický scope, vlastně je triviálně pochopitelný a intiutivní.
Re: Uzávěry v Pythonu a jinde
celé vláknoTen uzávěr bude někdy lepší a jindy ne. V tom příkladu z článku bych jednoznačně preferoval generátor.
3. V Pythonu je sahání na atributy objektu krystalicky jasné - vždycky předtím musím napsat self. (v Ruby se dá použít zavináč). U každé proměnné v uzávěru musím naopak přemýšlet, kde se vlastně vzala a proč. To mi přijde podstatně horší.
Re: Uzávěry v Pythonu a jinde
celé vláknoKaždá liška chválí svůj ocas. :-) Na tom není nic špatného, nicméně přirovnání s if a goto není moc na místě. if a goto jsou na "ose programovacích jazyků" na straně Turingova stroje, a musí se od nich jít "doprava" směrem k lambda kalkulu. Uzávěr je na straně lambda kalkulu, a dá se od něj jít jen "doleva" směrem k Turingovu stroji. Nicméně je mnohem mocnější, protože pomocí if a goto se vyšší řídicí struktury a abstrakce jako iterátory, funkce a podobně dělají mnohem hůře (preprocesorem? to už je vlastně kompilátor, že...), zatímco druhým směrem je to IMHO o dost jednodušší (viz Smalltalk).
A ještě bych rád upozornil, že ty pythoní konstrukce se do Lua dají dostat celkem snadno - pokud o ně stojíte -, zatímco s dohackováním tail callů a korutin à la Lua do Pythonu bych to viděl tak trošku bídně.
Re: Uzávěry v Pythonu a jinde
celé vláknoJá klidně věřím, že v Lua lze všechny možné konstrukce (tedy i ty pythonní) vcelku snadno implementovat, problém ale vidím v tom, že to je nové a nové vynalézání kola, přičemž to kolo není standardizované, takže se při každém setkání s ním musím přesvědčit, že to je skutečně to kolo, které znám. Ale to je samozřejmě obecný problém a je otázkou míry, co má být součástí jazyka.
Tail call je v Pythonu samozřejmě problém, ikdyž se naimplementovat dá, byť ne moc optimálně ani elegantně, třeba takto:
http://lambda-the-ultimate.org/node/1331#comment-15165
Implementace korutin v Pythonu existují také, ikdyž nevím, nakolik se dají srovnat s možnostmi Lua.
Re: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoV jazycích, ve kterých jsou *všechny* funkce first-class values, a tedy de facto proměnné s hodnotou typu function, je nesahání na proměnné se scopem širším než tělo funkce poměrně špatně realizovatelné. Nechcete doufám tvrdit, že v Lua bych uvnitř funkce, která používá funkci print(), měl na začátku funkce uvádět něco jako 'local_require("print")' nebo tak nějak?
Re: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoCo se srozumitelnosti týká: pokud někdo zkusí napsat bez "plnofunkční lambdy" například už zmíněné kombinátory parserů, dopadne to strašně (alespoň já to zkusil v Javě, a strašně to dopadlo; nemyslím, že to je jen můj problém). Zatímco v plně funkcionálních jazycích je to průhledné (přinejmenším pro někoho, kdo je ten který jazyk zvyklý číst) a hlavně o řád jednodušší.
Re: Uzávěry v Pythonu a jinde
celé vláknoRe: Uzávěry v Pythonu a jinde
celé vláknoAFAIK starsi Lispy mely obecne dynamickou platnost promennych, zatimco Common Lisp a Scheme maji lexikalni platnost promennych (a tedy plne closures).
Re: Uzávěry v Pythonu a jinde
celé vlákno(Coz jsou dnes asi nejrozsirenejsi dialekty Lispu.)
Re: Uzávěry v Pythonu a jinde
celé vláknoChybka?
celé vlákno"function jmeno(parametry) ... end je pouze syntaktickým cukrem ekvivalentním k zápisu promenna = function(parametry) ... end"
ale
"function jmeno(parametry) ... end je pouze syntaktickým cukrem ekvivalentním k zápisu jmeno = function(parametry) ... end"
(místo promenna je jmeno).
zabalte to
celé vláknoPerly typu ,,tyto jazyky tedy nemají speciální syntaxi pro třídy a objekty'' asi do zlateho fondu nikdo neda.
Re: zabalte to
celé vláknoRe: zabalte to
celé vláknoRe: zabalte to
celé vláknoRe: zabalte to
celé vláknoTakže -1 ;-)

