Skip to content

Instantly share code, notes, and snippets.

@mohayonao
Created July 7, 2014 03:20
Show Gist options
  • Save mohayonao/9a4d5ada3b66eba28a3b to your computer and use it in GitHub Desktop.
Save mohayonao/9a4d5ada3b66eba28a3b to your computer and use it in GitHub Desktop.
SuperCollider リスト内包記法 まとめ

SuperCollider リスト内包記法 まとめ

{: 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 ]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment