メッセージ カスケーディング

PowerMops 5.6から、メッセージのカスケーディングが可能になりました。

"カスケード(Cascade)"の原義は"滝"(すとーんと落ちるやつじゃなくて、段々がある)で、縺れ合いつつなだれ込むような、という感じですかね。ここでいうカスケーディング機能は、ようするに、一つのオブジェクトに立て続けに複数のメッセージを送るときに、いちいち毎回オブジェクト名を書くのを省略できる機構ということです。構文は、次のようになります。
Rect myRectangle
10 250 100 450 put: myRectangle  draw: | 5 5 inset: | invert: | 3 3 inset: | clear: |

つまり、二回目からはオブジェクト名を省略して、縦棒"|"で区切っていくわけです。実装から見れば、オブジェクト名の代わりに"|"にメッセージ送ると考えた方が適切かもしれません。その際には、"|"はオブジェクトの代名詞になる、と。ただし、厳密な意味では"|"を書くことがオブジェクト名を書くことの代わりになるわけではありません。上の例では、コンパイルされるコードとしては、全てのメッセージは、もちろん、初めの"myRectangle"に送られるわけです。上のコードを、PowerMops 5.6で上のコードをセレクトしてenterした結果は次のようになると思います。

ちなみに、下方に描画されている長方形区画が上のコードの実行結果ですが、これは、一回描いたっきりなので、上に別のウィンドウを被せたりすると、その部分は消えてしまいます。

カスケーディング利用の条件としては、オブジェクトに名前がなければいけないこと(ヒープ上の無名オブジェクトなら、ObjPtr等に格納する必要がある)、初めにそのオブジェクトに静的束縛の標準的な形でメッセージを送っておかなければならないということ、があげられます。最初が動的束縛の形式だったり、オブジェクトをパラメターとして渡す形式のバインドだったりすると、予想外の結果が生ずることもあり、最悪の場合実行時にクラッシュします。さらに、カスケードで送られる複数のメッセージはすべて、"メッセージ | "という形式になっていなければなりません。

カスケーディングは、解釈モードでも、実行モードでも利用できます。ワードやメソッドの定義の中にも書き込めるということです。ちなみに、メソッド定義の中では、"SELF"に対するカスケーディングも可能です。

注意点としては、カスケーディングは一種の略記法であって、主として"書く人"のために存在しています。濫用はコードの可読性を落とすといわれています。もちろん、適切に使えば、むしろ可読性をあげることもあるでしょう。

ちなみに、"|"は両脇に区切り文字(空白、タブ、改行)が必要ですが、定義された内容を持つという意味でのワードではなく、それ単独では意味を持ちません。

iMopsでは、描画方式が変わったため、上のように手軽に長方形をコンソール上に描画することができません。カスケーディングの例として、文字列オブジェクトの印字を試してみましょう。|の使い方は同じです。
string str1
" This is a sample code " put: str1 " of cascading." add: | reset: | print: |


関連項目:






最終更新:2020年01月09日 23:24