Hlavní navigace

Vlákno názorů k článku Základy programování ve Squeaku (2) od klusacek - Jestli jsem to dobre pochopil tak bloky by...

  • Článek je starý, nové názory již nelze přidávat.
  • 5. 8. 2010 11:29

    klusacek (neregistrovaný)

    Jestli jsem to dobre pochopil tak bloky by se mely dat vyuzit k linemu vyhodnocovani.


    Rekneme ze chci napriklad C-style OR. Tedy a || b nejdriv vyhodnoti a, a teprve kdyz je false tak se snazi vyhodnotit i b. Predpokladam ze smalltalk nejdriv vyhodnoti kdo je prijemce a jake jsou parametry zpravy a pak ji teprve posila. Cili a || b bude znamenat ze se vyhodnocuje nejdriv a pak b a naknec se tomu na co se vyhodnotilo a posle zprava s obsahem toho na co se vyhodnotilo b (predstavte si ze a i b jsou nejake slozite uzavorkovane vyrazy).


    Kdyz ale napisu a || [b], tak se b nevyhodnocuje a do acka se posle ‚zdrojak‘ bcka, ktery teprve muzu vyhodnocovat uvnitr zpracovani zpravy ||, kdyz mu poslu zpravu value. Takze jestli se navic pro normalni objekty chova value jako identita, tak muzu psat oboji a||b i a||[b], kde prvni ma semantiku jako v pasacalu a druhy zapis jako v Ccku.
    Je to tak? Bylo by to docela elegantni…

  • 5. 8. 2010 11:35

    Pavel Tišnovský
    Zlatý podporovatel

    Ten blok [ b ] se skutecne nevyhodnocuje do te chvile, nez ho k tomu donutis, je to neco jako apostrof v Lispu :-). Takze bloky=normalni objekty si muzes predavat kam chces, pouzivat je jako parametry zprav a teprve ve vhodne chvili se vyhodnoti a popr. se jim „dosadi“ parametry – opet poslanim zpravy.

  • 5. 8. 2010 11:37

    Pavel Tišnovský
    Zlatý podporovatel

    tedy je to neco na zpusob (v cecku nerealizovatelny) tohoto zapisu:
    a || { b }
    kde { b } je programovy blok (ktery vsak v cecku nema takove vlastnosti jako blok ve Sqeaku)

  • 5. 8. 2010 13:58

    Pavel Křivánek

    Ono je to ve Smalltalku vyřešeno trochu jinak:
    & vyhodnocuje vždy obě strany
    and: vyhodnocuje líně.
    Takto je na první pohled vidět, jestli má být vyhodnocování líné nebo ne. To, co chcete, by vypadalo takto:

    True >> && alternativeBlock
      ^ alternativeBlock value
    False >> && alternativeBlock
      ^ alternativeBlock isBlock
        ifTrue: [self]
        ifFalse: [alternativeBlock value. self]

    Zpráva value u normálních objektů vráti volaný objekt.
    Binární zprávu pojmenovanou || nelze ve Smalltalku vytvořit kvůli kolizi s definici dočasných proměnných.