メッセージ
SenseTalkは、あるオブジェクトから別のオブジェクトに_メッセージ_を送信することで動作するオブジェクト指向言語です。メッセージがオブジェクトに送信されると、そのスクリプトにそのメッセージの_ハンドラ_がある場合、応答することができます。特定のメッセージのハンドラを持っていないオブジェクトは、そのメッセージを他のオブジェクトに引き渡します。ハンドラの使用方法の詳細は、ハンドラをご覧ください。
オブジェクトが_何かを行う_のは、_メッセージ_を受け取った時だけです。オブジェクトは自己にメッセージを送信することも、他のオブジェクトやスクリプトが存在する環境から送信されることもあります。例えば、スクリプトがコマンドラインから呼び出されると、スクリプトの名前に基づいたメッセージが送信され、スクリプトが実行されます。
最初に知っておくべきことは、メッセージがオブジェクトに送信された時、それを受け取って処理することも無視することもできる、ということです。メッセージとその送信方法については、引き続きお読みください。
メッセージの送信
スクリプトが実行されているとき、コマンドを実行するたびにメッセージが送信されます。メッセージは常に単語であり、最も単純なメッセージ送信文は単語一つのコマンドで、送信されるメッセージの名前です。例えば、このスクリプトの2行目は、"greetTheUser"というメッセージを送信します。
put "Hello, World!"
greetTheUser
put farewellMessage()
このスクリプトでは、1行目と3行目のput
コマンドもメッセージを送信します。実際、SenseTalkの基本的な制御構造を除いて、スクリプトのほぼすべてのコマンドがメッセージを送信します。上記の“farewellMessage()”関数への呼び出しのような関数呼び出しも、メッセ出しもメッセージを送信します。
コマンドメッセージと関数メッセージ
SenseTalkは実際には2種類のメッセージを送信します。コマンドメッセージはコマンドによって送信され、上述の例のgreetTheUser
のようなものです。関数メッセージは関数呼び出しによって送信され、上述の例のfarewellMessage()
のようなものです。2つのメッセージタイプは、それらを受け取るハンドラのタイプを除いて同一です(ハンドラを参照)。関数の呼び出し方についての詳細は、関数を参照してください。コマンドの使用方法についての詳細は、コマンドとコメントを参照してください。
メッセージはどこに送信されるのか?
私たちは先ほど、メッセージはオブジェクトがお互いに通信するために使われると述べましたので、上記の"greetTheUser"と"put"メッセージはどこに送信されるのか、どのオブジェクトがこれらのメッセージを受け取るのか、疑問に思うかもしれません。答えは非常にシンプルで、多 少驚くかもしれませんが、これらのコマンドを含むオブジェクトはこれらのメッセージを自身に送信します!
初めてみると、オブジェクトが自身にメッセージを送信することはあまり役に立たないように思えるかもしれませんが、実際にはオブジェクトが処理しない任意のメッセージは、他のオブジェクトが可能性として処理したり、最終的にはSenseTalkの組み込みコマンドや関数のいずれかが処理したりします。
必要に応じて、メッセージを他の特定のオブジェクトに直接送信することもできます。これは、tell
コマンド、send
コマンド、run
コマンド、run
関数、角括弧メッセージ構文 を使用したり、of
、.
または 's
を以下のように使用することで実現します:
put the salary of writer into authorPay -- "salary" を writer に送信する
get investor's balance("Checking") -- "balance" を investor に送信する
add paycheck.netIncome() to it -- "netIncome" メッセージを paycheck に送信する
メッセージパス
メッセージがオブジェクトに送信されると、そのメッセージはいくつかの異なるオブジェクトを通るパスを辿ります。メッセージが辿るパス上の各オブジェクトは、そのメッセージを処理するチャンスが与えられます。オブジェクトにそのメッセージのハンドラがある場合、そのハンドラの指示が実行されます。それ以外の場合、メッセージは、メッセージを処理するものが見つかるまで、順番にパス上の他のすべてのオブジェクトに提供されます。
通常、メッセージがオブジェクトによって処理されると、それで終わりです。しかし、場合によっては、オブジェクトのハンドラがメッセージをパスに沿って送り続けることを選択することがあり、他のオブジェクトが同じメッセージを処理する機会を得ることがあります(メッセージのパスの pass
コマンドを参照)。
バックスクリプトとフロントスクリプト
全体像を見てみると、メッセージが送信されるオブジェクト(ターゲットオブジェクトと呼ばれる)に加えて、メッセージパスはターゲットオブジェクトとそのヘルパーの前後に他のオブジェクトも含むことがあります。これらのインクルードは、the FrontScripts
と the BackScripts
のオブジェクトと、ホストアプリケケーションが追加する可能性のある他のオブジェクトで構成されています。
The BackScripts
は、ターゲットオブジェクトがメッセージを処理しなかった場合に、メッセージを処理する機会を得るオブジェクトのリストを含むグローバルプロパティです。したがって、オブジェクト(ライブラリやスクリプト)を the BackScripts
に挿入することで、そのオブジェクトのハンドラが任意のスクリプトで利用可能になり、それでも任意の個別のスクリプトが the BackScripts
の振る舞いをオーバーライドするための自分自身のハンドラを提供することを許します。 The BackScripts
は非常に便利なメカニズムであるため、Start Using
とStop Using
の二つの特別なコマンドが、the BackScripts
にオブジェクトを追加したり削除したりするのを簡単にするために提供されています。
The FrontScripts