パース結果を見る

メッセージオブジェクトを見るとパース結果がわかる

f := method(call message argAt(0))

上記の関数を使っていろいろ試した結果。

Io> f(x+y)
==> x +(y)
Io> f(x+y) name  //xを取り出す
==> x
Io> f(x+y) next
==> +(y)
Io> f(x+y) next name  //+を取り出す
==> +
Io> f(x+y) next argAt(0)  //yを取り出す
==> y

Io> f(x+y*z)         //ちゃんと優先順位がある
==> x +(y *(z))
Io> f(x*y+z)
==> x *(y) +(z)

Io> f(x:=y)           //メソッドに変換される例
==> setSlot("x", y)
Io> f(x=y)
==> updateSlot("x", y)
Io> f(x[y])
==> x squareBrackets(y)
Io> f(x{y})
==> x curlyBrackets(y)

Io> f(x:y)  //ひとつながりの名前と解釈
==> x:y
Io> f(x:y) name
==> x:y
Io> f(x:y) next
==> nil

Io> f(x :y)  //引数無しメソッドのチェインと解釈
==> x : y
Io> f(x :y) name
==> x
Io> f(x :y) next
==> : y
Io> f(x :y) next next
==> y

Io> f(x :(y))  //:を演算子(メソッド)として解釈
==> x :(y)
Io> f(x :(y)) next
==> :(y)
Io> f(x :(y)) next name
==> :
Io> f(x :(y)) next argAt(0)
==> y

Io> f(x:(y))  //x:という関数の呼び出しと解釈
==> x:(y)
Io> f(x:(y)) name
==> x:
Io> f(x:(y)) next
==> nil

Operator ::= { ":" | "." | "'" | "~" | "!" | "@" | "$" | "%" | "^" | "&" | "*" | "-" | "+" | "/" | "=" | "{" | "}" | "[" | "]" | "|" | "\" | "<" | ">" | "?" }

http://iolanguage.com/scm/git/checkout/Io/docs/IoGuide.html#Appendix-Grammar

演算子とは、単に英数字以外の文字による名前をもつメソッドである。例外として、":"(コロン), "_"(アンダースコア), '"'(ダブルクォート), "."(ドット) は演算子に使えず、また次のものは英数字による名前だが演算子とする: "and", "or", "return".

http://f21.aaa.livedoor.jp/~kizz/prog/io/_docs/IoProgrammingGuide_ja_only.html#Language