論証、セレクタの謎

Pdを普通に使っている時に特に意識しないとは思いますが、あらゆるPdのメッセージには基本的にセレクタが付けられています。

セレクタとはそのメッセージが「私はsymbol型の情報をもってますよ」「私はfloat型の情報をもってますよ」「私はlist型の情報をもってますよ」という内容物を書いたタグなようなものです。セレクタは常にsymbolで、メッセージの先頭にあり基本的には「bang」、「float」、「symbol」、「list」のいずれかです。ですが「set」や「open」などの特殊なセレクタを受け付けるオブジェクトもあります。

例えば、「float」オブジェクトは左インレットにbangが入力された時に保持してる数値を出し、数値(float)が入力された時は、保持してる値を上書きして、その値を出力します。このように入力されたメッセージによってオブジェクトが振る舞いを変えられるのは、メッセージの冒頭についているセレクタを判別しているからなのです。

しかし、このセレクタ殆どの場合、ユーザーの目に見えません。なぜなら、勝手に付けられているからです。例えば以下のナンバーボックスは、30を出力していますが、正確には「float 30」という「セレクタ・数値(float型)」2つの要素からなるメッセージを出力しています。しかし、それを例えば「print」に入れたとしても「float 30」とセレクタ付きで表示されるわけではなく、たんに「30」とPdコンソールに表示されます。

セレクタの自動付加
セレクタの自動付加

「print」の挙動の謎
ほんとにセレクタなんてものが存在するの?と疑問に思われるかもしれません。セレクタの存在が顕著にわかるのは、メッセージボックスに自分でセレクタを書いた時です。例えば、「abc 40」とメッセージボックスに書いてそのメッセージを「print」に送ると、Pdコンソールには「abc 40」と表示されますが、「float 40」と書くと、コンソールに「40」のみが表示されます。これは「print」オブジェクトが「float」をセレクタと解釈したからにほかなりません。また、「list 1 2 3 4」だと、「1 2 3 4」のみが表示されます。これは「list」がセレクタと解釈されているからです。

自分でセレクタを書く
自分でセレクタを書く

ただし、ここで混乱を招くのは、「symbol abc」を送った場合は、コンソールに「symbol abc」と表示されることです。つまり、symbolセレクタだけは無視せずに、Pdコンソールが表示するようです。しかし、表示されるメッセージの「symbol」がセレクタとして認識されていないかというと、そんなことはなく、それが次の例で実証できます。

「pack」の挙動の謎
例えば以下のように、「pack f s」を作り、1つのfloat要素と1つのsymbol要素からなるlistを動的に作る場合には、「abc」を右インレットに送るとエラーが出され、「expected ‘symbol’ but got ‘abc’」といわれます。しかし「symbol abc」を送ると文句は言われません。つまり、これは「symbol」をメッセージの最初に負荷することによって、それがセレクタであると「pack」に認識された事になります。またシンボルボックスに、symbolを送るときもセレクタを書かないと受け付けてもらえません。

packの挙動
packの挙動

「bang」はセレクタなのか
先ほどのfloatの例でもそうですが、「bang」はオブジェクトに特定の振る舞いを促します、オブジェクトは入力されたメッセージによってその振る舞いを変えるので、bangはセレクタであり、bangメッセージはセレクタのみのメッセージと言えるはずです。

「trigger」の「l」
さらに謎を呼ぶのが「trigger」オブジェクトです。Pdは複数の要素から成るメッセージの最初がfloat型であった場合、勝手にlistセレクタをつけますが、最初の要素がsymbolの場合はセレクタ「list」をつけないと「list」にならないようです。これが分かるのは、「t l」にfloatから始まる、複数の要素から成るメッセージを送った時は、エラーは出ませんが、そうでないときはエラーが出ます。

左はlist、右はlistではない
左はlist、右はlistではない

では、複数要素から成る、数値から始まらないメッセージはなんと呼称されるべきなのでしょうか。また、「abc 3」のセレクタはなんなのでしょうか?実はこの場合は「abc」がセレクタとなります。さらに、もし「abc」の前に「list」を明示的につけたらそのメッセージはlistとなります。

明示的リスト化
明示的リスト化

list trim
「list」オブジェクトの「trim」モードはこのようなlistのセレクタを明示的に除去します。「list」オブジェクトの「prepend」モードなどを使うと、明示的にlistセレクタが付加されてしまいます。ですが、例えば「tabplay~」は「set sample」で参照先のArrayを指定できますが、「list set sample」には反応しません。このため、「list」オブジェクトが明示的なlistセレクタをつけてしまった場合、「list trim」でセレクタをとり、「set」をセレクタとする事ができます。

深まるセレクタの謎
このように、セレクタはPdにおいて最も不可解な概念の1つです。
メッセージの内包物が何かを表す、タグ的なものであり、それによってオブジェクトの振る舞いが変わるのは理解できますが、絶対つけなければいけないものでもなく、可視化する方法がないため視認しずらく、何時いるのか何時要らないのかよくわからない、という問題を抱えています。

Pd開発者のミラーも、「list」のヘルプの片隅に「It’s not clear whether this was a good design choice, but it’s entrenched.」(このデザインが正しかったのかどうかわからないが、(ルールは)固定化されている)と書いている通り、この設計の正当性に彼もあまり確証はないようです。

セレクタ、Pdのメッセージングに関しては、記述がコンフリクトしている場合もありますし、筆者も確証が持てているわけではありません。上記の記述に何か問題がある場合、また、新たな情報がある場合はコメント欄よりお知らせください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください