Kirjoittaja: map_ (17.12.2009)
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.
"Leppoisaa joulua!" println
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 )
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!Ludwig Mies van der Rohe kirjoitti:
Less is more.
Mietelause Io:n syntaksikuvauksessa.