[python] cyklus for (bylo superman: zaporny systemovy cas)

Petr Prikryl PrikrylP na skil.cz
Středa Listopad 29 11:47:32 CET 2006


superman
> > Pokud jakákoliv konstrukce větvení nebo cyklu
> > neprovádí testy a jiné příkazy způsobem, který
> > by mohl mít za následek vedlejší efekt, a pokud
> > je tělo takové konstrukce prázdné, dá se úplně
> > vynechat.
> 
> Pokud testy volají funkci, pak jste s optimalizací 
> skončil. A for cyklus v Pythonu je veden tímto 
> směrem, dokonce range má v budoucnu vracet 
> iterátor, tedy funkci.

Pokud ta funkce nemá vedlejší efekt (což jsem zmínil)
pak ji ani nemusím volat, abych mohl celou konstrukci
vypustit. A můžu to udělat právě optimalizací v AST,
tedy jakoby na úrovni přeparsovaného zdrojového 
textu. Problém je, jak zjistit, že ta funkce nemá
vedlejší efekt.

Iterátor není funkce. Je to objekt. A jeho metoda
next() typicky nemá vedlejší efekt (pokud si ho
tam někdo sám nenaprogramuje).

Trošku horší je to s generátory, protože vecpat
tam vedlejší efekt (třeba print)... udělat tuhle
chybu můžeme jaksi přirozenějším způsobem ;o)

> > Ani v jazycích C/C++ neexistuje klasický cyklus
> > for. A co je to vůbec klasický cyklus for?
> > Ten co zavedl (nebo převzal) Pascal? 
> > Pro objektový přístup, který využívá různé
> > typy kontejnerů (nejen pole) je průchod přes 
> > indexy příliš speciální.
> 
> Python, který i pro cyklus přes lineární číselnou 
> řadu musí vytvářet sekvenci, nebo iterátor je jen 
> překážkou pro optimalizaci. Samozřejmě to jde 
> optimalizovat, ale je potřeba vědět speciální 
> objekty a sekvence a vidět dovnitř, tedy je to 
> špinavý přístup.

Konstrukce cyklu je navržena především pro
programátory, nikoliv pro jakýkoliv optimalizátor.
Z tohoto pohledu se ptám ještě jednou. Co to je
"klasický cyklus"? Je jeho speciálnost pro programátora
natolik důležitá, aby opodstatnila současnou 
existenci konstrukcí for/foreach? A v jakých 
jazycích se takový "klasický for" vlastně 
používá?

pepr


Další informace o konferenci Python