#!/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.
"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...)
... 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é.
Kaž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ě.