音の鳴るブログ

鳴らないこともある

SuperCollider メモ : 文字列的なリテラル

f:id:mohayonao:20140519104436j:plain

SuperColliderの文字列的なリテラルについて紹介します。とくに読むべきところはない。

文字リテラル

C とかと同じ感じで SuperCollider の文字列は Char の配列です。文字リテラルの記法は以下のとおり。あんまり意識することはないと思う。

$a // Char の a
$  // Char の 空白
$. // Char の .
$//// Char の /
$char // シンタックスエラー ($c har と解釈される)

文字列リテラル

文字列リテラルはダブルクォートで囲む。JavaScript なんかと異なる点は改行を \n みたいにエスケープしなくても良い。ダブルクォートはさすがにエスケープする必要がある。

"string" // String の string

"string\nwith newline" // String の string\nnewline

"string
with newline" // これでも良い

"\""          // String の "

String[$a, $b, $c] // リテラルじゃないけどこういう風に作ることもできる

先述のとおり SuperCollider の文字列は Char の配列(String < RawArray < ArrayedCollection < SequenceableCollection < Collection < Object)なので、列挙したクラスのインスタンスメソッドが全部使えて便利な反面、比較演算子なんかは一文字ずつ走査する必要があるので効率よくない。

"abcdefg"[0]       // Char の a が返ってくる
"abcdefg".scramble // ランダムに並び替える
"abcdefg".reverse  // 反転

文字列リテラルはそのたびに新しいインスタンスを生成するので、リテラル同士を === で比較すると false になる。

"abc" === "abc" // false (異なるインスタンス)
"abc" ==  "abc" // true

また、リテラルで作った文字列は immutable なので破壊的な操作はできない。破壊的な操作をしたい場合は copy するなりして immutable でない文字列を作る必要がある。

"SuperCollider".sort      // エラー
"SuperCollider".copy.sort // CSdeeilloprru

他のオブジェクトから文字列に変換するには asString メソッドを使う。

100.asString // String の 100

シンボルリテラル

文字列より簡素に使えるやつ。記法は2種類あって、バックスラッシュで始まるものは、英字で始まって英字が続く/^\\[a-zA-Z_]\d*$/ のと、数字だけで構成される /^\\\d+$/ のと、空 /^\\$/ のものが書ける。シングルクォートで囲むと特に制限なく書ける。文字列が文字の配列であったのに対して、シンボルはシンボルでしかなくて文字列のように複雑なメソッドが使えないけど、SynthDef の名前とか単に識別のために使う場合に効率が良い。

\symbol99  // Symbol の symbol99
\012345    // Symbol の 012345
'99symbol' // Symbol の 99symbol (\99symbol だとエラー)

文字列と違ってシンボルはユニークなので、リテラル同士を === で比較できる。

'abc' === 'abc' // true (同一のインスタンス)
'abc' ==  "abc" // false (シンボルと文字列は比較できない)

他のオブジェクトからシンボルに変換するには asSymbol メソッドを使えるけどあまり使わないと思う。

100.asSymbol // Symbol の 100