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 »
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 »
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í.

Kód: [Vybrat]
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
Kód: [Vybrat]
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 »
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 »
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 »
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 »
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 »
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 »
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 »
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 »
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 »
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:
Kód: [Vybrat]
funkce(par1, par2) a
Kód: [Vybrat]
(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 »
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 »
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.

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:
Kód: [Vybrat]
funkce(par1, par2) a
Kód: [Vybrat]
(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.