blog.monophile.net

Takaaki Yamamoto

東京工業大学において計算機科学と応用数学を学び、 情報科学芸術大学院大学[IAMAS]においてメディア表現を専攻し修了。 digitiminimi Inc. において、インフラエンジニアとして生計をたててている。

各種環境の構築と管理を承ります。

  • 仮想環境: Openstack, GCP, AWS, Azure, ...
  • アプリケーション: WordPress, GitLab, Redmine, ...

List

SuperColliderでリスト内包表記

いきさつ

個人的にリスト内包表記が大好きです。 なんと言っても、ワンライナーでの情報量の多さと見やすさですかね。 SuperColliderでも表記できるようなので、やってみました。 どうやらSuperColliderの場合はジェネレータからリストを作るような構造になっているみたいです。

ジェネレータ

2乗が50を超えない偶数を列挙してみます。

(
  z = {: x, x <- (1..), :while x**2 < 500, x.even, ::x.postln };
  z.next;
  z.next;
  z.next;
  z.next;
)

上記のコードを実行すると以下のように出力されると思います。

2
4
6
nil

{: ... } の部分がジェネレータ(実際のクラスはRoutine)を表しています。 :whileと::<副作用的な式>はオプションで使用することができます。

リスト

上記のリスト版です。

(
  z = all {: x, x <- (1..), :while x**2 < 500, x.even, ::x.postln };
  z.postln;
)

上記のコードを実行すると以下のように出力されると思います。

[2, 4, 6]

ジェネレータの前にallという文字列を置くことによってジェネレータから生成される数列をまとめてくれるのですね。

reference