Na co všechno je dobrý LISP?

Re: Na co všechno je dobrý LISP?
« Odpověď #195 kdy: 01. 04. 2011, 00:56:30 »
ta diskuze je jeste zoufalejsi nez vcera... ale neposled neco zkusim.

To je bohužel pravda.

makra v lispu vic nez nejakemu evalu jsou podobne preprocesoru, ktery je treba v cecku. stejne jako v cecku se nejdriv vyresi veci tykajici se podmineho prekladu a provede se expanze maker a az pak se preda kod prekladaci. tak stejne to funguje i v LISPu. ***nejdriv se provede expanze maker a pak se kod zkompiluje pripadne interpretuje***.

Shodou okolností jsem tenhle aha-zážitek právě teď udělal při čtení čehosi... Takže ok, přiznávám se, že jsem to vůbec nepochopil. 

Když jsem totiž slyšel, že "makrem se dá měnit překladač" a "makro je jako funkce", měl jsem prostě za to, že defmacro může figurovat kdekoli v kódu a odkazovat se na svůj kontext, nebo si třeba tahat parametry ze sítě a jánevímco... a tímpádem záleží až na běhu programu, kde a jak se spustí a co vyprodukuje. 

Přemýšlím, na čí straně byla chyba... Jestli na vaší, že jste nebyli schopní ze sebe tuhle jednu větu (***) vypotit dřív, nebo na mé straně, že jsem si nedokázal domyslet, že "změna překladače" znamená "změna textu programu".

V tom případě teda musím upravit tvrzení, že eval je stejně silný nástroj, jen trochu neohrabanější na tvrzení "eval je daleko silnější nástroj, i když trochu neohrabaný" - všechno, co se dá udělat makrem, se dá udělat evalem, ale ne naopak - a jediný rozdíl makra od evalu je v tom, že makro se spustí těsně před překladem, zatímco eval se spustí až v době běhu.

Tak to je škoda, myslel jsem, že ty makra jsou zajímavější...


JS

Re: Na co všechno je dobrý LISP?
« Odpověď #196 kdy: 01. 04. 2011, 06:44:58 »
JS: zase ta rekurze :-)
proc? protoze pro nektere problemy je to prirozeny zpusob (v tve reci tedy elegantni), napr. ono traverzovani stromu; bez tail rekurze to nebude obecne

No vzdyt ano! Ja s tim souhlasim (i kdyz funkcionalni programovani ma i dalsi vyhody nez jen v mnoha pripadech elegantni zapis). Ale pak tedy nechapu, proc by ti melo vadit, ze se to vnitrne prevede na neco, co funkcionalni neni (stezoval sis tam na to setf). Pokud se to prevede korektne, neni v tom zadny problem.

O tom to cele prece je. Makra dovoluji urcite dalsi abstrakce, a ty abstrakce mame jen proto, abychom dosahli elegantniho zapisu. O tom je mimochodem cela ta Grahamova knizka On Lisp.

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #197 kdy: 01. 04. 2011, 06:59:33 »
Shodou okolností jsem tenhle aha-zážitek právě teď udělal při čtení čehosi... Takže ok, přiznávám se, že jsem to vůbec nepochopil. 

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. (Jen na vysvetlenou - ja osobne necitim potrebu snazit se vysvetlovat neco nekomu, kdo si a priori mysli, ze necemu rozumi. On k tomu musi dojit nejdriv sam, ze udelal chybu - coz se nakonec zde stalo. Proto lze tezko udelat vic nez odkazat na literaturu. Stejny argument jako vam dal deda.jabko je i na zacatku kapitoly o makrech v Practical Common Lisp.)

Tak to je škoda, myslel jsem, že ty makra jsou zajímavější...

No a tady je zase stejna chyba jako predtim. Vy jste ted zjistil o co jde, ale uz predpokladate, co se s tim da vsechno delat. Zase jde o neznalost. Klasicke priklady na makra podava knizka On Lisp, a knizka Let Over Lambda jde jeste o neco dal. A to jsme jeste nediskutovali reader makra..

podlesh

Re: Na co všechno je dobrý LISP?
« Odpověď #198 kdy: 01. 04. 2011, 10:41:01 »
Já bych řekl, že jste v tom akorát udělali ještě větší zmatek.

No ale takhle to dopadne vždy, když se lidé hádají o věcech z principu iracionálních (v tomto případě: kdo je z čeho nadšený a proč) a navíc si ještě drze namlouvají že jen formulují racionální argumenty.

podlesh

Re: Na co všechno je dobrý LISP?
« Odpověď #199 kdy: 01. 04. 2011, 10:58:11 »
V tom případě teda musím upravit tvrzení, že eval je stejně silný nástroj, jen trochu neohrabanější na tvrzení "eval je daleko silnější nástroj, i když trochu neohrabaný" - všechno, co se dá udělat makrem, se dá udělat evalem, ale ne naopak - a jediný rozdíl makra od evalu je v tom, že makro se spustí těsně před překladem, zatímco eval se spustí až v době běhu.

Tak to je škoda, myslel jsem, že ty makra jsou zajímavější...
Já bych řekl že zásadní chyba je v pocitu že je tu eval NEBO makra - to je absurdní, eval je tam vždy, bez něj se v LISPu nic neprovádí. Zda se překládá nebo interpretuje není moc relevantní a je to spíš matoucí.
Spíš bych se zamyslel nad tím, kolikrát se vlastně provádí...

Jak jsem ale napsal v předchozím příspěvku, tady není moc věcí k diskusi - každý si sám musí najít vlastní důvod proč by z toho měl být nadšen a někdo prostě nadšen nebude. To je normální, viz např. umění.


Jakub Daněk

Re: Na co všechno je dobrý LISP?
« Odpověď #200 kdy: 01. 04. 2011, 11:29:38 »
O LISP jsem jen zavadil a jelikož jsem pro něj neměl využití, moc do hloubky jsem nešel.

Nicméně z debaty...

Mirek vám tu přece netvrdí, že LISP je špatný jazyk. Jen nesouhlasí (nebo řekněme chce se dozvědět, proč by to byla pravda), že je to super - uber - ultra - mega krutopřísný jazyk hodící se na vše a vždy a ostatní jazyky jsou pro pitomce.

Z mého pohledu - jazyk má svou sílu, tou je univerzálnost, rychlost... (doplňte už zmíněné v diskuzi). Ale má i velké slabiny (malá komunita, nejsou knihovny, kvalitní nástroje jsou placené).

Co mi z toho vyjde? Asi LISP nezvolím ve většině případů jako hlavní programovací jazyk. Proč si psát něco, co dobře funguje jinde? Nejde o to, jestli to svedu nebo ne, ale o tom, že se snad taky chceme někam posunout, tedy nevymýšlet kolo. Samozřejmě, pokud LISP znám, pak ho mohu použít jako část programu tam, kde se to hodí (zde záleží na náročnosti na propojení s ostatními jazyky, což si samozřejmě musím nastudovat sám).

A co tomu tady chybí? Příklad. Vždyť to nemusí být ani ukázka kódu. Reálný příklad z praxe složitého problému, popsaný slovy. Nástin implementace (opět, bez ukázky kódu) v lispu. V běžných jazycích si to jistě představíme sami. Věřím, že takové příklady z oboru UI existují (stejně jako například k Prologu, i když X server bych v něm asi nepsal). A nezlobte se na mě, učebnicové příklady na 10 řádků nikomu nic neřeknou.

Tahle diskuse by byla mnohem věcnější, kdyby si tu pár fanatiků hned na začátku nezačalo honit triko. Co si k takové komunitě totiž říct? "Hm... jazyk je to jiný (záměrně nepíši těžký), nějaká literatura k tomu je, ale co když něco nepoberu a budu se chtít zeptat? Dozvím se, že jsem cvičená opice s lepidlem?"

Neměla by komunita, obzvláště pak komunita malá, vítat každého případného nováčka, člověka, co se chce něco dozvědět? Nač to elitářství? Není to kontraproduktivní (a také bezdůvodné)?

nm - novomente

Re: Na co všechno je dobrý LISP?
« Odpověď #201 kdy: 01. 04. 2011, 11:36:28 »
Kdybys přece jenom chtěl něco konzultovat, tak se na mě můžeš obrátit - klidně i s nějakou tou "mezimotivací" - na m.prymek na gmailu. Nic Ti ale nemůžu slíbit :)
Beru na vedomi :)

koroptev

Re: Na co všechno je dobrý LISP?
« Odpověď #202 kdy: 01. 04. 2011, 12:42:07 »
JS:
Common Lisp neznam, cili z toho kodu nejsem nijak zvlast moudry a tudiz otazka: *current-tail-marker* mi nebude branit v tom traverzovat 2 stromy paralelne zaroven (= paralelne spustit 2 nesouvisejici tail rekurze zaroven; na me urovni uvazovani a na urovni syntaxe makra, o jehoz vnitrnosti se "nemusim" zajimat, to jsou preci 2 naprosto nesouvisejici cinnosti), ze ne?

Re: Na co všechno je dobrý LISP?
« Odpověď #203 kdy: 01. 04. 2011, 13:18:15 »
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:

Kód: [Vybrat]
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.html

Celou dobu jsem cekal, jaka bomba teda prijde - a po klasickem honeni trika, jak ho Lisp spasil a osvitil, prislo jenom tohle:

Citace
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...

Re: Na co všechno je dobrý LISP?
« Odpověď #204 kdy: 01. 04. 2011, 13:32:55 »
Mirek vám tu přece netvrdí, že LISP je špatný jazyk. Jen nesouhlasí (nebo řekněme chce se dozvědět, proč by to byla pravda), že je to super - uber - ultra - mega krutopřísný jazyk hodící se na vše a vždy a ostatní jazyky jsou pro pitomce.

Jsem rád, že to aspoň někdo pochopil. Snad těch, co to čtou a pochopili, je víc, akorát nemají potřebu se vyjadřovat...

Taky jsem rád, že jsi doplnil to "chce se dozvědět". O nesouhlas primárně nešlo, jen o "tak mi tu krutopřísnost teda ukažte, já ji nikde nevidím".

(zde záleží na náročnosti na propojení s ostatními jazyky, což si samozřejmě musím nastudovat sám).

Tohle je třeba zásadní věc, ke které jsme se mohli dostat, kdyby ta "debata" nebyla tak ujetá. Zkoušel jsem jednou třeba propojovat CLI s Prologem a moc daleko jsem se nedostal... Pokud by to s Lispem šlo líp, byly by to pro něj nezanedbatelné body, možná i víc bodů než za celá ta nešťastná makra - jenže to jsme se nedozvěděli kvůli přehršli plků a poetických přirovnání :(

A co tomu tady chybí? Příklad. Vždyť to nemusí být ani ukázka kódu. Reálný příklad z praxe složitého problému, popsaný slovy. Nástin implementace (opět, bez ukázky kódu) v lispu.

Bylo nám řečeno, že bysme to stejně nepochopili...

Tahle diskuse by byla mnohem věcnější, kdyby si tu pár fanatiků hned na začátku nezačalo honit triko. Co si k takové komunitě totiž říct? "Hm... jazyk je to jiný (záměrně nepíši těžký), nějaká literatura k tomu je, ale co když něco nepoberu a budu se chtít zeptat? Dozvím se, že jsem cvičená opice s lepidlem?" Neměla by komunita, obzvláště pak komunita malá, vítat každého případného nováčka, člověka, co se chce něco dozvědět? Nač to elitářství? Není to kontraproduktivní (a také bezdůvodné)?

Přesně tak. Dost nemile mě překvapilo, že to samé se objevuje skoro ve všech textech o Lispu, které jsem prošel.

Třeba z toho textu, co jsem odkazoval výš:
Citace
The enlightenment came instantaneously. One moment I understood nothing, and the next moment everything clicked into place. I've achieved nirvana. Dozens of times I heard Eric Raymond's statement quoted by different people: "Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot." I never understood this statement. I never believed it could be true. And finally, after all the pain, it made sense! There was more truth to it than I ever could have imagined. I've achieved an almost divine state of mind, an instantaneous enlightenment experience that turned my view of computer science on its head in less than a single second.

That very second I became a member of the Lisp cult. I felt something a ninjitsu master must feel: I had to spread my newfound knowledge to at least ten lost souls in the course of my lifetime. I took the usual path. I was rehashing the same arguments that were given to me for years (only now they actually made sense!), hoping to convert unsuspecting bystanders. It didn't work. My persistence sparked a few people's interest but their curiosity dwindled at the mere sight of sample Lisp code. Perhaps years of advocacy would forge a few new Lispers, but I wasn't satisfied. There had to be a better way.

Z takové "komunity" se mi dělá špatně a představa, že bych se takových lidí měl na něco ptát, mě upřímně děsí...

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #205 kdy: 01. 04. 2011, 13:42:15 »
Neměla by komunita, obzvláště pak komunita malá, vítat každého případného nováčka, člověka, co se chce něco dozvědět? Nač to elitářství? Není to kontraproduktivní (a také bezdůvodné)?

Znovu opakuji, ze nevidim duvod, proc nekomu, kdo mi nakonec stejne patrne rekne "je to blbost" (a navic mi tvrdi, ze tomu rozumi, kdyz vidim, ze tomu nerozumi), vymyslet nejake vlastni priklady, kdyz ho muzu odkazat na literaturu, kde jsou prikladu tuny, velkych i malych, lepsich nez ja vymyslim a je to tam i lepe vysvetlene. To neni elitarstvi, to je pragmatismus. Ja na ty knizky neodkazuji z lenosti, ale protoze si myslim, ze jsou dobre (a pristupne pro zacatecnika).

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #206 kdy: 01. 04. 2011, 13:53:34 »
JS:
Common Lisp neznam, cili z toho kodu nejsem nijak zvlast moudry a tudiz otazka: *current-tail-marker* mi nebude branit v tom traverzovat 2 stromy paralelne zaroven (= paralelne spustit 2 nesouvisejici tail rekurze zaroven; na me urovni uvazovani a na urovni syntaxe makra, o jehoz vnitrnosti se "nemusim" zajimat, to jsou preci 2 naprosto nesouvisejici cinnosti), ze ne?

Priznam jsem, ze jsem to moc nestudoval, protoze me to tema prilis nezajima. Ale pri zbeznem pohledu si troufam tvrdit, ze *current-tail-marker* problem predstavovat nebude, protoze je to dynamicka promenna.

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #207 kdy: 01. 04. 2011, 14:02:46 »
Z takové "komunity" se mi dělá špatně a představa, že bych se takových lidí měl na něco ptát, mě upřímně děsí...

Hypoteticky, predpokladejme, ze ten citat je naprosto pravdivy. Co s tim podle vas ta komunita ma jako delat? Jestlize je neco tezke na pochopeni, je to proste tezke na pochopeni. Jestlize dosahnete osviceni, proste dosahnete osviceni, co s tim kdo nadela?

Ale rikat, ze o zadne osviceni se nejedna, pokud jste to sam nezkusil a neprecetl si alespon jednu z tech knizek, je dost troufale. Asi ne kazdeho osviceni ceka, stejne jako kazdy neni osviceny z matematicke analyzy, prestoze je to nesporne mozne.

(Ale ja si nemyslim, ze je to takova hruza. Obe knizky co zminuji porad dokolecka jsou velice ctive, rozhodne bych rekl ctivejsi nez rekneme dokumentace k nekterym Javovym vynalezum.)

Viky

Re: Na co všechno je dobrý LISP?
« Odpověď #208 kdy: 01. 04. 2011, 14:05:08 »
Milý NM,
ono asi opravdu není moc smysluplné klást otázky typu "Na co všechno je dobrý LISP", když tak koukám na tu debatu. I když jsem byl za následující argument pohaněn, přesto jsem přesvědčen o tom, že zesměšňovat nebo zpochybňovat tento typ argumentů může - sorry - jedině ignorant. Proto znova opakuji - kdyby pro žádný jiný důvod, tak Lisp stojí za pozornost přinejmenším kvůli tomu, že ho za pozoruhodný jazyk považují lidé, kteří počítačovým vědám udávají směr a přeci jen vidí o něco dále a o něco hlouběji, než my všichni tady dohromady (aniž bych se chtěl někoho tady dotknout).
Zkus si přečíst o Lispu nějaký text - třeba od Grahama - a pak nějakou učebnici - třeba Seibela. Třeba tomu přijdeš na chuť, třeba ne, třeba sám objevíš to, co ti tu nikdo není schopen zprostředkovat takhle přes diskusi. Ztracený čas to určitě nebude. Ztracený čas je spíš tato diskuse. Ono totiž právě to je největší umění - dokázat něco netriviálního vystihnout několika slovy tak, aby to pochopil každý - a pokud to tu někteří neustále požadují, nejspíš si ani sami neuvědomují, jak náročný požadavek ve skutečnosti mají.

P.S.: Když tě na Lispu tak zaujala především ta forma zápisu (make circle x y r), tak by tě možná mohly z podobného důvodu zaujmout i jazyky Forth:
x y r circle make

a Smalltalk:
Circle makeAt: x y withRadius: r.

Re: Na co všechno je dobrý LISP?
« Odpověď #209 kdy: 01. 04. 2011, 14:06:47 »
Jestlize dosahnete osviceni, proste dosahnete osviceni, co s tim kdo nadela?

Krásná tečka za tímhle tématem. Víc už skutečně není potřeba...