Na co všechno je dobrý LISP?

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #330 kdy: 05. 04. 2011, 21:55:22 »
Haskell? Jsem rád, že tu je někdo, kdo my poradí lamerskými dotazy až se  začnu učit haskell...  ;D
Erlang mě přivedl k funkcionálnímu programování, ale jednak není čistě funkcionální, a jednak na desktopové aplikace se zrovna moc nehodí...

Tak s vyloženě lamerskými dotazy klidně, ale guru nejsem. Ovšem jestli je zrovna Haskell ideální jazyk pro GUI aplikace, to nevím nevím...


Re: Na co všechno je dobrý LISP?
« Odpověď #331 kdy: 05. 04. 2011, 22:07:33 »
Jestli tomu dobře rozumím, tak prakticky jediná výtka proti Pythonu, která zůstala, je Guido nemá rád FP.

On k tomu nejspíš bude mít dobré důvody... Imho pokud se do procedurálního jazyka typu Pythonu zavedou takovéty základní funkcionální obraty, tak to lidi, kteří k funkcionálnímu programování někde přičichli, můžou začít používat bez rosmyslu, což může věst k sice kratšímu, ale méně čitelnému kódu (map), v horším případě (chybí funkcionální optimalizace) k zbytečně neefektivnímu kódu (reduce).

Já osobně tyhle "funkcionální" prvky v pythonu nepoužívám vlastně vůbec.

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #332 kdy: 05. 04. 2011, 23:00:58 »
Já osobně tyhle "funkcionální" prvky v pythonu nepoužívám vlastně vůbec.

Jestli jsem někdy v praxi použil reduce, to si ani nevzpomínám, ale v našich projektech se to jenom hemží věcmi typu list comprehension nebo ještě raději generator expression, používáme lambdy, generátory, asi před rokem kolega s úspěchem nasadil do GUI kódu "currying" (tu pythonní obdobu) pro předzpracování zobrazených dat. A to jsem ho na to ani moc nenavedl. Většina kódu v části produktů je i v tom Pythonu psána dost deklarativně a občas přepíšu nějaký kousek staršího kódu, aby byl funkcionálnější a je to znát na čitelnosti.

Za každou cenu tedy z Pythonu nedělám FP jazyk, ale jsem nakažený (a šíří se to, aspoň v našem týmu).

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #333 kdy: 06. 04. 2011, 02:36:43 »
Jo, destructuring-bind dělá něco takového. Ale poradí si třeba s něčím takovým (předpokládám, že ten kód je poměrně pochopitelný)?

No, destructuring-bind jako takovy pojmenovat podvyraz neumi, ale s trochou googleni jsem nasel http://common-lisp.net/project/cl-match/doc/clmatch.htm, ktere to patrne umi (prikaz "as").

Re: Na co všechno je dobrý LISP?
« Odpověď #334 kdy: 06. 04. 2011, 21:39:29 »
asi před rokem kolega s úspěchem nasadil do GUI kódu "currying" (tu pythonní obdobu) pro předzpracování zobrazených dat.

Chápu to správně, že místo f(data1) -> data2; g(data2) -> data3 pouzil f(data1) -> g; g() -> data3? Má to nějaké významné výhody, převažující nevýhodu, že sa na data2 nemůžu kouknout?


Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #335 kdy: 06. 04. 2011, 23:16:25 »
asi před rokem kolega s úspěchem nasadil do GUI kódu "currying" (tu pythonní obdobu) pro předzpracování zobrazených dat.

Chápu to správně, že místo f(data1) -> data2; g(data2) -> data3 pouzil f(data1) -> g; g() -> data3? Má to nějaké významné výhody, převažující nevýhodu, že sa na data2 nemůžu kouknout?

V konkrétním kontextu (přiřazení metody v konstruktoru objektu) to má dost velkou výhodu v tom, že prakticky celé chování objektu je zřejmé z jednoho rychlého pohledu. Žádný meziobjekt s vlastním jménem se nevytváří. Představ si, že máš pole slovníků s daty jednotlivých řádků (třeba z databáze) a GUI objekt, který z těchto řádků dokáže vybrat podmnožinu zobrazených údajů (z klíčů ve slovníku) do sloupců a transformovat ji dynamicky podle aktuálního nastavení sloupců. Z transformace vzejde dvojice (reprezentace, řadicí data) tak, že ze slovníku { 'jmeno': 'KaRel', 'vek': 23 } uděláme { JMENO: ('Karel', 'Karel'), VEK: ('23', 23) }. Konstruktor pro sloupec má hlavičku

Kód: [Vybrat]
def __init__(nazev, transformace):

Pro každý sloupec můžeš udělat samozřejmě udělat samostatnou funkci typu

Kód: [Vybrat]
def transformujVek(radek):
  return (str(radek[klic]), radek[klic])

a tu funkci přidat do konstruktoru. Pokud si ale uděláš funkci transformuj(), která obsahuje functools.partial(), vypadá deklarace sloupců pro danou transformaci třeba takto:

Kód: [Vybrat]
Sloupec(
 JMENO,
 transformuj('jmeno', lambda x: x.capitalize(), lambda x: x)
),
Sloupec(
 VEK,
 transformuj('vek',lambda x: x, lambda x: x)
)

Příklad jsem zjednodušil a upravil, ve skutečnosti dochází k transformaci různorodých dat, skutečný kód je psán trochu pěkněji a samozřejmě je možné při volání funkce transformuj() vynechat implicitní hodnoty (typu lambda x: x). Ale doufám, že je z příkladu jasné, k čemu to slouží. Na parametry funkce transformuj() nikdy nikdo nahlížet nepotřeboval.

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #336 kdy: 06. 04. 2011, 23:20:32 »
Oprava:

Kód: [Vybrat]
def transformujVek(radek):
  return (radek['vek'], radek['vek'])

Re: Na co všechno je dobrý LISP?
« Odpověď #337 kdy: 10. 04. 2011, 12:26:19 »
@Inkvizitor: Takže šlo vlastně jenom o to, aby byl kód pěkný a přehledný?

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #338 kdy: 10. 04. 2011, 12:53:46 »
@Inkvizitor: Takže šlo vlastně jenom o to, aby byl kód pěkný a přehledný?

Tak nějak. Podle mě to ale není málo.

Re: Na co všechno je dobrý LISP?
« Odpověď #339 kdy: 10. 04. 2011, 13:09:05 »
Tak nějak. Podle mě to ale není málo.

Někdy to může být hodně, někdy je to celkem zbytečná námaha. Občas se asi nám všem stává, že zbytečně píšeme kód nějak kvůli své představě, jak by měl vypadat, aniž by to mělo nějaký znatelný efekt pro zákazníka :)

(tím ti tohle vůbec nepodsouvám, mluvím spíš o své zkušenosti :)

Program

Re: Čitelnost
« Odpověď #340 kdy: 10. 04. 2011, 13:41:18 »
Tak teď se musím ozvat. Čitelnost kódu je vždy na 1. místě. I špatný a neefektivní kód, když není zprasený, může někdo programátorsky zdatnější dát dohromady. Nečitelný kód nikdy. Tvrzení, že čitelnost a přehlednost kódu není důležitá, je jako tvrzení, že při programování není potřeba mozek, však to stejně píší ruce, ne?

Re: Čitelnost
« Odpověď #341 kdy: 10. 04. 2011, 14:00:15 »
Tak teď se musím ozvat. Čitelnost kódu je vždy na 1. místě. I špatný a neefektivní kód, když není zprasený, může někdo programátorsky zdatnější dát dohromady. Nečitelný kód nikdy. Tvrzení, že čitelnost a přehlednost kódu není důležitá, je jako tvrzení, že při programování není potřeba mozek, však to stejně píší ruce, ne?

O tom ale vůbec není řeč. Šlo o to, že buď mám kód napsaný normálně hezky a čitelně "procedurálně", nebo normálně hezky a čitelně "funkcionálně".

JS

Re: Čitelnost
« Odpověď #342 kdy: 10. 04. 2011, 14:54:12 »
O tom ale vůbec není řeč. Šlo o to, že buď mám kód napsaný normálně hezky a čitelně "procedurálně", nebo normálně hezky a čitelně "funkcionálně".

Myslim, ze z kontextu je jasne, ze ten problem elegantneji proceduralne zapsat neslo, kdezto funkcionalne ano. Pokud chcete trivialni priklad takove situace, staci se podivat na Unixovou pipe. To je fakticky funkcionalni zapis zpracovani dat (definujete novou funkci jako slozeni existujicich pomoci operatoru "|"), ktery by se proceduralne zapisoval obtizneji.

Inkvizitor

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

Re: Čitelnost
« Odpověď #344 kdy: 10. 04. 2011, 15:24:30 »
Myslim, ze z kontextu je jasne, ze ten problem elegantneji proceduralne zapsat neslo

Elegance kódu je subjektivní záležitost.