Kirjautuminen

Haku

Tehtävät

Joulukalenteri 2009: Io

Kirjoittaja: map_ (17.12.2009)

Esittely

Io on Steve Dekorten vuonna 2002 luoma kevyt ja joustava dynaamisesti tyypitetty olio-ohjelmointikieli. Kielen minimaalisuus ilmenee äärimmäisen puhtaana oliomallina: kielessä ei voi tehdä melkein mitään muuta kuin lähettää olioille viestejä (metodikutsuja). Jopa kontrollirakenteet, kuten if, while, for, break ja try ovat vain viestejä.

Io:n pelkistetty oliomalli on samankaltainen kuin Smalltalkissa. Perintä on toteutettu prototyyppiperintänä, kuten mm. JavaScriptissä. Io-koodi on dataa, jota Io-koodi voi tutkia ja käsitellä, mikä on tuttu idea Lispistä. Lua:n tavoin Io on helposti sulautettavissa C/C++-ohjelmiin.

Esimerkki: Tekstin tulostus

"Leppoisaa joulua!" println

Esimerkki: Fibonaccin luvut

Seuraava ohjelma tulostaa Fibonaccin luvut, jotka ovat alle 100:

a := 0
b := 1
while (a < 100,
  a println
  c := a + b
  a = b
  b = c
)

Kontrollirakenteet metodeina

Io:n perussyntaksi on: olio viesti(parametrit). Jos olioa ei anneta, viesti menee thisContext-muuttujan osoittamaan olioon, joka on päätasolla oletusolio nimeltä Lobby. Lobby:n prototyyppi on Object, joka osaa vastata mm. kaikkiin kontrollirakenneviesteihin, kuten if. Leikitäänpä...

# Kaikki metodikutsut kohdistuvat oletusarvoisesti Lobbyyn.

# Voimme luoda uuden metodin Objectin viestillä "method"
f := method(a, b, a + b)   # Lobbylle kutstuaan muuttujan luontimetodia
f(1, 2) println            # Lobbylle kutsutaan metodia f parametreilla 1 ja 2.
                           # Paluuarvolle kutsutaan metodia println

# If-metodia käytetään seuraavasti:
if(1 + 1 == 2) then(
  "hyvä" println
) else(
  "huono" println
)

# Katsotaanpa, miten tämä on toteutettu.
if(1 + 1 == 2)                     # Palauttaa true

# Entä, kun true:lle kutsutaan then-metodia?
true then("hoi" println)           # Tulostaa "hoi" ja palauttaa nil

# Ja kun nil:lle kutsutaan else-metodia?
nil else("hoi" println)            # Ei tulosta mitään.

# Toisin päin:
if(1 + 1 == 3)                     # Palauttaa false
false then("hoi" println)          # Ei tulosta mitään, palauttaa false
false else("hoi" println)          # Tulostaa "hoi"


# if-viesti osaa hoitaa myös lyhennysmerkintätapauksen, jossa se saa kolme argumenttia:
if(1 + 1 == 2, "hyvä" println, "huono" println)


# Io:ssa on monia mielenkiintoisia viestejä, joilla voi toteuttaa mitä hienoimpia metaohjelmointikikkoja. Tässä pari esimerkkiä.

lueA := method(call sender a)  # Palauttaa kutsujan paikallinen muuttuja "a"

method(
  a := 13
  lueA println                 # Tulostaa 13
) call


vainKerran := method(toiminto,
  call message setName("nil")  # Vaihdetaan kutsuvassa koodissa metodikutsun kohde
)

heh := method(
  vainKerran("Hyvää " print)   # Muuttuu ensimmäisen kutsun jälkeen muotoon nil("Hyvää " print)
  "joulua!" println
)
heh  # Hyvää joulua!
heh  # joulua!
heh  # joulua!

Lainaus

Ludwig Mies van der Rohe kirjoitti:

Less is more.

Mietelause Io:n syntaksikuvauksessa.

Linkkejä

Tietoa sivustosta