f(a+b[i]-g(c));Ensin lasketaan kutsun ympäristössä a+b[i]-g(c) ja välitetään saatu arvo kutsutulle aliohjelmalle.
Näin ei kuitenkaan tarvitse olla! Eikä aina ole. Argumentit voidaan evaluoida myös vasta silloin, kun muodolliseen parametriin viitataan - ja jos ei viitata, voidaan olla kokonaan evaluomatta.
"Tavallista" tapaa, evaluointia ennen aliohjelman käynnistämistä, kutsutaan englanniksi nimellä applicative-order evaluation, sitä toista nimellä normal-order evaluation.
Esimerkkejä jälkimmäisestä:
#define DIVIDES(a,n) (!((n) % (a))) /* true iff n has zero remainder modulo a */(Ja paras sitten muistaa laittaa nuo kaikki sulkeet, tai... ;-)
f(a+b[i]-g(c));Kun (ja jos) aliohjelma f viittaa todelliseen parametriinsa, lauseke a+b[i]-g(c) käydään todellakin laskemassa kutsuneen (ali-)ohjelman viittausympäristössä! Tunnukset a, b, i, g ja c ymmärretään siis täysin kutsujan ympäristössä. Ja esimerkikisi g:n mahdolliset sivuvaikutukset tehdään kutsujan ympäristössä. (Mitäs tämä tarkoittaa aktivaatiotietuepinon käsittelyn kannalta!?) (Asiaan palattaneen luvussa 8.)
def laiska(p: => Unit) { println("--- laiska alkaa ---") p println("--- laiska päättyy ---") } def vilkas(p:Unit) { println("--- vilkas alkaa ---") p println("--- vilkas päättyy ---") } // pääohjelma: laiska({println("Terveisiä pääohjelmasta!")}) // tässä funktioliteraali println // todellisena parametrina! vilkas({println("Terveisiä pääohjelmasta!")})Ohjelma tulostaa:
--- laiska alkaa --- Terveisiä pääohjelmasta! --- laiska päättyy --- Terveisiä pääohjelmasta! --- vilkas alkaa --- --- vilkas päättyy ---