Vlákno názorů k článku Clojure a bezpečné aplikace pro JVM: sekvence, lazy sekvence a paralelní programy od dumblob - Chtel bych podekovat za krasny serial. Closure se...

  • Článek je starý, nové názory již nelze přidávat.
  • 10. 7. 2012 23:26

    dumblob (neregistrovaný)

    Chtel bych podekovat za krasny serial. Closure se mi nesmirne libi.
    Jenom bych se chtel ujistit, ze chapu dobre pouziti fce apply. Pokud apply predam pouze dva parametry (tzn. fce a "ten posledni"), bude zavolana fce s "rozbalenym" poslednim parametrem (predpokladam, ze se rozbaluje pouze jedna uroven). Tzn.

    (apply fce [d [e] f])

    je zrejme chybne v pripade, ze fce neumi pracovat s vektory. Toto mi tedy umoznuje na misto posledniho parametru predat lazy sekvenci (tzn. v dobe kompilace neznamy pocet prvku). Pokud vsak znam nektere parametry jiz v dobe kompilace, mohu je zapsat jeste pred tim poslednim parametrem. Tyto se vsak jiz nebudou "rozbalovat". Je to tak?

    (apply fce nerozbali take_nerozbali [tohle rozbali])
  • 11. 7. 2012 22:51

    Pavel Tišnovský
    Zlatý podporovatel

    Ano, je to tak, pro apply je dulezity pouze jeji prvni parametr (vlastni funkce) a posledni parametr (obecne lazy sekvence a samozrejme vsechno specialnejsiho, napriklad vektor, seznam...). Ty parametry "mezi" jsou tam proto, ze nektere funkce proste vyzaduji vetsi pocet parametru, nejenom jednu rozbalenou sekvenci. Nejjednodussi priklad je prave scitani, tam se ale moc nepozna, jak to vlastne funguje - co se quotuje a co rozbaluje:

    user=> (apply + [1 2 3])
    6
    user=> (apply + '(1 2 3))
    6
    user=> (apply + 1 2 3 '(1 2 3))
    12

    To je ovsem jednoduche, zajimavejsi je napriklad toto pouziti:

    (map
        (fn
            [x]
            (apply max x))
        '( [1 2 3] [4 5 6] [7 8 9]))
     
    (3 6 9)