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…
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.
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.