Olle's Guide
 
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)