Na co všechno je dobrý LISP?

Re: Na co všechno je dobrý LISP?
« Odpověď #345 kdy: 10. 04. 2011, 15:47:43 »
Funkcionální přístup (konkrétně třeba i ty pipelines, které zmiňuje JS) má i další výhody. Konkrétně doporučuji prostudovat si tuto kapitolku. Procedurální kód je obecně špatně paralelizovatelný, zatímco čistě funkcionální přístup je přirozeně přístupný paralelizaci.

Asi se nemusíme bavit o tom, že opravdu funcionální jazyky mají zajímavé vlastnosti, které procedurální jazyky nemají (třeba typu referenční transparentnosti apod. - a z toho vyplývající paralelizovatelnost, převod na distribuovaný model, lepší možnost automatické optimalizace a jánevímco).

Otázka je, jestli používání "funkcionálních" obratů třeba konkrétně v tom Pythonu nějaký takový efekt má. Já se obávám, že ne - že je to prostě jenom jiný zápis téhož (kdybych použil třeba normální for nad polem callbacků, nedostanu méně paralelizovatelný, robustní, ... kód - dostanu prostě víceméně to samé, jenom jinak zapsané).

Tím nechci nikomu tenhle způsob psaní brát nebo hanět, ale neviděl bych za tím (v Pythonu) nic víc, než otázku subjektivního pocitu větší čitelnosti/čistoty/elegance kódu.


JS

Re: Čitelnost
« Odpověď #346 kdy: 10. 04. 2011, 15:51:13 »
Elegance kódu je subjektivní záležitost.

Vidim, ze jsem po tydnu pozapomnel, jak je s vami tezka domluva. Samozrejme, mozna ze by to Prymek napsal Inkvizitorovi lepe, takze by nemusel pouzit funkcionalni zapis. Coz nemuzeme vedet, protoze nezname konkretni problem. Ale to neni prekazka. Proto jsem vam obratem predhodil neco podobneho (Unix pipe), na ktere nam muzete zkusit demonstrovat, ze vse, co lze elegantne zapsat funkcionalne, lze elegantne zapsat i proceduralne (pricemz kriterium elegance ponecham na vas). Hodne stesti.

Re: Čitelnost
« Odpověď #347 kdy: 10. 04. 2011, 16:36:19 »
Vidim, ze jsem po tydnu pozapomnel, jak je s vami tezka domluva.

Nevím, co je tak provokativního na konstatování zjevného faktu, že někomu se víc líbí řešení A, někomu
řešení B - a dokonce i když řešení bude stejné, někomu se vícd líbí napsat ho stylem X, někomu stylem Y.


 Samozrejme, mozna ze by to Prymek napsal Inkvizitorovi lepe

Nic takového jsem nechtěl říct a neřekl. Nevkládejte mi to prosím do úst. Děkuji.

JS

Re: Čitelnost
« Odpověď #348 kdy: 10. 04. 2011, 17:13:49 »
Nevím, co je tak provokativního na konstatování zjevného faktu, že někomu se víc líbí řešení A, někomu
řešení B - a dokonce i když řešení bude stejné, někomu se vícd líbí napsat ho stylem X, někomu stylem Y.

No, co je na tom provokativniho - ze by me opravdu ten elegantni zapis Unixovych pipes proceduralne zajimal, bude se hodit, az budu zase pouzivat modul subprocess. Ja elegantnejsi zapis neznam (ani cloveka, ktery by o sobe prohlasoval, ze ho zna, coz, jak rikate, jeste neznamena, ze by se musel nutne libit i me). Takze bud takovy zapis znate, a pak se ho rad dozvim, a nebo takovy zapis neznate, a pak mate priklad k vasemu tvrzeni, ze jde vzdy o subjektivni zalezitost.

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #349 kdy: 10. 04. 2011, 17:14:57 »
Eh, myslel jsem protipriklad.


Re: Čitelnost
« Odpověď #350 kdy: 10. 04. 2011, 17:20:55 »
No, co je na tom provokativniho - ze by me opravdu ten elegantni zapis Unixovych pipes proceduralne zajimal, bude se hodit, az budu zase pouzivat modul subprocess. Ja elegantnejsi zapis neznam [...] Takze bud takovy zapis znate, a pak se ho rad dozvim, a nebo takovy zapis neznate, a pak mate priklad k vasemu tvrzeni, ze jde vzdy o subjektivni zalezitost.

Těžko říct, jestli takový zápis znám. Nevím totiž, čemu říkáte "funkcionální" a "procedurální".

Když třeba v céčku napíšu int x = f(g(y)), tak to je "funkcionální", protože "definuji novou funkci jako slozeni existujicich pomoci aplikace funkce"?

Napište mi přesnou definici, jaké řešení je "funkcionální" a jaké "procedurální" a můžeme se o tom pobavit. (i když popravdě řečeno nevidím důvod takového rozhovoru...)

Ne nadarmo jsem v posledních příspěvcích slovo "funkcionální" dával do uvozovek, aby bylo jasné, že není úplně zřejmé, o čem vlastně mluvíme.

JS

Re: Čitelnost
« Odpověď #351 kdy: 10. 04. 2011, 18:10:03 »
Napište mi přesnou definici, jaké řešení je "funkcionální" a jaké "procedurální" a můžeme se o tom pobavit. (i když popravdě řečeno nevidím důvod takového rozhovoru...)

V tomhle pripade se "funkcionalni" tyka moznosti mit funkce, ktere pracuji s funkcemi. Tedy, napriklad, umoznuje specializaci argumentu (currying) - vratit z funkce 2 argumentu funkci na 2. argumentu, pro kterou uz je ten 1. argument konstantni. Operator "|" z prikazove radky uz je pak jen operatorem slozeni tech specializovanych funkci.

JS

Re: Čitelnost
« Odpověď #352 kdy: 10. 04. 2011, 18:13:08 »
Když třeba v céčku napíšu int x = f(g(y)), tak to je "funkcionální", protože "definuji novou funkci jako slozeni existujicich pomoci aplikace funkce"?

Apropos, tohle neni skladani funkci. C takovy operator nema (a uprimne ani nevim, jak by bylo mozne ho - bez pouziti maker - zapsat). Skutecny operator skladani funkci vam umoznuje napriklad tu vyrobenou funkci nekam predat.

Re: Čitelnost
« Odpověď #353 kdy: 10. 04. 2011, 18:15:42 »
V tomhle pripade se "funkcionalni" tyka moznosti mit funkce, ktere pracuji s funkcemi.

A roura pracuje s funkcemi?

Program

Re: Na co všechno je dobrý LISP?
« Odpověď #354 kdy: 10. 04. 2011, 18:33:25 »
V tomhle pripade se "funkcionalni" tyka moznosti mit funkce, ktere pracuji s funkcemi.

A roura pracuje s funkcemi?

Nezlobte se, ale je naprosto zbytečné se překřikovat, když Vám (jak jste sám uvedl) není jasné, co znamená funkcionální programování. Zkuste se podívat na lambda kalkul, třeba Haskell (který se snaží být striktně funkcionální) atp. Nevykřikujte jen proto, že něčemu nerozumíte...

Re: Na co všechno je dobrý LISP?
« Odpověď #355 kdy: 10. 04. 2011, 18:54:06 »
Nezlobte se, ale je naprosto zbytečné se překřikovat, když Vám (jak jste sám uvedl) není jasné, co znamená funkcionální programování. Zkuste se podívat na lambda kalkul, třeba Haskell (který se snaží být striktně funkcionální) atp. Nevykřikujte jen proto, že něčemu nerozumíte...

1. s nikým se nepřekřikuju, to by opravdu vypadalo jinak

2. řekněme, že mám nějaké zkušenosti s haskellem a prologem a teď se koukám na erlang, který se mi docela zalíbil. Ani lambda kalkulu se absolvent FI MU nevyhne.

3. do téměř jakéhokoli jazyka můžu zavést "funkcionální prvky", které funkcionální programování nějakým způsobem *připomínají*. I do céčka můžu zavést funkci map, která bude fungovat s callbacky. Takovou věc pak můžu používat tak, že to někomu bude *připomínat* funkcionální programování, zatímco někdo jiný  řekne, že to žádné funkcionální programování není. Jak mám vědět, co JS bude považovat za dostatečně *podobné* funkcionálnímu programování, bavíme-li se *procedurálním* jazyku? (s Inkvizitorem byla řeč o pythonu)

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

Ale k věci - ptal jsem se Inkvizitora, jaké "funkcionální prvky" v pythonu používá a co mu to přineslo (protože já prostě nemám potřebu takové prvky v pythonu používat).

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.

O tom, co je "elegantnější kód" se hádat rozhodně nebudu, protože to je věcí názoru.

 Protože Inkvizitor je normální a dá se s ním mluvit, tak jsem se ho prostě ZEPTAL, jaký má důvod používat něco, co já nemám moc potřebu používat a Guido von Rossum zjevně taky ne. To je celé - žádná hádka.

JS

Re: Čitelnost
« Odpověď #356 kdy: 10. 04. 2011, 19:02:55 »
V tomhle pripade se "funkcionalni" tyka moznosti mit funkce, ktere pracuji s funkcemi.

A roura pracuje s funkcemi?

Da se to tak chapat. Kdyz napisu treba "sort -n -k 1" nebo "grep hello -", vytvorim tim funkci, ktera bere radky standardniho vstupu a transformuje je na standardni vystup. Program sort nebo grep sam o sobe takovou funkci neni, protoze ma jeste dodatecne argumenty; teprve spolu s jeho argumenty tvori tu funkci ze stdin na stdout. Muzeme tedy ten program grep chapat jako funkci, ktera vraci funkci konkretni operace pro zadany argument. Operator "|" pak takove funkce sklada. Jak uz tady nekdo naznacoval, neskodilo by vam podivat se na lambda kalkul.

Re: Čitelnost
« Odpověď #357 kdy: 10. 04. 2011, 19:09:16 »
Da se to tak chapat.

Ale taky nemusí a proto jsem taky chtěl slyšet definici toho, co je a co není dostatečně "funkcionální" v kontextu, který se skutečným funkcionálním programováním nemá nic společného.

Jak uz tady nekdo naznacoval, neskodilo by vam podivat se na lambda kalkul.

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.



JS

Re: Na co všechno je dobrý LISP?
« Odpověď #358 kdy: 10. 04. 2011, 19:14:22 »
3. do téměř jakéhokoli jazyka můžu zavést "funkcionální prvky", které funkcionální programování nějakým způsobem *připomínají*. I do céčka můžu zavést funkci map, která bude fungovat s callbacky. Takovou věc pak můžu používat tak, že to někomu bude *připomínat* funkcionální programování, zatímco někdo jiný  řekne, že to žádné funkcionální programování není. Jak mám vědět, co JS bude považovat za dostatečně *podobné* funkcionálnímu programování, bavíme-li se *procedurálním* jazyku? (s Inkvizitorem byla řeč o pythonu)

Jenze to ma sve meze. Ja bych rad videl, jak do C zavedes funkci, ktera specializuje jeden argument zadane funkce (a vraci zase funkci), nebo jak tam zavedes funkci, ktera vrati funkci, ktera je slozenim 2 zadanych funkci. Oboji je potreba na implementaci neceho jako "|" v Unixu. V Pythonu se to udelat da, protoze ma uzavery. Takze, v jazyce jako C, jak takovou operaci, vyuzivajici "|", elegantne zapises?

alefo

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

Inak mam pocit, ze akonahle date vyvojarovi pracovat s funkciami ako plnopravnymi elementami a zacnete uvazovat vo funkciach, ich skladaniach, curryingoch, a pod., zacinate zavadzat elementy funkcionalneho programovania.

Mozete to spravit aj v Ccku cez pointre na funkcie a podobne, rovnako v Jave cez interfejsy, otazka bude, ako elegantne sa to bude pouzivat :-)