No konecne. Jenom skoda, ze jste pri tom stihl urazit vsechny okolo, jak jsou arogantni, pritom se vas jen snazili upozornit na fakt, ze to nechapete.
No tak zase prrrrr, jo? Domníval jsem se, že makra umí NĚCO, přičemž to NĚCO je nadmnožinou toho, co makra umí SKUTEČNĚ.
Čili pokud jsem říkal, že mi to nijak krutopřísné (jak píše kolega) nepřijde, a že mi to nepřijde jako důvod mluvit o uživatelích ostatních jazyků jako o cvičených opicích a všemožně z nich dělat chudáky, kteří nic nechápou narozdíl od kasty lisp-superheroes, tak to pořád platí. Dokonce to platí ještě víc, jak jistě lehce nahlédnete. Jestli ne, napiště si na to makro. Bude to takový DSL a na to jsou přece makra boží!

Ten aha-zážitek spočívá v tém, že jsem teprve teď pochopil, proč se tak bráníte srovnání s evalem - no není divu, když eval je daleko silnější nástroj než makro:
def KlidneNejakaStatickaInicializace():
pass
def GenerateFlexibleClass(name,classhosting):
classCode = """class %s: # bez problemu pouzijeme lokalni kontext
def __init__():
KlidneNejakaStatickaInicializace() # bez problemu volame normalni funkce
"""%(name,)
classCode+=NactiKodZeSite(classhosting) # bez problemu nacteme kod odkud chceme, nejsme omezeni jenom na samotny zdrojak...
globals = {}
exec classCode in globals
return globals[name]
# tomuhle taky muzu rikat "upravil jsem si syntaxi jazyka" a "vytvoril jsem DSL"?
myFlexibleGeneratedClass = GenerateFlexibleClass("SuperClass","classfactory.testing.cz")
Kdyz jste nebyli schopni tu genialnost maker popsat strucne sami, tak jsem se na to teda trochu vic kouknul a treba za hezky povidani (i kdyz zbytecne moc dlouhy) povazuju tohle:
http://www.defmacro.org/ramblings/lisp.htmlCelou dobu jsem cekal, jaka bomba teda prijde - a po klasickem honeni trika, jak ho Lisp spasil a osvitil, prislo jenom tohle:
We can create macros for our to-do list items that will get called by lisp compiler and will transform the to-do list into code. Now our to-do list will be treated as code and will be executed. Suppose all we want to do is print it to standard output for the user to read:
(defmacro item (priority note)
'(block
(print stdout tab "Priority: "
~(head (tail priority)) endl)
(print stdout tab "Note: " ~note endl endl)))
Na tom je pěkně vidět, že
v jakémkoli jazyce jde udělat to samé pomocí evalu* - jednoduše z dat vygenerovat kód a ten evalovat. Akorát v tom jiném jazyce to není tak elegantní, zejména proto, že jiné jazyky se nezapisují jako derivační strom a taky proto, že nikdo neměl potřebu na to napsat nějaký elegantní vyjadřovací nástroj. Nikdo to totiž nepotřebuje.
(mimochodem - pořád nechápu, proč jste takový praktický příklad nemohli uvést hned na začátku, abysme si ušetřili tohle strašné martyrium...)
* a do jakéhokoli jazyka by se dal přidat preprocesor fungující v tom samém jazyce, kdyby to někdo byl býval chtěl
Uznávám, že je to rozhodně zajímavý koncept, ale přijde mi poněkud nebezpečný (hlavně pro znovupoužitelnost) a dost nepraktický pro ladění. Kupodivu mi to nepřijde ani nijak zvlášť zlepšující čitelnost (což má být ta hlavní výhoda)*. Není to ale hlavně nic, co by principielně nešlo v jiném jazyce - a to ***TÍM SPÍŠ***, že se to nespouští za běhu.
* protože místo abych se na jedno místo koukl, jak vypadá třeba třída, musím se koukat na deset maker, která jsou v tom zapojená.
Jinak podobně se vyjadřuje Pavel Tišnovský:
http://www.root.cz/clanky/lispova-makra-aneb-programovatelny-programovaci-jazyk/nazory/153290/ - hlavně pěkně stručně vyjádřil, jak značně přeháníte v těch svých superlativech o "vytvareni noveho jazyka" apod...
Takže tak asi no... Tak jsme si to vyjasnili a nemá asi smysl se v tom dál patlat...