Io squareBrackets ちんこ演算子その他の雑多メモ
[1, 2, 3] は squareBrackets(1, 2, 3) と同じっぽいのだけど、デフォルトだと何にも割りあてられてない。
Io> squareBrackets := getSlot("list")
==> # io/A2_Object.io:401
method(
call message argsEvaluatedIn(call sender)
)
Io> [1, 2, 3]
==> list(1, 2, 3)Io> list(1, 2, 3)[0]
Exception: List does not respond to 'squareBrackets'
---------
List squareBrackets Command Line 1
Io> List squareBrackets := List getSlot("at")
==> List_at()
Io> list(1, 2, 3)[0]
==> 1
Io> [1, 2, 3][1]
==> 2Io ではいろいろメッセージセンドになってる (てきと)。:= は setSlot の言いかえである。すなわち
Io> setSlot = method( "This is penis operator.\n" print )
==> method(
"This is penis operator.\n" print
)
Io> seme := uke
This is penis operator.
==> This is penis operator.
Io> seme
Exception: Object does not respond to 'seme'
---------
Object seme Command Line 1ということができる。もちろん上書きしているので変数への代入 (に見えるスロットへのセット) は行なわれない。ついでに uke も評価されないため、エラーが発生しない。仮引数を書かなければ暗黙的な評価はされない。
評価されるケース (仮引数を書いた場合)
Io> setSlot = method(a, b, "This is penis operator. Uke: #{b}\n" interpolate print )
==> method(a, b,
"This is penis operator. Uke: #{b}\n" interpolate print
)
Io> seme := "aaa"
This is penis operator. Uke: aaa
==> This is penis operator. Uke: aaa
Io> seme := uke
Exception: Object does not respond to 'uke'
---------
Object uke Command Line 1
Object setSlot Command Line 1あるいは call evalArgAt(n) で明示的に評価できる。( call sender doMessage(call message argAt(1)) の簡易版 )
Io> setSlot = method(uke := call evalArgAt(1); "This is penis operator. Uke: #{uke}\n" interpolate print )
==> method(
uke := call evalArgAt(1); "This is penis operator. Uke: #{uke}\n" interpolate print
)
Io> seme := uke
Exception: Object does not respond to 'uke'
---------
Object uke Command Line 1
Object setSlot Command Line 1
Io> seme := "uke"
This is penis operator. Uke: uke
==> This is penis operator. Uke: ukeinterpolate というメソッドがでてきたけど、これは #{name} をローカル変数で置換するメソッド (式は書けないっぽい)。
ブロックあるいはメソッドは、そのコンテキストに入るときにオブジェクトが一つ割りあてられる。これは JS でいうところの Activation Object (Io でも変数オブジェクトとして使われる) で、やはり直接それをとりだすことはできない?
Io> block( slotNames ) call
==> list("updateSlot", "call", "self")とやると、上の call evalArgAt(1) で出てきた Call オブジェクトが入った call スロットがあることがわかる。
ちんこ演算子が使える言語なのでおもしろいですね。