Oppimateriaalin copyright © 2009 Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.
(Muutettu viimeksi 16.3.2009)

Matala ja syvä sidonta

Matala ja syvä sidonta (shallow and deep binding) liittyvät aliohjelmien välittämiseen parametreina tai yleisemmin aliohjelmaviitteisiin - esimerkiksi muuttuja voisi olla tyypiltään aliohjelma ja muuttujan arvona voisi olla milloin mikin sopivan tyyppinen aliohjelma.

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.