Funkcionální jazyky.

Lama

Re:Funkcionální jazyky.
« Odpověď #15 kdy: 18. 08. 2015, 16:37:51 »
Mě napadlo, co kdyby se ty závorky barevně zvýraznily? Pak by to mohlo být čitelné i na jednom řádku. Stačilo by třeba 4-6 barev s tím, že s hlubším zanořováním by se barvy mohly cyklicky opakovat, to už by nevadilo. Třeba to některé editory dělají, nevím, v tomto jazyku sem nikdy nedělal.
A taky mi připadá ta první a poslední závorka jako zbytečná. Prostě zbytečně přezávorkováno.


Pavel Tisnovsky

Re:Funkcionální jazyky.
« Odpověď #16 kdy: 18. 08. 2015, 16:45:59 »
Citace od: k kdy 18. 08. 2015, 16:23:30
Citace od: Pavel Tisnovsky kdy 18. 08. 2015, 16:11:07
Taky by to slo napsat treba takto:
(forever (-> (read) (eval) (print)))

A je tohle ještě funkcionální ? To už je skoro jako klasika :-)
for (;;) { print(eval(read)) }

Proc by nebylo :), forever je jen makro postaveny nad loop-recur, -> je taky makro (to ted z hlavy nedam, jak je interne delany).

--,_O_,--

Re:Funkcionální jazyky.
« Odpověď #17 kdy: 18. 08. 2015, 16:52:26 »
Citace od: Radek Miček kdy 18. 08. 2015, 14:42:51
Citace od: --,_O_,-- kdy 18. 08. 2015, 14:23:06
třeba Haskell je mnohem přehlednější (jen je těžší se ho naučit) a i delší jednořádkové výrazy mohou být poměrně čitelné.

Zkuste napsat analogický program v Haskellu.

Domnívám se, že jednoduchost souvisí s přehledností.

input <- getContents
putStr (mojefunkce input)
{- příp.
(putStr.fce1.fce2.fce3) input
nebo
putStr $ fce1 someArg $ fce2 (dalsi argument...) input
-}

Ty složitější případy by v lispu vypadali asi takhle
println (fce1 (fce2 (fce3 (read))))
println (fce1 someArg (fce2 (dalsi argument...) (read)))

Což mi přehlednější nepřijde... jiná věc je, že v haskellu na to potřebujete IO, k čemuž nemáte vždy přímý přístup ale to je trochu jiná otázka.

Pavel Tisnovsky

Re:Funkcionální jazyky.
« Odpověď #18 kdy: 18. 08. 2015, 17:01:24 »
Citace od: Lama kdy 18. 08. 2015, 16:37:51
Mě napadlo, co kdyby se ty závorky barevně zvýraznily? Pak by to mohlo být čitelné i na jednom řádku. Stačilo by třeba 4-6 barev s tím, že s hlubším zanořováním by se barvy mohly cyklicky opakovat, to už by nevadilo. Třeba to některé editory dělají, nevím, v tomto jazyku sem nikdy nedělal.
A taky mi připadá ta první a poslední závorka jako zbytečná. Prostě zbytečně přezávorkováno.

jasne, editory rainbow parenthesis umi a pouzivaji (bez toho by se skutecne psalo spatne).
http://www.root.cz/clanky/uzitecne-skripty-a-pluginy-pro-textovy-editor-vim-3-cast/#k03

Radek Miček

Re:Funkcionální jazyky.
« Odpověď #19 kdy: 18. 08. 2015, 17:10:32 »
Citace od: --,_O_,-- kdy 18. 08. 2015, 16:52:26
Což mi přehlednější nepřijde... jiná věc je, že v haskellu na to potřebujete IO

Na to narážím - místo klasického skládání funkcí (.) budete potřebovat Kleisliho skládání (>=>), podobně ani použití eval nebude tak jednoduché, když budete chtít výsledek vytisknout.


k

Re:Funkcionální jazyky.
« Odpověď #20 kdy: 18. 08. 2015, 17:13:26 »
Citace od: Pavel Tisnovsky kdy 18. 08. 2015, 16:45:59
Proc by nebylo :), forever je jen makro postaveny nad loop-recur, -> je taky makro (to ted z hlavy nedam, jak je interne delany).

Tomu rozumím, nechce se Vám psát boilerplate nativně v Clojure tak to zmáknete pomocí maker jinak, až se to nebezpečně blíží imperativnímu programování :-) Mimochodem značné užívání maker obvykle značí nedokonalost jazyka, kdy programátor potřebuje víc než mu jazyk nabízí ;)

Kit

Re:Funkcionální jazyky.
« Odpověď #21 kdy: 18. 08. 2015, 17:24:36 »
Citace od: Lama kdy 18. 08. 2015, 16:37:51
A taky mi připadá ta první a poslední závorka jako zbytečná. Prostě zbytečně přezávorkováno.

Nejsou zbytečné. Bez závorek je to odkaz na strom, se závorkami je to jeho vyhodnocení.

Pavel Tisnovsky

Re:Funkcionální jazyky.
« Odpověď #22 kdy: 18. 08. 2015, 17:26:12 »
Citace od: k kdy 18. 08. 2015, 17:13:26
Citace od: Pavel Tisnovsky kdy 18. 08. 2015, 16:45:59
Proc by nebylo :), forever je jen makro postaveny nad loop-recur, -> je taky makro (to ted z hlavy nedam, jak je interne delany).

Tomu rozumím, nechce se Vám psát boilerplate nativně v Clojure tak to zmáknete pomocí maker jinak, až se to nebezpečně blíží imperativnímu programování :-) Mimochodem značné užívání maker obvykle značí nedokonalost jazyka, kdy programátor potřebuje víc než mu jazyk nabízí ;)

Ovšem nikoli v LISPovských jazycích, které s makry právě počítají :-) Co je velký problém  - termín "makro" používají i céčkové jazyky na úplně jinou a mnohem primitivnější věc, takže to lidi mají zažité jako něco špinavého, hnusný hack, divné chybové hlášení atd. Jenže v homoikonickém jazyku tomu tak není, tam mají makra svůj význam právě pro rozšíření možností jazyka, pro tvorbu DSL apod.

Lama

Re:Funkcionální jazyky.
« Odpověď #23 kdy: 18. 08. 2015, 17:41:13 »
Citace od: Kit kdy 18. 08. 2015, 17:24:36
Citace od: Lama kdy 18. 08. 2015, 16:37:51
A taky mi připadá ta první a poslední závorka jako zbytečná. Prostě zbytečně přezávorkováno.

Nejsou zbytečné. Bez závorek je to odkaz na strom, se závorkami je to jeho vyhodnocení.

Až takhle? Tak takový jazyk si odpustím.

k

Re:Funkcionální jazyky.
« Odpověď #24 kdy: 18. 08. 2015, 17:49:45 »
Již je mi to jasné, jazyk sám o sobě umí málo a makra jsou přímo nutnost :)

Pavel Tisnovsky

Re:Funkcionální jazyky.
« Odpověď #25 kdy: 18. 08. 2015, 18:03:13 »
Citace od: k kdy 18. 08. 2015, 17:49:45
Již je mi to jasné, jazyk sám o sobě umí málo a makra jsou přímo nutnost :)

Přesně tak :-)

[je dobré připomenout, že celý LISP je možné vytvořit jen ze čtyř funkcí a tří speciálních forem, to se potom polepí dohromady makry :D]

--,_O_,--

Re:Funkcionální jazyky.
« Odpověď #26 kdy: 18. 08. 2015, 18:04:50 »
Citace od: Radek Miček kdy 18. 08. 2015, 17:10:32
Citace od: --,_O_,-- kdy 18. 08. 2015, 16:52:26
Což mi přehlednější nepřijde... jiná věc je, že v haskellu na to potřebujete IO

Na to narážím - místo klasického skládání funkcí (.) budete potřebovat Kleisliho skládání (>=>), podobně ani použití eval nebude tak jednoduché, když budete chtít výsledek vytisknout.
No tak vždycky můžete použít IO monádu, ale třeba tak jak sem to napsal si můžete napsat libovolnou "pure" funkci [Char] -> [Char] a o IO se postará main... celkově složitostí jednoho konkrétním programu přehlednost jazyka nezměříte, zvlášť když jde o tak specifickou věc jako interpret daného jazyka. To by v tomhle případě byl nejpřehlednější bash.

Kit

Re:Funkcionální jazyky.
« Odpověď #27 kdy: 18. 08. 2015, 18:10:03 »
Citace od: Lama kdy 18. 08. 2015, 17:41:13
Citace od: Kit kdy 18. 08. 2015, 17:24:36
Nejsou zbytečné. Bez závorek je to odkaz na strom, se závorkami je to jeho vyhodnocení.

Až takhle? Tak takový jazyk si odpustím.

Těch závorek není víc než v jiném jazyce. Srovnej: funkce(par1, par2) a (funkce par1 par2) -  závorka navíc tam není a ještě ušetříš čárku.

Radek Miček

Re:Funkcionální jazyky.
« Odpověď #28 kdy: 18. 08. 2015, 18:31:37 »
Citace od: --,_O_,-- kdy 18. 08. 2015, 18:04:50
Citace od: Radek Miček kdy 18. 08. 2015, 17:10:32
Citace od: --,_O_,-- kdy 18. 08. 2015, 16:52:26
Což mi přehlednější nepřijde... jiná věc je, že v haskellu na to potřebujete IO

Na to narážím - místo klasického skládání funkcí (.) budete potřebovat Kleisliho skládání (>=>), podobně ani použití eval nebude tak jednoduché, když budete chtít výsledek vytisknout.
celkově složitostí jednoho konkrétním programu přehlednost jazyka nezměříte, zvlášť když jde o tak specifickou věc jako interpret daného jazyka.

Souhlasím. Nicméně, když se podíváte na kód, který dělá vedlejší efekty (např. práce s DB, grafická uživatelská rozhraní), tak IMO situace nebude o nic lepší.

--,_O_,--

Re:Funkcionální jazyky.
« Odpověď #29 kdy: 18. 08. 2015, 18:50:20 »
Citace od: Radek Miček kdy 18. 08. 2015, 18:31:37
Citace od: --,_O_,-- kdy 18. 08. 2015, 18:04:50
Citace od: Radek Miček kdy 18. 08. 2015, 17:10:32
Citace od: --,_O_,-- kdy 18. 08. 2015, 16:52:26
Což mi přehlednější nepřijde... jiná věc je, že v haskellu na to potřebujete IO

Na to narážím - místo klasického skládání funkcí (.) budete potřebovat Kleisliho skládání (>=>), podobně ani použití eval nebude tak jednoduché, když budete chtít výsledek vytisknout.
celkově složitostí jednoho konkrétním programu přehlednost jazyka nezměříte, zvlášť když jde o tak specifickou věc jako interpret daného jazyka.

Souhlasím. Nicméně, když se podíváte na kód, který dělá vedlejší efekty (např. práce s DB, grafická uživatelská rozhraní), tak IMO situace nebude o nic lepší.

Tak nikdo vám nebrání používat Haskell jako procedurální jazyk, jen se pak nemůžete tvářit, že ten kód je funkcionální jako v lispu.

Citace od: Kit kdy 18. 08. 2015, 18:10:03
Citace od: Lama kdy 18. 08. 2015, 17:41:13
Citace od: Kit kdy 18. 08. 2015, 17:24:36
Nejsou zbytečné. Bez závorek je to odkaz na strom, se závorkami je to jeho vyhodnocení.

Až takhle? Tak takový jazyk si odpustím.

Těch závorek není víc než v jiném jazyce. Srovnej: funkce(par1, par2) a (funkce par1 par2) -  závorka navíc tam není a ještě ušetříš čárku.
Taky se u jazyků jako C dlouhý jednořádkový příšery moc často nepoužívaj. U Lispu to je to problém, protože to často ani jinak nejde.