JSON風オブジェクトリテラル
JavaScriptのように、{a : 1, b : 2}といった表記でオブジェクトを生成出来るようにする。
実行例
Io> doFile("json.io") Io> {a : 1, b : 1+1} ==> Object_0x4b8c48: a = 1 b = 2
コード本体
可変長引数を受け取る{}メソッドとして実装
{} := method( obj := Object clone call message arguments foreach(i, obj setSlot(i name,call sender doMessage(i next next))) obj)
おぼえがき
thisMessageだとうまく動かない。かわりにcall messaegを使う。
call message argumentsでは各要素は評価前の式の状態で得られる。
なので、コロンの前の部分はクォートせずにそのままスロット名として使える。
ioのパーサの仕様により、スロット名とコロンの間にはスペースが必要。
(そもそもコロンは演算子として使えないのに無理矢理使ってるのが悪いんだけど)
Lua風オブジェクトリテラル
コロンのかわりにイコールを使うバージョン。
イコールだったらちゃんと演算子として認められてるのでつめて書いてもちゃんと動く。
実行例
Io> doFile("lua.io") Io> {a=1,b=1+1} ==> Object_0x4b8c48: a = 1 b = 2
コード本体
すでにメッセージがupdateSlot("a",1)等になっているので、setSlotに変更してobj自身に実行させればいいだけ。
{} := method( obj := Object clone call message arguments foreach(i,obj doMessage(i setName("setSlot"))) obj)