Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Mirek Prýmek

Stran: 1 ... 602 603 [604] 605 606 ... 618
9046
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 01. 04. 2011, 14:32:46 »
Ano, bylo to tezke, protoze jste nam tu tvrdil, ze makrum rozumite.

Říkal jsem, že se domnívám, že základnímu principu rozumím - a nerozumím tomu, co je na něm tak kulervoucího - a proto bych tu kulervoucnost chtěl vidět na nějakém konkrétním příkladě.

A zákadnímu principu jsem skutečně rozuměl, jen jsem si myslel, že je trochu mocnější než jenom normální preprocesor.

9047
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 01. 04. 2011, 14:17:47 »
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í.

Jednoduchý příklad z výše zmíněného textu:

Mám data v xml:
Kód: [Vybrat]
<todo name="housework">
    <item priority="high">Clean the house.</item>
    <item priority="medium">Wash the dishes.</item>
    <item priority="medium">Buy more soap.</item>
</todo>

Lispovsky je zapíšu trochu stručněji:
Kód: [Vybrat]
(todo "housework"
    (item (priority high) "Clean the house.")
    (item (priority medium) "Wash the dishes.")
    (item (priority medium) "Buy more soap."))

Tak a teď ta data chci nějak hezky vypsat. Běžný postup by byl vytvořit "složitou" soustavu smyček, které ta data budou postupně procházet a vypisovat, zatímco v Lispu napíšu "jednoduché" makro a tím "vytvořím nový jazyk". Makro vlastně jakoby magicky (SPEL) data promění přímo v kód, který můžu spustit a který ta data vypíše. Makro vypadá takhle:
Kód: [Vybrat]
(defmacro item (priority note)
    '(block
         (print stdout tab "Priority: "
             ~(head (tail priority)) endl)
         (print stdout tab "Note: " ~note endl endl)))

Takže žádné příkazy na procházení, sám strom, obsahující data, se stal stromem data vypisujícím.

----------------------------------------------------

To bylo opravdu tak těžké takovýhle příklad uvést a ušetřit si tři dny plácání? A myslíte si, že vám někdo uvěří, jakého osvícení jste s lispem dosáhli, když o takhle jednoduchém úkolu (stručně vystihnout povahu maker) napíšete "jak *náročný požadavek* ve skutečnosti mají"?

9048
Vývoj / Re: Na co všechno je dobrý LISP?
« 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...

9049
Vývoj / Re: Na co všechno je dobrý LISP?
« 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í...

9050
Vývoj / Re: Na co všechno je dobrý LISP?
« 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...

9051
Vývoj / Re: Na co všechno je dobrý LISP?
« 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ší...

9052
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 31. 03. 2011, 23:40:00 »
Zrejme jste prehledl ono "zkompilovat". To co pisete je interpret.

Tak když už jsme se dostali do vyloženě takhle komické roviny, tak dám taky jednu k dobru: Víte, pro jaký jazyk je nejjednodušší napsat interpret?

Kupodivu pro Céčko - hele:

Kód: [Vybrat]
#!/bin/sh

while true; do
  vim makro.c
  gcc -o makro makro.c
  ./makro
  read
done

9053
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 31. 03. 2011, 23:15:30 »
Vy totiz muzete vysledek vyhodnoceni makra pak nechat zkompilovat, nemusite ho jen interpretovat. Jak to chcete provest s retezcem do eval mi tedy neni jasne.

A co vám na tom není jasné?

Když napíšete textový soubor se zdrojákem v Lispu a spustíte ho, tak se stane co? Udělá se jeden velký eval. Takže nám jde jenom o to, jestli jazyk má prostředky na to, aby to samé provedl v rámci běhu programu.

To je celé.

9054
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 31. 03. 2011, 22:07:45 »
Nechci fakt ted nic probirat, protoze jak vydis z mych reakci, vsechno je to jenom zatim jen teoreticky

Já bych ani tak neřekl "teoreticky" jako spíš "básnicky" :) Tak to na mě zatím působí. Když nechceš, nebudu z tebe samozřejmě nic tahat, jen mi přišlo, že by sis třeba mohl ušetřit nějakou zbytečnou námahu, kdyby ses zeptal někoho, kdo to umí posoudit, jestli ta básnická představa vůbec dává nějaký smysl a je vůbec převoditelná do teorie a poté do praxe, nebo jestli v praxi už náhodou dávno neexistuje.

Na druhou stranu před Tebou ale smekám, moc se mi líbí, s jakou vervou do toho jdeš! Jednou k té vervě určitě přidáš ještě opatrnost, abys s vervou nešel proti zdi nebo do septiku :) ... a pak budeš (nebo možná už jsi, to já nevím) bezva parťák, takže fakt upřímně a s radostí Ti držím palce!

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 :)

9055
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 31. 03. 2011, 21:50:23 »
Myslím, že to, že mám kód jako strukturu a ne jen hloupý text (ten mám u evalu), je dost podstatná výhoda.

Samozřejmě. Ale není to žádná diametrální odlišnost, která by přinášela jazyku nějakou magickou sílu - jedno z druhého lze snadno udělat: prostě se to vyparsuje ;)

Parsování lispu jde snadno, na to myslím má tu syntaxi co má, s protivným množstvím závorek.

Já bych tipoval, že ho vymysleli tak, aby se dobře parsoval - a že se bude blbě číst, to byla podružnost - kdyby si na to náhodou někdo stěžoval, tak mu řekneme, že to není chyba syntaxe, ale jeho chyba, protože je moc línej ;)

Ten první článek jsem jen tak proběhl, kdybych to celé četl a snažil se to pochopit, strávil bych nad tím hodně dlouho.

Jasně, však u nás jsou na to taky dva semestry :) (ne na tyhle dva texty, ale na seznameni se s TILem :) Já jsem to sem dal spíš jako takovou zajímavost, že ten samej (imho) princip se objevuje i někde jinde...


Tohle mě překvapilo:
Citace
(P1) Karel si myslí, že papež je v nebezpečí

(P2) Karel si o papeži myslí, že je v nebezpečí

Tvrdí tam, že ty dvě věty mají různý význam. Jak to, že to má různý význam? Může snad existovat nějaká situace, kdy platí P1 a neplatí P2 nebo naopak?

Může. Vidíš svýho kamaráda Pepu Ratzingera, jak na něj někdo míří pistolí. Hlavou se ti mihne "Pepa je v nebezpečí!", ale nemyslíš na to, že papež je v nebezpečí, protože jsi byl pár let v Paraguai a nevíš, že mezi tím Pepu zvolili papežem. P2 platí (protože ty si to skutečně myslíš o muži, který JE papežem, akorát to nevíš) a P1 neplatí, protože myšlenku "papež je v nebezpečí" prostě v hlavě nemáš.

Neboli (teď se možná v něčem spletu, už je to nějakou dobu, co jsem se tím zabýval...) ve větě "Karel si o X myslí, že je v nebezpečí" můžeme za X dosadit libovolné výrazy, které mají stejný denotát a pravdivostní hodnota se tím nezmění. Totéž ale neplatí o větě "Karel si myslí, že X je v nebezpečí". Z toho plyne, že ty věty nemůžou být ekvivalentní.

9056
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 31. 03. 2011, 20:49:26 »
Nicméně když srovnám Lisp jako první jazyk pro programátora třeba s Pythonem (sorry), je ta učící křivka daleko obtížnější.

Nehledě na to, že postupy, který se naučí v Lispu, moc neuplatní jinde...

Ale já jsem ho nechtěl odrazovat od Lispu, mě jenom fakt zaujalo to nadšení nad samotným příkazem, bez jakýhokoli komentáře co jako by měl dělat a jak :)

9057
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 31. 03. 2011, 20:20:37 »
Parada je na tom to, Mirku, ze obcas zapremyslim nad jednim napadem, o kterem jsem se zminil v diskusi "IT inovace od neprogramatora" (neco jako programatorske LEGO).

No to mě napadlo, právě proto se tě jako neprogramátora ptám: co ti přijde bezva na tom, že můžeš NĚKAM NAPSAT třeba "(moveto (map "Praha") x y)"?

Mělo by tě spíš zajímat, jestli to taky něco udělá - a proč a jak to to něco udělá.

Např.  když napíšeš u sebe v pokoji na zeď "(moveto (map "Praha") x y)", tak to zřejmě udělá to samý, jako kdybys tam napsal "Pepa je vůl!" - a možnost někam napsat "Pepa je vůl!" by tě asi tak nezaujala, ne?

:)

9058
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 31. 03. 2011, 19:51:10 »
No ale jestli to tak jde, tak to je parada.

Co presne je na tom parada? :)

9059
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 31. 03. 2011, 18:39:27 »
To úplně není. Třeba v C si můžu udělat makro, ale v parsování C-čkového kódu mi to nepomůže.

No ale bavíme se o makrech v Lispu. A to není (nakolik jsem to zatím pochopil) nic jiného, než funkce, která bere "nespuštěný" Lispový kód* a vrací spustitelný objekt (v případě Lispu "vyhodnotitelnou formuli" nebo jak by se to správně řeklo).

Čili v podstatě dělá to samé jako eval, akorátže sympatičtějším způsobem, protože do kódu můžu "elegantněji" šahat, protože ho nemám jako string, ale jako už rozparsovanou strukturu.

Nevidím žádný velký důvod, proč by totéž nešlo udělat u libovolného jiného (i čistě procedurálního) jazyka, který je schopen svými vlastními prostředky manipulovat s rozparsovanou strukturou. Akorát to asi nikdo nepotřebuje, protože 99.9% situací, kde by se to hodilo, si stejně vystačí s lambdou...

Ale možná se pletu - jak jsem říkal, programovací jazyky nejsou žádný můj koníček...

-------

* já bych nespuštěný kód nazval třeba "citát", protože pracuji jakoby nad TEXTEM (strukturou) algoritmu, nikoli nad HODNOTOU VRÁCENOU algoritmem, ani nad algoritmem jako celkem. Čili algoritmus nespouštím, ale dělám nad jeho strukturou nějaké operace. Zmínil jsem tady transparentní intenzionální logiku - ta má to samé: jednak umí rozlišit mezi "de dicto" a "de re" (což asi v programování nemá ekvivalent) [1] a navíc umí rozlišit spuštěnou a nespuštěnou konstrukci [2] (což je přesně rozdíl mezi normální funkcí a makrem).

(Ovšem sluší se dodat, že TIL vznikl až po Lispu, takže s klidem můžeme lispisty poplácat po rameni, což ji zjevně dělá tak moc dobře :)

[1] http://til.phil.muni.cz/text/duzi_homonymie_dedicto_dere.php
[2] http://til.phil.muni.cz/text/tichys_fivemodes.php - viz hlavně trivializace

9060
Vývoj / Re: Na co všechno je dobrý LISP?
« kdy: 31. 03. 2011, 17:36:20 »
Největší výhodou Lispu jsou makra a možnost jednoduše zpracovávat program jako data...

...což je jedno a to samé :)

Stran: 1 ... 602 603 [604] 605 606 ... 618