Io Day 1
Starting IO
To install IO language in a Debian machine you just need to type in your terminal
sudo apt-get install iolanguage
For those who like to build the last version from the official repository here is a good tutorial how to do it.
After you install the IO language you can type a kind of hello world just to start
Io> "Hola Muchachos" print
Hi ho, Io==> Hola Muchachos
Just by looking to the syntax you should figure some differences from much of other you're probably had already worked. This language is based on message passing, so in this simple example what you're really doing is sending the message Hola Muchachos to the object print
IO is a prototype based language, so you don't had the concept of class, instead you create object instances based on previous defined objects. Ultimately all the objects will inherit from object Object
Lets define a new Shotgun object and define some properties (or slots as they are called in IO)
Shotgun := Object clone
Shotgun ammo := 12
Shotgun model := "Remington"
If you type Shotgun in the interpreter you should see something like this
Io> Shotgun
==> Shotgun_0xe84e50:
ammo = 12
model = "Remington"
type = "Shotgun"
Day One Questions
- Evaluate 1 + 1 and then 1 + "one" . Is Io strongly typed or weakly typed? Support your answer with code
If you run the previous command on the Io interpreter you get the following result
Io> 1+"one"
Exception: argument 0 to method
'+' must be a Number, not a 'Sequence'
---------
message '+' in 'Command Line' on line 1
What this means is that the operator + is sensible to the type of the variables. It is explicitly expecting the value of "one" to be of type Number and not of type Sequence. For this reason we can argue that Io is a strong typed language
- Is 0 true or false? What about the empty string? Is nil true or false? Support your answer with code.
To answer this we can use the interpreter force a boolean comparison with the and boolean operator. So
Io> true and false
==> false
Io> true and 0
==> true
Io> true and nil
==> false
This means that 0 has the true boolean value and the nil has a false boolean value.
- How can you tell what slots a prototype supports?
To list all the slots you can do
Io> Shotgun slotNames
==> list(ammo, model, type)
- What is the difference between = (equals), := (colon equals), and ::= (colon colon equals)? When would you use each one?
Lets use the Shotgun example to see the diferences. Lets try to define a boolean slot called locked, lets first try the = operator and see what happens
Io> Shotgun locked = false
Exception: Slot locked not found.
Must define slot using := operator before updating.
---------
message 'updateSlot' in 'Command Line' on line 1
So as wee saw the = operator is an assignment one. = don't define slots, only set the value of slots previously defined with := or ::=
The difference between the last two is that the second also defines a setter method for the slot
Io> Shotgun locked ::=false
==> false
Io> Shotgun
==> Shotgun_0x1d2c620:
ammo = 12
locked = false
model = "Remington"
setLocked = method(...)
type = "Shotgun"
And to see the setter method working you can type
Io> Shotgun setLocked(true)
==> Shotgun_0x1d2c620:
ammo = 12
locked = true
model = "Remington"
setLocked = method(...)
type = "Shotgun"