第26回
■
■SqueakではじめるSmalltalk入門 第26回
■
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。前回に引き続き、リテラル式、あるいはそれに準じる表現により生成できる定番のオブジェクトたちをとりあげ、簡単な解説を加えてゆきましょう。
▼真偽値、未定義値
true、false、nilは他のリテラルとはちょっと違った扱いになっています。その実体は同名の擬変数に束縛されたTrue、False、UndefinedObject(“Nil”ではないのでお間違えなく!)の唯一のインスタンス…です。擬変数というのは、参照はできても代入(束縛のやりなおし)のできない特殊な変数のことをいいます。リテラルと同様に、true、false、nilと書いて直接表現できますが、それ自体は変数(ある種グローバル変数的なもの)なので、配列のリテラル式の要素になれないなどの制約もあります。たとえば、リテラルだと思って、それらを要素にとる配列を作るつもりで次のように記述してしまうと…
#(true false nil) "=> #(#true #false #nil) "
このようにtrue、false、nilは、それぞれ「#」を省略したシンボルリテラルだと解釈されてしまいます。こうした事態を避けるためには、配列のリテラル式ではなく、前回紹介したカーリーブレイス表現を用います。カーリーブレイスでは要素はスペースではなく、ピリオドで区切ります。
{true. false. nil} "=> #(true false nil) "
なお、この出力結果からもお分かりいただけるように、Smalltalkシステムが返すオブジェクトの文字列表現において、リテラル式(あるいはメッセージ式)を模したものの中には、式として評価は可能でも(つまりSmalltalk言語として文法的に誤りがなくとも)同じオブジェクトを返すことができないものも含まれます。注意してください。
▼分数
よく使うわけではないのですが、あることが分かっていると便利、あるいは逆に、思わぬ所に登場して悪さをするオブジェクトに、分数(a Fraction)というものがあります。これはリテラル式ではないのですが「n / m」という直感的で簡潔なメッセージ式で作ることができます。
3 / 4 "=> (3/4) "
2 / 4 "=> (1/2) "
(3 / 4) + (5 / 6) "=> (19/12) "
電卓のような結果を得たければ、レシーバかパラメータのどちらかに「.0」を付して、浮動小数点少数(a Float)リテラルとして記述しなければいけません。
3.0 / 4 "=> 0.75 "
3 / 4.0 "=> 0.75 "
または、レシーバかパラメータ、もしくは、結果を明示的に浮動小数点少数に変換する(より正確には、変換したオブジェクトを返す)メッセージ「asFloat」を送信します。
3 asFloat / 4 "=> 0.75 "
3 / 4 asFloat "=> 0.75 "
(3 / 4) asFloat "=> 0.75 "
C言語の二項演算子のように使いたければ、結果に対し改めて「truncated」などの“まるめ処理”のためメッセージを送信する必要があります。
(3 / 4) truncated "=> 0 " "整数部を抽出 "
(13 / 4) truncated "=> 3 "
(-3 / 4) truncated "=> 0 "
(-3 / 4) floor "=> -1 " "マイナス側にまるめる"
(3 / 4) ceiling "=> 1 " "プラス側にまるめる "
こうした“まるめ処理”のためのメソッドは、Numberのサブクラス群の「truncation and round off」プロトコルにまとめられているので興味があったらブラウザで覗いてみてください。
▼ポイント
座標やベクトルを表わすポイント(a Point)も、リテラルではありませんが、それに準ずる簡単なメッセージ式で表わすことができるオブジェクトです。ある数値に対し、パラメータとして別の数値を添えた「@ aNumber」というメッセージを送ることで生成できます。
3 @ 4 "=> 3@4 "
(3 @ 4) + (5 @ 6) "=> 8@10 "
きちんとした二次元座標、あるいは、二次元ベクトルを模したオブジェクトというわけではないので、こんな計算もできてしまったりもします。
(3 @ 4) * (5 @ 6) "=> 15@24 "
#(3 4) * #(5 6) "=> #(15 24) "
このように特に演算に関してポイントは、座標やベクトルというよりは、要素が二つの配列とよく似た振る舞いをすることが多いようです。
リテラル表現とはちょっと趣を異にしますが、ポイントはクラス「Point」にメッセージ「fromUser」を送信することで、続く画面のクリック操作でインスタンスを得ることも可能です。
Point fromUser "=> (クリック位置の座標)"
なお、この「fromUser」というメッセージは、Point以外にもRectangle(矩形範囲)、Form(ビットマップ画像)、Color(色情報)、StrikeFont(テキストのフォント情報)についても同様に使用できます。たとえば、
Form fromUser asMorph openInHand
などとすることで、選択して指定した画面の一部を基本図形オブジェクトとして簡単に取り出せます。
このページを編集 (4219 bytes)
|
以下の 1 ページから参照されています。 |
This page has been visited 987 times.