コンマとセミコロン
また変に複雑化しました。セミコロンを式の省略可能なセパレータとすることで、&による括弧省略記法時に、どこまでを引数とする、というのを表現できるようにし、それならコンマも書きたければ書けるものにと、 コンマとセミコロンを、省略可能な、C系の言語におけるそれらのようなものとしました。
これまで(ver.0.6.20)の仕様も合わせてまとめておきます。
コンマ
//全て意味は同じ f(x y) //コンマ無し f(x, y) //新用法 f& x, y //従来用法(二項演算子引数追加)
スタイルとして、全ての引数にコンマを付けたくなるかもしれませんが、二項演算子的メソッドの後では従来用法になってしまうので注意が必要です。
f(x.+ 1 y) //== f(x.+(1) y) f(x.+ 1, y) //== f(x.+(1 y))
セミコロン
メソッド名の後に&か%を付けて引数の括弧を省略する際、どこまでを引数と扱うかの指定は結局括弧を使うしかありませんでした。しかし、この省略可能式セパレータにより、どこまでが式と表現できるようになりました。
//全て意味は同じ f(x y).flush f& x, (y).flush f& x, y;.flush //新用法 f% x, y.flush //全て意味は同じ f(x y.flush) f& x, y.flush f% x, (y.flush)
セミコロンの後にドットが続くのが気持ち悪いんですが、これで%や括弧は不要になりました。
従来用法のresolve2のためのセミコロンはリテラルです。
//意図的な分かりにくい例 y: 1 [f& x, ;y;.flush].resolve2.flush //[f(x 1).flush]
ついでに、参考になりそうな表です。
Cで言うとどう言うか
giraffe | C | 説明 |
---|---|---|
x | x | xがメソッドの場合はx() |
x$ | x | xがメソッドであっても |
x y | x; y; | 空白区切り |
x, y | x; y; | 省略可能コンマ |
x; y; | x; y; | 省略可能セミコロン |
f(x y) | f(x, y) | 空白区切り |
f(x, y) | f(x, y) | 省略可能コンマ |
f(x; y) | f(x, y) | 省略可能セミコロン |
x.y | x.y | 同じ |
x.+ y | x + y | 二項演算子風メソッドは次の式を引数化する |
x.+ y.* z | (x + y) * z | 演算子そのものでは無いので演算子の優先順位も無い |
x.+ (y.* z) | x + y * z | ただのメソッドコール、これと同じ: x.add(y.* z) |
f(x.+ y z) | f(x + y, z) | 空白区切り |
f(x.+ y, z) | f(x + (y z)) | コンマによる二項演算子引数追加 |
f(x.+ y; z) | f(x + y, z) | 無意味なセミコロン |
f(x.+ y;, z) | f(x + y, z) | セミコロンによる式の終端 |
Cで言うあれはどう言うか
C | giraffe | 説明 |
---|---|---|
if(x) y | x.? [y] | ifもただのメソッド |
if(x) y else if(z)... | x.? [y], [z]... | testとbodyを引数として続けていくだけ |
if(!x) y; | x.! [y] | !はunless |
!x | x.not | 前置演算子は無い |
~x | x.complement | 補数 |
switch(x){y: z;} | x.case(y [z]) | switchもあるが、caseの方が使いやすい |
シンタクスシュガー
略記 | 省略なし | 説明 |
---|---|---|
x& y z | x(y) z | &の後置による括弧省略 |
x& y& z | x(y(z)) | 入れ子可能 |
x& y.z | x(y.z) | 引数のドットも食う |
x% y.z | x(y).z | %は食わない |
x& y, z | x(y z) | コンマで引数追加 |
x& y;.z | x(y).z | セミコロンで式終了 |
x: y | def(:x y) | コロンの後置はdef |
x.y: z | x.def(:y z) | ドット後でも同じ |
x@ y | set(:x y) | @はset |
x$ | get(:x) | $はget |
x* | call_safe(:x) | *はcall_safe |
{x y z} | Array.new(x y z) | 配列 |
{x: y} | [x: y].to_Object | オブジェクトリテラル |