io language assignment code

今日は気分転換に io の話題でも
io-lang には3種類くらいの assignment statement(というか expressionかな)があるんだけど、
どれも使い方がよくわからん、と最初につまづくことかと思います。

代入式としては、以下の3つです

1
2
3
hoge := "set value"
hoge = "update value"
hoge ::= "new value"

と、これらはそれぞれ、以下のように動作します

1
2
3
4
5
6
Lobby setSlot("hoge", "set slot")
hoge println // => "set slot"
Lobby updateSlot("hoge", "update value")
hoge println // => "update value"
Lobby newSlot("hoge", "new value")
hoge println // => "new value"

んで、::= である、newSlot は setter を生成してくれるメソッドになります。

1
2
3
hoge := Object clone
hoge foo ::= 123
hoge setFoo(456)

こんな感じ。
今回は、この ::= の動作まわりではなく、:== についての話題です。
まずは、下記のコードをみてください

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
x := 10

hoge := method(
  x = 123
  ("hoge x is " .. x) println
)
foo := method(
  x := 456
  ("foo x is " .. x) println
)

hoge
("1) x is " .. x) println

foo
("2) x is " .. x) println

これの結果はどうなるでしょうか。
すべての x の出力は hoge メソッドで設定された 123 になるでしょうか。
それともスコープ上 一番上にある 10 のままになるでしょうか。

結果はこんな感じになります

1
2
3
4
hoge x is 123
1) x is 123
foo x is 456
2) x is 123

なんと、hoge メソッドで上書きした(updateSlot)値は foo メソッドで上書きされていない(setSlot)のです
少し不思議な動きな感じもします。

ただ、これも javascript で考えると案外フツーなことだったりします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var x = 10;

var hoge = function (){
  x = 123;
  console.log("hoge x is " + x);
};
var foo = function (){
  var x = 456;
  console.log("foo x is " + x);
};

hoge();
console.log("1) x is " + x);

foo();
console.log("2) x is " + x);

このjsのコードもioの結果と同じになります。

なんとなく、ioでもレキシカルスコープみたいのがあるんだなーと思うと夢が広がりングですね。 ちなみに、この話題は最近投稿された↓のトピックから参照してます。
iolanguage : Message: Re: [Io] Assignment Operators

その内、どこかで block と interpolate などについても話題にしたいところ。