Na co všechno je dobrý LISP?

Re: Na co všechno je dobrý LISP?
« Odpověď #360 kdy: 10. 04. 2011, 19:17:43 »
Takze, v jazyce jako C, jak takovou operaci, vyuzivajici "|", elegantne zapises?

A já jsem někde snad tvrdil, že v C lze částečnou aplikaci napsat?

Jinak viz http://forum.root.cz/index.php?topic=1978.msg15980#msg15980


Re: Na co všechno je dobrý LISP?
« Odpověď #361 kdy: 10. 04. 2011, 19:21:02 »
Neda sa nahodou funkcionalna paradigma ovela lahsie paralelizovat ,,pod kapotou", zatial co napr. for-cyklus nie?

No asi jo, ale python to pokud vím nedělá a domnívám se, že ani dělat nemůže právě proto, že to není skutečný funkcionální jazyk, ale procedurální jazyk s nějakými jakože-funkcionálními prvky.

Přesně proto jsem se Inkvizitora ptal, co ho k používání těch jakože-funkcionálních prvků vede, když mu nepřináší to ovoce skutečně funkcionálního jazyka (např. právě ta optimalizace). Inkvizitor to narozdíl od JS pochopil a odepsal, že to dělá kvůli tomu, že se mu jakože-funkcionální zápis *líbí*.

JS

Re: Čitelnost
« Odpověď #362 kdy: 10. 04. 2011, 20:02:35 »
Nemám zájem "diskutovat" s někým, kdo mi neustále dává najevo, že jsem idiot. Takže si to užijte s někým jiným. S chutí vám nechávám poslední slovo.

Nemuzu vedet, co vite a co ne. Me pripada analogie mezi curryingem a pipelinou zrejma, vam asi ne. Nemuzu ani vedet, zda vubec vite, co je currying. Pokud se hodlate urazet pokazde, kdyz si nekdo mysli, ze neco nevite, asi bude dost tezke s vami vyjit... (a naopak - neni to tak dlouho, co jste se tu naopak rozciloval, ze predpokladam, ze neco vite)

Přesně proto jsem se Inkvizitora ptal, co ho k používání těch jakože-funkcionálních prvků vede, když mu nepřináší to ovoce skutečně funkcionálního jazyka (např. právě ta optimalizace). Inkvizitor to narozdíl od JS pochopil a odepsal, že to dělá kvůli tomu, že se mu jakože-funkcionální zápis *líbí*.

Ano. A pak jste tu zacal tvrdit, ze je to subjektivni nazor, a ze elegance funkcionalniho zapisu nad proceduralnim je subjektivni. Coz bych prave rad kontroval prikladem elegance zapisu rour v shellu; pokud by mela byt subjektivni, rad bych videl lepsi (alespon subjektivne) proceduralni zapis.

alefo

Re: Na co všechno je dobrý LISP?
« Odpověď #363 kdy: 10. 04. 2011, 20:04:21 »
Lenze keby niekto preimplementoval funkciu map() / reduce() v Pythone na nieco efektivnejsie, programy pobezia automaticky rychlejsie, zatialco klasicke for-cykly nie.

-------

Napr. v Jave cakam na closures (funkcie ako objekty) ako na spasenie, lebo to dramaticky zefektivni zapis. Skolske priklady su ,,prelez zoznam a s kazdym prvkom urob nejaku transformaciu", pripadne ,,odfiltruj zo zoznamu dane prvky", pricom transforimacia / podmienka filtracie sa specifikuje, ci meni za behu sa pisu nasobne lahsie. (O obsluhe udalosti v GUI ani nehovorim, to, co C# sekaju delegatmi, v Jave este stale nie je).

Re: Na co všechno je dobrý LISP?
« Odpověď #364 kdy: 10. 04. 2011, 20:26:05 »
Lenze keby niekto preimplementoval funkciu map() / reduce() v Pythone na nieco efektivnejsie, programy pobezia automaticky rychlejsie, zatialco klasicke for-cykly nie.

Jenže ono to na "něco efektivnějšího" implementovat afaik nejde, protože ten jazyk prostě funkcionální *není* a *nikdy nebude*.

V pythonu prostě reduce bude vždycky přeložený jenom jako smyčka volající nějakou funkci postupně na jednotlivé prvky. Pokud by to mělo jít nějak optimalizovat, musel by python zavést nějaký speciální typ "funkcionální funkce" (do které by "viděl" a mohl ji optimalizovat), ale tím by vlastně vytvořil sám v sobě paralelní funkcionální jazyk, který by s tím normálním pythonem neměl nic společného...

Napr. v Jave cakam na closures (funkcie ako objekty) ako na spasenie, lebo to dramaticky zefektivni zapis. Skolske priklady su ,,prelez zoznam a s kazdym prvkom urob nejaku transformaciu", pripadne ,,odfiltruj zo zoznamu dane prvky", pricom transforimacia / podmienka filtracie sa specifikuje, ci meni za behu sa pisu nasobne lahsie. (O obsluhe udalosti v GUI ani nehovorim, to, co C# sekaju delegatmi, v Jave este stale nie je).

No ale to pořád bude klasická javovská funkce, akorát bude nepojmenovaná. Syntakticky to možná bude *připomínat* nějakou funkcionální konstrukci, ale vnitřně to bude furt ta stará známá funkce...


JS

Re: Na co všechno je dobrý LISP?
« Odpověď #365 kdy: 10. 04. 2011, 20:44:29 »
No ale to pořád bude klasická javovská funkce, akorát bude nepojmenovaná. Syntakticky to možná bude *připomínat* nějakou funkcionální konstrukci, ale vnitřně to bude furt ta stará známá funkce...

Myslim, ze uzaver (closure) je neco jineho, nez co si vy myslite, ze to je. Znovu nezbyva nez doporucit On Lisp, tam je to pekne popsane vcetne pripadu pouziti (ja jsem si az tam uvedomil, co jsou uzavery a k cemu jsou dobre).

Re: Čitelnost
« Odpověď #366 kdy: 10. 04. 2011, 21:07:37 »
Nemuzu vedet, co vite a co ne.

Pokud něco nevíte, tak se na to zeptejte.

Pokud nevíte, jestli něco vím, nepředpokládejte hned, že to nevím a neraďte mi, ať si to nastuduju. Pokud to tak hodláte dělat dál, nemám o takový rozhovor domnělého učitele s domnělým žákem zájem.

Myslím, že byste mohl připustit alespoň teoreticky, že pokud jsem vám v něčem nerozuměl, nemusí to být jenom tím, že jsem idiot.

Nemuzu ani vedet, zda vubec vite, co je currying.

Nejen, že se tady o tom myslím už mluvilo, takže kdybyste diskusi četl pozorně, mohl jste se zřejmě dovtípit, ale taky jsem tady psal, že jsem absolventem školy, kde by se bez něčeho tak základního nedalo přežít.

Jen tak pro představu:
http://is.muni.cz/predmet/fi/podzim2010/IB015
http://is.muni.cz/predmet/fi/jaro2011/IA014 
http://is.muni.cz/predmet/fi/jaro2007/IA011
http://is.muni.cz/predmet/fi/podzim2006/MA007
http://is.muni.cz/predmet/fi/podzim2007/PB006


Pokud se hodlate urazet pokazde, kdyz si nekdo mysli, ze neco nevite, asi bude dost tezke s vami vyjit... (a naopak - neni to tak dlouho, co jste se tu naopak rozciloval, ze predpokladam, ze neco vite)

To je jednoduché - o někom, koho neznáte, nic nepředpokládejte. Pokud o něm něco nevíte, tak se ho zeptejte. Jak snadné. Říká se tomu elementární mezilidská slušnost a bez toho diskuse nemá smysl.

A co se týče toho údajného rozčilování, pouze jsem konstatoval, že je poněkud nevěrohodné, když někdo tvrdí, že dosáhl osvícení, ale zároveň nedokáže ukázat jednoduchý příklad takový, aby ho pochopil i někdo, kdo o dané věci nic neví. Tím spíš, že jsem takový příklad našel na jednom z prvních odkazů Googlu na dané téma.

Me pripada analogie mezi curryingem a pipelinou zrejma, vam asi ne. 

Já jsem pouze upozornil na to, že je věcí názoru, co budu chtít v pipelině vidět (v kontextu této diskuse to není nic jiného než analogie). Můžu si do ní promítat svoje funkcionální vidění světa (analogie částečné aplikace a skládání funkcí, kterou jste uvedl), nebo ji můžu vidět jenom jako způsob předávání dat (tj. analogii proměnné*).

Ta analogie je prostě špatná a nevede k lepšímu dorozumění, ale k ještě většímu zamlžení diskuse.

Navíc to, co ta analogie měla demonstrovat, je úplně mimo mísu (viz níž).

Ano. A pak jste tu zacal tvrdit, ze je to subjektivni nazor, a ze elegance funkcionalniho zapisu nad proceduralnim je subjektivni. Coz bych prave rad kontroval prikladem elegance zapisu rour v shellu; pokud by mela byt subjektivni, rad bych videl lepsi (alespon subjektivne) proceduralni zapis.

Jistě jsou věci, které se ve *skutečně funkcionálním jazyce* dají napsat, zatímco v procedurálním nikoli.

Já jsem ale mluvil o něčem úplně jiném: jestliže v *procedurálním jazyce* můžu nějakou věc napsat "jakože-funkcionálně" nebo "normálně-procedurálně", potom je imho věcí vkusu, který ze zápisu použiju, protože s pravděpodobností hraničící s jistotou překladač oba zápisy přeloží úplně stejně.

Nejen, že se dobýváte do otevřených dveří, ale ještě ze mě při tom děláte vola, což není způsob diskuse, který bych měl potřebu dále provozovat.

Myslim, ze uzaver (closure) je neco jineho, nez co si vy myslite, ze to je. Znovu nezbyva nez doporucit [...]

Tak to byla definitivně poslední kapka...

JS

Re: Čitelnost
« Odpověď #367 kdy: 10. 04. 2011, 21:38:00 »
Já jsem ale mluvil o něčem úplně jiném: jestliže v *procedurálním jazyce* můžu nějakou věc napsat "jakože-funkcionálně" nebo "normálně-procedurálně", potom je imho věcí vkusu, který ze zápisu použiju, protože s pravděpodobností hraničící s jistotou překladač oba zápisy přeloží úplně stejně.

To se mozna prelozi stejne, ale ten funkcionalni bude v nekterych pripadech kratsi a citelnejsi. Takze to neni tak uplne jen "veci vkusu". Nehlede na to, ze treba zminene uzavery pomahaji i modularite.

ale ještě ze mě při tom děláte vola

Kdyz si to chcete myslet..

Re: Čitelnost
« Odpověď #368 kdy: 10. 04. 2011, 21:40:58 »
To se mozna prelozi stejne, ale ten funkcionalni bude v nekterych pripadech kratsi a citelnejsi.

http://forum.root.cz/index.php?topic=1978.msg15951#msg15951

Blik?

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #369 kdy: 10. 04. 2011, 21:45:54 »
Jenže ono to na "něco efektivnějšího" implementovat afaik nejde, protože ten jazyk prostě funkcionální *není* a *nikdy nebude*.

Jakto? Pokud mate uzavery, nic vam nebrani implementovat smycku nejak paralelne. Proste predefinujete tu funkci map() na neco vhodnejsiho. Mimochodem, to, ze se smycka da zapsat jako funkce nazyva Doug Hoyte v Let Over Lambda pripadem "syntakticke duality", a tvrdi, ze tyto duality jsou hlavni duvod, proc je Lisp tak dobry jazyk (a proc programatori snaseji ty zavorky).

JS

Re: Čitelnost
« Odpověď #370 kdy: 10. 04. 2011, 21:47:55 »
http://forum.root.cz/index.php?topic=1978.msg15951#msg15951

Blik?

Ano, vim ze si to myslite, ale dokud mi nepredvedete podle vas subjektivne elegantnejsi zapis nejakeho pouziti Unixove pipe, nemuzu to fakt brat vazne.

Re: Na co všechno je dobrý LISP?
« Odpověď #371 kdy: 10. 04. 2011, 22:17:32 »
Mimochodem, to, ze se smycka da zapsat jako funkce nazyva Doug Hoyte v Let Over Lambda pripadem "syntakticke duality", a tvrdi, ze tyto duality jsou hlavni duvod, proc je Lisp tak dobry jazyk (a proc programatori snaseji ty zavorky).

Kde přesně to je?

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #372 kdy: 11. 04. 2011, 01:12:12 »
Například můžu napsat "funkcionálně":
Kód: [Vybrat]
result = reduce(lambda x, y: x+" "+y, ["a", "b", "c", "d", "e"])

nebo "procedurálně" něco ve stylu:
Kód: [Vybrat]
l = ["a", "b", "c", "d", "e"]
result = ""
for s in l[:-1]:
  result += s+" "
result += l[-1]
(ošetření zvláštních případů pro stručnost vypouštím)

...přičemž oboje s velkou pravděpodobností překladač přeloží na úplně stejný nebo aspoň hodně podobný výsledný kód.

No vida a zrovna na tohle je ideální funkcionální konstrukce
Kód: [Vybrat]
" ".join(["a", "b", "c", "d", "e"])Obě řešení navíc obsahují chybu (to není kritika, chápu, že jde o rychlý příklad), neboť na rozdíl od joinu si nedokáží poradit s prázdným vstupním seznamem. V takovém případě bych asi stejně nasadil funkci, samozřejmě s tím rizikem, že v Pythonu je volání funkce poměrně drahé. Jinak by tam musel ještě přibýt if a došli bychom k tomu, co nemám rád - procedurální/imperativní kód bobtná a stává se méně a méně přehledným. Tu funkcionální verzi lze zkrátit ve stylu
Kód: [Vybrat]
l = ["a", "b", "c", "d", "e"]
result = reduce(lambda x, y: x+" "+y, l) if l else ''
ikdyž samozřejmě zůstává otázkou, co je nakonec čitelnější. Já hlasuji pro one-liner.

Re: Na co všechno je dobrý LISP?
« Odpověď #373 kdy: 11. 04. 2011, 01:26:10 »
No vida a zrovna na tohle je ideální funkcionální konstrukce
Kód: [Vybrat]
" ".join(["a", "b", "c", "d", "e"])

Tak teď teda už vůbec nechápu, co se slovem "funkcionální" míní, pokud volání metody objektu je "funkcionální konstrukce" :)

Join jsem schválně vynechal, abych lacině netvrdil, že "procedurální" řešení je přehledný oneliner... Není to fér, protože to je knihovní funkce udělaná přesně na tuhle jednu věc. Každopádně jsem tohle řešení ale považoval za "procedurální".

...aspoň jsme hezky došli na to, na co jsem se JS neúspěšně ptal... co vlastně míní pojmem "funkcionální [obrat,konstrukce,postup,...]", jestliže se bavíme o procedurálním jazyku.

Obě řešení navíc obsahují chybu (to není kritika, chápu, že jde o rychlý příklad),
Jasně. V tom druhém případě jsem to tam i napsal.

Jinak by tam musel ještě přibýt if a došli bychom k tomu, co nemám rád - procedurální/imperativní kód bobtná a stává se méně a méně přehledným. Tu funkcionální verzi lze zkrátit ve stylu
Kód: [Vybrat]
l = ["a", "b", "c", "d", "e"]
result = reduce(lambda x, y: x+" "+y, l) if l else ''
ikdyž samozřejmě zůstává otázkou, co je nakonec čitelnější. Já hlasuji pro one-liner.

Pokud se shodneme na tom, že volba mezi hutným "funkcionálním" onelinerem a upovídanějším "procedurálním" forem je otázkou subjektivního vkusu, tak ok. Já rozhodně nebudu tvrdit, že for je hezčí - jen, že mně osobně přijde ve většině případů na první pohled přehlednější, což nikomu nevnucuju. For má jedinou objektivní výhodu: "procedurálních" programátorů je víc a tím bude kód srozumitelnější více lidem.

P.S. dáme závod o nejnečitelnější "funkcionální" oneliner? ;)

UPDATE: P.P.S. nevím, proč pořád píšu "procedurální", měl jsem samozřejmě celou dobu namysli "imperativní", omlouvám se. (Ale zjevně to všichni pochopili, tak se zas tak nestalo)
« Poslední změna: 11. 04. 2011, 01:34:07 od Miroslav Prýmek »

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #374 kdy: 11. 04. 2011, 01:33:08 »
P.S. dáme závod o nejnečitelnější "funkcionální" oneliner? ;)

Já už jsem jeden docela drsný kdysi napsal:
Kód: [Vybrat]
http://www.root.cz/clanky/perlicky-uvod-do-referenci/nazory/187499/