Az Io programozási nyelv

Objektumelvűség

Az Io-ban minden objektum.

Prototípus vs. Osztály

Az Io egy prototípus alapú nyelv, osztály helyett prototípusról beszélünk. A prototípus és az osztály fogalma nem összetévesztendő: A prototípus egy objektum, ami egy másik objektum klónozásával jött létre; és üzeneteket küldhetünk neki. Az osztály ezzel szemben egy minta, ami alapján objektumokat tudunk létrehozni.

Objektumok

Minden objektum valamely más objektum klónja, nem pedig valamely osztály példánya.

Az objektumoknak slotjaik vannak. Egy objektum slotok halmaza. A slot egy értéket tárol, amit egy kulcs azonosít. A kulcs egy szimbólum, mely egyedi és nem megváltoztatható. Az érték típusa tetszőleges. Egy slot az első rá hivatkozó írási műveletkor jön létre. Egy slot értékét úgy lehet megkapni, ha elküldjük az objektumnak a slot nevét. A type slot visszaadja egy objektum prototípusát, ami szintén egy objektum.

Ha egy objektum neve nagybetűvel kezdődik, akkor ő valójában típust jelöl, és rendelkezik a type slottal. Az ilyen objektumot nevezzük prototípusnak. Ha egy objektum neve kisbetűvel kezdődik, akkor ő valójában egy példány, amely ugyan type slottal nem rendelkezik, de elküldve neki a type üzenetet az ő prototípusa (amiből klónoztuk) type slotjának az értékét kapjuk. Minden objektum (típus vagy példány) klónozással jön létre, méghozzá úgy, hogy egy már meglévő objektumnak elküldjük a clone üzenetet. Minden objektumnak van prototípusa, egy objektumnak több protípusa is lehet (Többszörös öröklődés)!

A gyökér szintű objektum az Object.

Az Io névtér objektuma a Lobby. Itt található minden névvel ellátott objektum.

Objektum létrehozása

Person := Object clone me := Person clone Dog := Object clone myDog := Dog clone

Klónozáskor meghívódik az új pédány init nevű slotja, amennyiben van neki ilyen.

Példányváltozó létrehozása

myDog name := "rover"

Példánymetódus létrehozása

myDog sit := method("I'm sitting\n" print)

Object reflection

Az object reflection segítségével metainformációkat szerezhetünk egy objektumról és annak slotjairól.

myMethod := myDog getSlot("sit")
==> method("I'm sitting\n" print)
myMethod
==> I'm sitting
method(a, a * 2) code
==> method(a, a * 2)

Metódusok

A metódusok névtelen függvények, hatáskörkezelésük dinamikus. Az alapértelmezett visszatérési érték az utoljára kiértékelt kifejezés eredménye lesz.

Metódust létrehozni az Object method()-jével lehet.

method((2 + 2) print)
==> method((2 + 2) print)
Dog bark := method("woof!" print)
==> method("woof!" print)
add := method(a, b, a + b)
==> method(a, b, a + b)
add(5,7)
==> 12

Metódus létrehozása általánosan:

method(<arg name 0>, <arg name 1>, ..., <do message>)

Metódus hívásakor (üzenetküldéskor) létrejön egy lokális objektum a lokális tagok tárolására, mely objektum self és proto slotja is a címzett objektumra állítódik.

Blokkok

A blokkok is névtelen függvények, azonban hatáskörkezelésük statikus.

Blokkot létrehozni az Object block()-jával lehet.

b := block(a, a + b)
==> method(a, a + b)

Blokk létrehozása általánosan:

block(<arg name 0>, <arg name 1>, ..., <do message>)

Blokk hívásakor (üzenetküldéskor) létrejön egy lokális objektum a lokális tagok tárolására, mely objektum self és proto slotja is a blokkot létrehozó objektumra állítódik.

Öröklődés

Mivel nincsenek osztályok, nincs különbség egy gyerek és egy példány között. Példa egy "gyerekosztály" létrehozására:

Io> Dog := Object clone
Io> Dog Object_0x4a7c0: (
proto = Object 0x4a540
)

A fenti kód beállítja a Lobby "Dog" slotját, mint az Object objektum klónját. Megjegyzendő, hogy ez csak egy proto slotot tartalmaz. A Dog mostantól lényegében egy "alosztálya" az Object-nek. Példányváltozók és -metódusok öröklődnek a proto-tól. Ha egy slotot beállítunk, létrejön egy új slot a mi objektumunkban a proto megváltozása helyett:

Io> Dog color := "red" Io> Dog Object_0x4a7c0: (
proto = Object_0x4a540
color = String_0x54300 "red"
)

Többszörös öröklődés

Egy objektum delegálhat üzeneteket a "parent" slotján keresztül is. Amikor felelni kell egy üzenetre, a kereső mechanizmus először a proto-láncban keres, utána a "parent" slot hasonló láncán megy végig. Találat esetén továbbítja az üzenetet az objektumnak. Amíg a proto slotnak kötelező egy Object primítívre mutatnia, addig a parent slot mutathat bármelyik más típusú primitívre, például Number-re vagy String-re is.

Továbbítás

Ha egy objektum nem reagál egy üzenetre, meghívja a "forward" metódusát, amennyiben ilyen rendelkezésre áll. Az üzenet neve és argumentumai lekérdezhetőek a "thisMessage" slotbeli Message objektumtól.

MyObject forward := method(
write("sender = ", sender, "\n")
write("message name = ", thisMessage name, "\n")
args := thisMessage argsEvalutedIn(sender)
args foreach(i, v, write("arg", i, " = ", v, "\n") )
)

Super

Néha szükség lehet arra. hogy egy üzenetet közvetlenül a proto-nak küldjünk. Például:

Dog bark := method("woof!" print)

myDog := Dog clone myDog bark := method(

"ruf!" print
Dog getSlot("bark") performOn(self)
)