SuperCollider メモ : 文字列的なリテラル
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