演算子と演算子化記号

二項演算子(バイナリオペレータ)の概念を、「引数をひとつ取るメソッド」とし、引数のための括弧を省略できるようになっています。


0.+ 1 //0.+(1)
`0[0].|`n[n.+ recur(n.- 1)] //`0[0].|(`n[n.+(recur(n.-(1))])
演算子の戻り値のメソッドを呼ばなければいけない場面は多くあります。演算子の戻り値に演算子を適用する場面もそのひとつです。そのため、スロット操作の引数とは違った式の消化の仕方をします。

0.+ 1.+ 2 //0.+(1).+(2) //0.+(1.+(2))ではない。
当然、演算子の優先順位(プライオリティ)の概念はありません。

1.+ 2.* 3 //9になる。7ではなく。
括弧が省略できるだけ、と考えることが肝要です。
メソッドが引数をひとつだけ取ると解かりきっている場合、括弧を書くのが面倒です。そこで、メソッドの最後に'%'をつけると演算子と同じように次の式を引数として扱うということが可能です。

s: 'abcdefg'.copy
s.each% `ch[
ch.++
]
s.flush //bcdefghが出力
演算子が消費するのはメッセージを含まない式です。eachとメソッドのOR演算子を使う場合にこれが問題になります。

s.each% `ch.% 2[ //奇数にのみ++を実行
ch.++
].|`*[] //これはeachの戻り値に対してのOR
':'によるdefや'@'のsetと同じように、メッセージも含む式を消費したい場合は、'&'を後置します。

s: 'abcdefg'.copy
s.each& `ch.% 2[ //奇数にのみ++を実行
ch.++
].|`*[]
s.flush //bbddffhが出力