We will create two slots in there. The := means create a new slot. The = means update the value in that slot. Think of the space as the "dot operator".
Io> Dude := Object clone
==> Dude_0x8120168:
type = "Dude"
Io> Dude name := ""
==>
Io> Dude age := 0
==> 0
Io> Dude
==> Dude_0x8120168:
age = 0
name = ""
type = "Dude"
Looks good, we have a dude, ageless, nameless. Now, make a guy, say, tobbe.
Io> tobbe := Dude clone
==> Dude_0x80c4ca8:
Io> tobbe name = "Tobias W"
==> Tobias W
Io> tobbe age = 30
==> 30
Io> tobbe
==> Dude_0x80c4ca8:
age = 30
name = "Tobias W"
Hehe, I can not remember his age. Note that we use = to set existing slots.
Io> olle := Dude clone
==> Dude_0x80e5610:
Io> olle age = 31
==> 31
Io> olle age = 30
==> 30
Io> olle name = "Olle J"
==> Olle J
Io> olle
==> Dude_0x80e5610:
age = 30
name = "Olle J"
OK, more of the same. This is getting boring. Lets make it a bit easier to make new dudes. newSlot creates setters. The second argument is the default.
Io> Dude newSlot("name", "")
Io> Dude newSlot("age", 0)
0
Io> luisa := Dude clone setName("Luisa Carbonelli di L") setAge(33)
Dude_0x8108d60:
age = 33
name = "Luisa Carbonelli di L"
Io> quag := Dude clone setName("Jonathan Wright") setAge(25)
Dude_0x8149e38:
age = 25
name = "Jonathan Wright"
Now, let's create a List of these. list() is built-in.
Io> dudes := list(tobbe, olle, luisa, quag)
list(Dude_0x81b6678, Dude_0x81607f0, Dude_0x8108d60, Dude_0x8149e38)
List map() creates a new list based on the old one.
Io> dudes map(dude, dude name)
list("Tobias W", "Olle J", "Luisa Carbonelli di L", "Jonathan Wright")
Io> dudes map(dude, dude age asHex)
list("1e", "1e", "21", "19")
Io> dudes map(dude, dude name .. " (" .. dude age asHex .. ")")
list("Tobias W (1e)", "Olle J (1e)", "Luisa Carbonelli di L (21)", "Jonathan Wright (19)")
For simple cases like dudes map(dude, dude name) there is a short version:
Io> dudes map(name)
list("Tobias W", "Olle J", "Luisa Carbonelli di L", "Jonathan Wright")
Io> dudes map(age asHex)
list("1e", "1e", "21", "19")
Io> Dude description := method(name .. " (" .. age asHex .. ")")
method(
name .. " (" .. age asHex .. ")"
)
Io> dudes map(description)
list("Tobias W (1e)", "Olle J (1e)", "Luisa Carbonelli di L (21)", "Jonathan Wright (19)")
List foreach is like map, except a list isn't built up.
Io> dudes foreach(dude, writeln(" ", dude name))
Tobias W
Olle J
Luisa Carbonelli di L
Jonathan Wright
nil
List select is also handy, dig it:
Io> dudes select(dude, dude age < 32)
list(Dude_0x81b6678, Dude_0x81607f0, Dude_0x8149e38)
Io> dudes select(age < 32)
list(Dude_0x81b6678, Dude_0x81607f0, Dude_0x8149e38)
A bit hard to see which dude is which. Lets make it easier.
Io> Dude asSimpleString := method("Dude " .. name)
method(
"Dude " .. name
)
Io> dudes select(age < 31)
list(Dude Tobias W, Dude Olle J, Dude Jonathan Wright)
If all this code was put in a file, it would probably be written as:
Dude := Object clone do(
newSlot("name")
newSlot("age", 0)
description := method(
name .. " (" .. age asHex .. ")"
)
asSimpleString := method(
"Dude " .. name
)
)
tobbe := Dude clone setName("Tobias W") setAge(30)
olle := Dude clone setName("Olle J") setAge(30)
luisa := Dude clone setName("Luisa Carbonelli di L") setAge(33)
quag := Dude clone setName("Jonathan Wright") setAge(25)
dudes := list(tobbe, olle, luisa, quag)