ObjectSquare [1999 年 1 月号]

[Happy Squeaking!!]


3.Squeak 演習:オブジェクトにメッセージを送る

3.1 連続的なメッセージ送信


次にオブジェクトの連鎖反応的な気分を味わうために連続してメッセージを送ってみましょう。

"文字の配列の最後のアスキーコードを聞き、符号を反転する"
#( $a $b $c ) last asciiValue negated.

これはどう解釈すればいいのでしょうか?
オブジェクトに対するメッセージ送信が前から順番に行われていくことに注意してください。

まず #($a $b $c)という配列オブジェクトがあり、それに対して last メッセージが飛びます。これの反応として返ってくるのは $c オブジェクトです。
次に$c オブジェクトに対し、 ascillValue メッセージが送られます。これの反応は 99という数字オブジェクトになり、返ってきます。
さらに、99オブジェクトに対して negated メッセージが送られます。この反応は -99オブジェクトとして返ることになります。

疑似コード風に書くと以下のようになります。
#($a $b $c) last => $c
$c asciiValue => 99
99 negated => -99

SmallTip: メッセージの反応結果のオブジェクトに対して続けてメッセージを送ることができる。

反応結果として返ってくるオブジェクトを変数に代入することもできます。このようにわけて書くと、処理の流れがわかりやすいかもしれません。以下を実行してみることにします。
(これだけ長いとうち間違いをおこしがちです。コピー&ペーストで対処してください)

| arr lastElem ascValue answer |
arr := #($a $b $c).
lastElem := arr last.
ascValue := lastElem asciiValue.
answer := ascValue negated.
^answer.

今度は一文でなくすべてを選択して"print it "します。

文法的に新しい要素が幾つかでているので順番に解説します。

まず||でこれから使う変数を宣言しています。ワークスペース上で変数を使う場合は必ずこの形での変数宣言が必要になります。これは実行とともに一時的に宣言され、代入され、使われた後は消えてしまうので、一時変数と呼ばれています。

次が代入です。代入は := (コロンとイコール)で表現します。Squeakの場合は ←も使用できます(アンダースコアで入力)。←はSmalltalk-80で使われていた歴史的ななごりです。ANSIのSmalltalkに従い、本講座では、一貫して:=を使用していきます。コロンとイコールの間にスペースを空けたりしないように続けて書くようにしてください。一方コロン前とイコール後はみやすさのため通常スペースを空けます。

後はメッセージの送信結果を順番に変数に代入し、実行しているだけです。

最後の^(キャレット) は、実行結果としてのオブジェクトをメッセージの送り手側に返すために使います。手続き型言語(Cなど)でのreturnに該当します。Squeakの場合は上矢印(↑)で表示されますが同じ意味を表しています。

上の例の場合ではanswerに代入されたオブジェクトを最終結果として送り側に返したいので^answerと書いています。例えば別の値を返すのであればここは、例えば^lastElemなどとします。(その場合answer変数を代入にしか使っていないために警告がでますが、そのまま実行できます)

SmallTip: 一時変数は || で囲む。
SmallTip: 変数の代入は := で行う。
SmallTip: 明示的にあるオブジェクトを返却させるには^記号を使う。
なお、Smalltalkでの代入は、全て参照によるものです。代入によってオブジェクトのコピーが変数の内部にできるわけではありません。その意味では、単にオブジェクトに := によって一時的な名前をつけていると考えることもできます。

© 1999-2001 OGIS-RI Co., Ltd.

Prev.

Index

Next