Vlákno názorů k článku Scheme: kostlivec ve skřini nebo nehasnoucí hvězda? od Trm - Predem, rict, ze funkcionalni jazyky jsou ,,deklarativni'' je...

  • Článek je starý, nové názory již nelze přidávat.
  • 10. 12. 2007 3:48

    Trm (neregistrovaný)
    Predem, rict, ze funkcionalni jazyky jsou ,,deklarativni'' je absolutni nesmysl. Mozna u nekterych z nich (trochu) ano, ale vetsina z nich, a predevsim dialekty LISPu, zasadne nikoliv. Maji jasne dany algoritmus vyhodnocovani a aplikace a vubec nic deklarativniho na nich neni.
    Mam pocit, ze autor chtel udelat funkcionalnim jazykum sluzbu, ale misto toho jim udelal svym sarlatanstvim spis ,,medvedi sluzbu''. Dalsi blabol, ze LISP byl vyvinut pro ucely programovani AI, totalni hovadina. A na zaver to nejhorsi: demonstrovat ,,silu'' dialektu LISPi na takove debilite jako je faktorial, ktera lze mnohem efektivne vyresit prostou iteraci s jednou stavovou promennou a jednim kolektorem je proste ukazka cire neschopnosti. Do prdele, autore, to se tam nemohl placnout nejake pekne makro s aktualnim prohracovanim? Kdyz dela nekdo recenzi nejnovejsiho vozu Bentley, tak taky zakaznikum nevysvetluje, ze to ma kola, ale spis chce ukazat neco, co jiny auta nemaji, ... ach jo.
  • 10. 12. 2007 4:24

    Rejpal (neregistrovaný)
    A na zaver to nejhorsi: demonstrovat ,,silu'' dialektu LISPi na takove debilite jako je faktorial, ktera lze mnohem efektivne vyresit prostou iteraci s jednou stavovou promennou...
    Něco jako (fold * 1 (iota n 1))? :-D
  • 10. 12. 2007 7:58

    Trm (neregistrovaný)
    Tohle by prisne vzato asi vedlo na rekurzivni proces, ale pointa ja myslim jaska n! jde vypocitat vsude s pouzitim jednoho cyklu. To je houby rekurze. :)
  • 10. 12. 2007 8:28

    Rejpal (neregistrovaný)

    Ale cyklus je speciálním případem rekurze. :-) Rekurzivní zápis je koncept (stejně jako třeba dynamické programování), nikoli implementace nějakým zásobníkem. :-) Fold je v SRFI-1 zcela určitě tail-rekurzivní, přinejmenším jeho referenční implementace poskytovaná se specifikací. Iota sice consuje, ale pak taky můžu použít SRFI-42 (early comprehensions) a zasat to jako (product-ec (:range i 1 (+ n 1)) i). ;-)

    (Ale já jako starý commonlispový prase bych to napsal jako (iter (for i from 1 to 10) (accumulate i by #'* initial-value 1)). :-DDD)

  • 10. 12. 2007 18:01

    Trm (neregistrovaný)
    No to jo, ale vetsina programatoru lamu maji vuci rekurzi nejaky blok; takze kdyz uvidi neco, co muzou nabouchat v jinym jazyce cyklem, tak si reknout: proc proboha pouzivat jazyk, ve kterem to musim (i kdyz nutne nemusi) napsat takhle i kdyz to nakonec dopadne jako cyklus (i kdyz tohle se z clanku taky nedozvi). Melo se to zkratka ukazat na necem netrivialnim, co si clovek cyklem (a pripadnym pouzitim zasobniku) nelajzne udelat, pac je to prasarna. Ale, skoda lamentovat. Jinak Common LISPu zdar! To je jazyk pro skutecne muze. Zrovna vcera jsem se kochal kusem cerstve napsaneho zdrojaku a rikal si: tak Javisti, chtel bych vas ted videt. :):):)
  • 10. 12. 2007 22:55

    Miloš (neregistrovaný)
    Jestli se na něco rekurze absolutně nehodí, pak je to právě výpočet faktoriálu. Nechápu, proč je rekurze vždy prezentována na tomto případě a to i ve školách. Daleko vhodnější příklad by byl třeba průchod stromem - kde má rekurze opravdu smysl. (Do šířky roste rychleji, než do hloubky). I když já i ten dělám zásadně bez rekurze - s využitím zásobníku. Možná mám blok - nebo taky poruchu osobnosti - ale aspoň poznám i po letech, co ten program opravdu dělá. Je totiž daleko čitelnější - i když, pravda, delší. Ve skutečnosti lze každou rekurzi nahradit zásobníkem ( a v podstatě ani o nic jiného nejde).Tvrdit, že jde o prasečinu, je poněkud odvážné. Nicméně pokud někdo nalézá v rekurzích zálibu (a programy mu chodí), nikdy bych si nedovolil ho zesměšňovat. Takový nadutec nejsem.
  • 10. 12. 2007 23:24

    Palo (neregistrovaný)
    Na 95% suhlasim. Ja nemam az taky problem s rekurziou, mozno preto ze som kedysi pouzival aj LISP a prechod stromu by som iste radsej riesil rekurziou. V kazdom pripade by som ale chcel povedat ze rekurzia sa da urobit aj v Jave. Tam mate na vyber.
  • 11. 12. 2007 16:27

    Trm (neregistrovaný)
    No ja nevim, ale mam pocit, ze jste krapet nechytili pointu. Ve scheme ma slovek samozrejme taky na vyber, existuje neco jako DO. Ale to je jedno. Pruchod stromem, pripadne grafem pomoci zasobniku je OK, to neni nejaky ukrutny problem, i kdyz citelnost programu vyrazne klesa. Na druhou stranu, kdo programuje cokoliv, kde treba upravuje symbolicke vyrazy, a dela to iterativne a se zasobnikem, je sam proti sobe, protoze je to prasarna jak hrom a neni to ani trochu odvazne tvrzeni. Jinak doby, kdy se lidi bali rekurze jsou snad ty tam, vic jak 64 kB RAMky uz mame snad vsichni, ne?
  • 11. 12. 2007 16:51

    Rejpal (neregistrovaný)
    Fígl je v tom, že explicitní zásobník řeší jen jednu věc, a sice ten zásobník pushdown automatu. Má-li člověk třeba několik různých funkcí (třeba strom má několik typů uzlů), kterým navíc předává různé parametry, začne se to dost prasit - nebo aspoň mi cokoli jiného přijde hodně nepřirozené. Jak praví pánové Sussman a Steele, lambda (resp. volání funkce) je jen "goto s předáváním parametrů". Těmi funkcemi také hravě nahradím stavový automat, který bych v C asi musel psát smyčkou, protože pokud nemám zásobník, zařídí tail rekurze nulovou spotřebu zásobníku.

    Když jsem onehdá zjistil, jak krásně lze klasický céčkoidní stavový automat typu "while smyčka se switchem na aktuální stav a přiřazením pro jeho změnu" nahradit tím, že mám pojmenované funkce, jejich názvy označují příslušné stavy a prostým zavoláním dotyčné funkce přejdu do příslušného stavu a ještě "syntakticky zadarmo" předám parametry, které daný stav může požadovat k rozhodování, docela jsem zajásal - nevím, ale skutečně mi přijde, že jsou případy, kdy je rekurzivní zápis o tolik průhlednější, že mě Cčko bolí (a kvůli "drobným problémům" s tail rekurzí v C to nelze tak snadno řešit). Dokážu to psát, to ano, ale dnes už jen z donucení. ;-) (Což neznamená, že bych byl rekurzivní bigot, leckdy taky rád smyčkuju, oni i Schemeři si píší loop makra, páč to _je_ často naopak zase čitelnější přes smyčku, a nebránil bych se ani TAGBODY/GO (ekvivalent GOTO, byť "poněkud" inteligentnější ;-)), kdybych třeba přepisoval něco z Knutha, který tak algoritmy zapisuje, a přepsat je mechanicky je největší záruka toho, že se přepis povede.)
  • 11. 12. 2007 17:48

    Miloš (neregistrovaný)
    S tím souhlasím. Nejsem proti rekurzím tam, kde jsou vhodné a používám je také. Ale přímá rekurze (A volá A) vhodným příkladem není. To je přirozeně iterační algoritmus. Já jen, že bychom neměli zacházet do extrémů.
  • 12. 12. 2007 10:05

    Inkvizitor (neregistrovaný)
    Pokud se to napíše jako koncová rekurze, stejně to lze převést automaticky na iteraci. Na druhou stranu ovšem, pokud ten rekurzivní algoritmus provádí nedestruktivní operace, může systém ten algoritmus automaticky paralelizovat. Ano, čistě funkcionální přístup je extrémní, protože se nestará o konkrétní průběh výpočtu na daném stroji. To ale nemusí být nutně špatné.
  • 10. 12. 2007 13:02

    Pavel Tisnovsky (neregistrovaný)
    Melo tam byt spise receno, ze u Scheme se primo v definici jazyka jasne rika, kdy se provede rekurze (skutecne volani funkce) a kdy se volani "rozbali" - tail recursion. Strasne moc zalezi na zapisu toho rekurzivniho volani a prave v tomto je Scheme docela dobre pro vyuku. Osobne jsem taky nikdy moc nechapal, proc nam rekurzi vysvetlovali prave na faktorialu, ktery se mnohem snaz zapisuje smyckou.
  • 10. 12. 2007 13:23

    Rejpal (neregistrovaný)
    Tak tak, mnohem hezčí je tree fold, nebo na tail rekurzi nějaký ten pěkný stavový automat. :-)