Kysymys on siitä, miten todellinen, viitattu aliohjelma liitetään omaan viittausympäristöönsä, missä näkyvyysalueessa aliohjelma on.
def A(i:Int, P:Unit):Unit = { // P on muodollinen funktioparametri
def B() = { // A:n sisäinen aliohjelma
println(i) // tämän i:n merkitys on se kiinnostava kohta:
}; // sidotaanko i ensimmäisessä vai toisessa (sisemmässä) A:n kutsussa
// A:n algoritmi (so. A:n "pääohjelma"):
if (i > 1)
P // muodollisen funktioparametrin kutsu!
else
A(2, B) // funktio B annetaan todellisena parametrina rekursiivisessa kutsussa
} // A:n määrittely päättyy
def C() = {} // C on tyhjä funktio, A:n kanssa rinnakkainen
// pääohjelma:
A(1, C) // funktio C annetaan todellisena parametrina
Tässä esimerkissä kyse on siitä, mihin A:n muodollisen parametrin i
versioon B:ssä viitataan, kun A on kutsunut itseään rekursiivisesti.
A:sta on kaksi aktivointia, jotka molemmat ovat määritelleet i:n, ja
siis molemmilla on oma i.
Syvässä sidonnassa (deep binding) käytetään A:n ensimmäisen aktivoinnin i:tä, matalassa sidonnassa (shallow binding) viimeisimmän aktivoinnin i:tä.
Katso myös toisten harjoitusten tehtävää 12!
Tämä saattaa näyttää äärimmäisen keinotekoiselta ongelmalta, mutta valinta on erityisesti funktionaalisten kielten kohdalla mitä merkittävin päätös!
Takaisin sisältösivulle.