{: a, a <- [ 1, 2, 3 ] }
のような書き方で Routine が生成できる.
リスト内包記法は r {}
の式にコンパイルされるので、その生成コードを調べて理解を深める.
// 基本の形, 最初の式が yield される. <- は do と解釈される
a = {: a, a <- [ 1, 2, 3 ] };
// a = r { [ 1, 2, 3 ].do { |a| a.yield } }
a.all; // [ 1, 2, 3 ]
a = {: a , a <- 3 };
// a = r { 3.do { |a| a.yield } }
a.all; // [ 0, 1, 2 ]
// <- の左辺は 2つ の引数をとることができる
a = {: [ a, b ], a b <- 3 };
// a = r { 3.do { |a, b| [ a, b ].yield } }
a.all; // [ [ 0, 0 ], [ 1, 1 ], [ 2, 2 ] ]
// カンマで区切ると入れ子になる
a = {: [ a, b ], a <- 3, b <- 2 };
// a = r { 3.do { |a| 2.do { |b| [ a, b ].yield } } }
a.all; // [ [ 0, 0 ], [ 0, 1 ], [ 1, 0 ], [ 1, 1 ], [ 2, 0 ], [ 2, 1 ] ]
// var の 値は即時関数の引数みたいな扱い
a = {: a, var b = 3, a <- b };
// a = r { { |b| b.do { |a| a.yield } }.value(3) }
a.all; // [ 0, 1, 2 ]
a = {: a, var b = 3, a <- b, var c = 4 };
// a = r { { |b| b.do { |a| { |c| a.yield }.value(4) } }.value(3) }
a.all; // [ 0, 1, 2 ]
// 式 はフィルターとして使う. 戻り値は Boolean( respondsTo(\if) ) を期待
a = {: a, a <- 7, a.odd }
// a = r { 7.do { |a| (a.odd).if { a.yield } } }
a.all; // [ 1, 3, 5 ]
// ::式 の場合、通常の式として扱われる.
a = {: a, a <- 3, ::a.postln }
// a = r { 3.do { |a| a.postln; a.yield } }
a.all; // [ 0, 1, 2 ]
// :while は打ち切り条件. 戻り値は Boolean( respondsTo(\if) ) を期待
a = {: a, a <- 10, :while a < 3 }
// a = r { 10.do { |a| a.postln; (a < 3).if { a.yield } { nil.alwaysYield } } }
a.all; // [ 0, 1, 2 ]
// セミコロンにすると Routine にならない (用途不明)
a = {; a, a <- [ 1, 2, 3 ], a.odd };
// a = [ 1, 2, 3 ].do { |a| a.odd }
// [ 1, 2, 3 ]