February 27, 2005

自由自在 Squeak プログラミング:第4章 オブジェクト指向に慣れる

Squeak Logo
<ファイルイン>:「ファイルリスト」からサンプルコード(拡張子:st)の読み込みができる。「ファイルリスト」の表示はワールドメニューから「open... → file list」を選択する。中段左のディレクトリエリアでディレクトリ名の左側の「▼」をクリックして内容を展開できる。(ディレクトリの表示エリアから、例えば「▼SqueakNihongoDev-Mac▼SampleCodes▼04」を選択し、「ファイル名.st」を選択し、上段右中央付近の[filein]ボタンをクリックすると、読み込み状況のプログレスバーが表示され、完了すると消えます。)
※:iMac(G3/450MHz)では、初めてファイル/ディレクトリを表示した場合に多少時間が掛かりました。一度表示すると次からはクリック後すぐに下部にファイルの内容が表示されました。

<抽象クラス>:インスタンスを生成しない(する必要の無い)クラス。クラス階層を整理する事ができ、アプリケーションの構造を分かり易くできる。

<具象クラス>:抽象クラスとは逆に、インスタンスを実際に生成するクラス。抽象クラスを継承する事で、コードの量を減らす事ができる。

<クラスメソッド>:ブラウザの[class]ボタンをクリックして定義する。クラスからインスタンスを生成する場合に、初期化しておきたいインスタンス変数が有る場合等にクラスメソッドが便利に使える。

<クラスインスタンス変数>:ブラウザの[class]ボタンをクリックして、コードペインに「instanceVariableNames: 'クラスインスタンス変数名 '」と定義する。「クラスインスタンス変数」にアクセスできるのは、「クラスメソッド」のみ。(クラスのローカル変数?)

<クラス変数>:クラス、インスタンスの両方から、参照/書き込み可能な一種の共有変数。クラス変数名は大文字で始める。ブラウザの[instance]ボタンをクリックして、コードペインに「classVariableNames: 'クラス変数名 '」と定義する。
「クラス変数」のスコープ(有効範囲)は、クラス変数が定義されたクラスとそのインスタンス、クラス変数が定義されたクラスを継承したサブクラスとそのインスタンスになり、かなり広い範囲に及ぶ(同じ系統のクラスで共有できる)。

<プール辞書>:クラス、インスタンスの別に関係なく、使用する事を宣言すれば使えてしまう、キーと値のペアで保存された辞書。プール辞書名は大文字で始める。ブラウザの[instance]ボタンをクリックして、コードペインに「poolDictionaries: 'プール辞書名 '」と定義する。
どこか1カ所に定数として登録しておき、他のオブジェクトはプール辞書を参照するだけにする。どこからでも参照だけでなく、書き込みも可能で、あまりにもスコープが広いので、バグの元になり易い。

<initializeメソッド>:Squeak 3.7から導入された機能。
・インスタンスメソッド(メッセージ)で【initialize】メソッドを定義すれば、【new】メッセージでインスタンスが生成された直後に自動的に呼ばれる。(「クラス名 new.」で【initialize】が呼ばれるので、「クラス名 new init.」とする必要がなくなる。または、【new】をオーバーライドして【init】を呼ぶ必要がない。)
・クラスメソッドに【initialize】メソッドを定義した時は、ファイルインした時に自動的に呼ばれる。(ファイルインしなかった場合は「クラス名 initialize.」と明示的に"do it"する必要が有る。)


17:48:05 | 3k1 | comments(0) | TrackBacks

自由自在 Squeak プログラミング:第3章 オブジェクト指向の導入

Squeak Logo
<注>:P.96の説明では、「クラスカテゴリ」の追加に「右クリック」と書かれていますが、私の環境(Mac OS X 10.3.8)ではハローが表示される為、ホイール(中:3:ブルー)ボタンをクリックしてメニューを表示しました。
また、「ポップアップメニュー」から選ぶ事もできました。(「ポップアップメニュー」は、各エリアの上向きスクロールボタン[▲]の上の[━]ボタンを左クリックで表示します。)

<システムブラウザ>:「System Browser」の見方を覚えると、Squeakに用意されたクラスを探検(勉強)できる。
システムブラウザの表示方法:ワールドメニューから「open…>browser」を選択します。(キーボードショートカットは、何も選択されていない状態で[command][B]を押します。)
システムブラウザ:System Browser
「システムブラウザ:System Browser」各部の名称
クラスカテゴリ:定義されたクラスをまとめる為の、フォルダの様なもので、名前は大文字で始める。
クラス:実際に定義されたクラス名が表示され、クラス名は大文字で始める。
・[instance], [class]ボタン:「クラス」から作成される「インスタンス」について定義する時は[instance]ボタンを、「クラス」そのものの定義の場合は[class]ボタンをクリックする。
メッセージカテゴリ:クラスに定義されたメッセージ(メソッド)をまとめる為の、フォルダの様なもの。「-- all --」を選択すると全てのメッセージを右のエリアに一覧表示する。
メッセージ:定義されたメッセージ(メソッド)名が表示される。メッセージ名は小文字で始める。
※:Squeakでは、クラスやメッセージ(メソッド)は、管理しやすい様に「カテゴリ」を設けて整理している。
コードペイン:クラスやメッセージの内容を表示/記述する場所。
「コードペイン」には、クラスやメッセージ(メソッド)の定義を記述する。図はクラス(サブクラス)の例。上部で選ばれている項目(クラス、メッセージ)によって、「コードペイン」の内容は変わる。内容に変更を加えた場合は[accept]([command][S])で保存する。

<クラス>:クラスは「インスタンス」を作り出す工場。定義するにはシステムブラウザを使用し、クラスカテゴリ内に追加する。クラス名の先頭は大文字で始める。
・クラス名のブラウザを開くには、ワークスペースでクラス名に「browse」メッセージを送る。
Trueクラスを見る例:「True browse」と入力後選択し、[do it]([command][D])する。
・クラスの階層を見るには、ワークスペースでクラス名に「browseHierarchy」メッセージを送る。
Trueクラスを階層ブラウザで見る例:「True browseHierarchy」と入力後選択し、[do it]([command][D])する。

<インスタンス>:「クラス」から作り出された製品。「インスタンス」は必ず「クラス」から(【new】その他のインスタンスを生成するメッセージにより)作成され、作成された「インスタンス」は自分を作った「クラス」答える事ができる。(【class】メッセージに答えられる)。
・インスタンスからそのクラスのブラウザを開くには、ワークスペースでインスタンスに「class」メッセージを送ってインスタンスのクラスを得、さらに「browse」メッセージを送る。
インスタンスのクラスを見る例1:「1 class browse」と入力後選択し、[do it]([command][D])する。
インスタンスのクラスを見る例2:ワークスペースで「true class」と入力して[print it]([command][P])すると、クラス名「True」が返される。

<継承>:上位(スーパー:親)クラスから、下位(サブ:子)クラスへ定義情報を受け継がせる仕組み。

<メソッドオーバーライド>:サブ(子)クラスで、スーパー(親)クラスと同じ名前のメッセージ(メソッド)を上書きする事で、別の操作をさせる仕組み。

<偽変数>
〔self〕:メッセージが呼ばれている自分自身を表すオブジェクト。自分自身が持っているメッセージ(メソッド)を内部的に呼びたい場合に使用する。
〔super〕:メッセージが呼ばれているオブジェクトの上位クラスを表すオブジェクト。サブクラス内で「super メッセージ名」と書く事で、継承元のクラス(スーパークラス)のメッセージ(メソッド)を呼び出す場合に使用する。
サブクラスでメッセージを上書き(メソッドオーバーライド)した部分で、スーパークラスのメッセージ(メソッド)を呼び出す時に良く使われる。


11:49:29 | 3k1 | comments(0) | TrackBacks

February 13, 2005

自由自在 Squeak プログラミング:第2章 メッセージ, 制御構造

Squeak Logo
<ポイント>:Squeakのプログラムの基本は〔オブジェクト〕に【メッセージ】を送信する事。
「制御構造」(分岐・繰り返し)処理で、文法は取り敢えず終わり(これで、プログラムが組めるようになっ…てたら良いな…)。

<メッセージ>:単項、2項、キーワード: の3種類のメッセージが有る。
1.単項メッセージ:メッセージ名のみで引数は無し。
〔オブジェクト〕 【単項メッセージ】

2.2項メッセージ:メッセージ名と引数を1つだけ持つ。
(演算子のようなモノらしいが、Squeakにはその優先順位はなく左から右に実行される。)
〔オブジェクト〕 【2項メッセージ】 〔引数〕
2項メッセージのメッセージ名は、「! % & * + - , / < = > ? @ \ ~ |」の16種類の記号文字の組み合わせのみで、これ以外の文字は使わない。※:実際には \ バックスラッシュは半角(0x5C)です。

3.キーワードメッセージ:メッセージ名と1つ以上の引数を持つ。メッセージ名に:(コロン)が付くのが特徴。
〔オブジェクト〕 【キーワードメッセージ】: 〔引数1〕 キーワード: 〔引数2〕 …

<メッセージの優先順位>:メッセージには、実行される際の優先順位が存在する。
単項メッセージ > 2項メッセージ > キーワードメッセージ: の順。
Squeakは原則として、左から右に実行される。

<カスケード>: ; セミコロン 同じレシーバに何度もメッセージを送る時に使用。
例:Transcript cr; show: 'Hello Squeak!'; tab; show: 'Good-bye'.
「cr」メッセージは改行を表す。Squeakと繋がりの有るSmalltalk-80がAppleと関係が有る為に、改行コードがCR…なのでしょう。

<すべての優先順位>:
1.カッコ( )で囲まれた部分
2.メッセージ(単項 > 2項 引数 > キーワード:引数1 xxx:引数2)
3.変数への代入(← [ _ ]アンダーバーで入力、またはANSIでは := コロンイコール)
4.リターン(↑ [^]キャレットで入力)

<制御構造>
1.分岐:ifTrue: , ifFalse: キーワードメッセージ
「真true/偽falseが返るメッセージ式」 ifXxxx: [真/偽の時の処理ブロック]
true/falseオブジェクトがifXxxx: メッセージを受け取ると、ifXxxxに応じて【value】メッセージを[真偽処理ブロック]に送信したり、ただ〔nil〕をリターン↑したりする。(true/false class browse. をdo it して確認できます。)
キーボードショートカット:ifTrue=[contlol][T]、ifFalse=[control][F]

and: , or: キーワードメッセージで、ifXxxxのための複雑な真偽式を書ける。
(「真偽式」xxx: [真偽ブロック]) ifXxxx: [処理ブロック]

2.繰り返し:
・whileTrue: , whileFalse: キーワードメッセージ [真偽ブロック]がtrue/falseの間、[処理ブロック]を実行する。
[真偽ブロック] whileXxxx: [処理ブロック]
whileXxxxの前は、[ブロック]で(式)では無い。

・to: do: for文のように書ける繰り返し処理。但し実際には「内部イテレータ(do: その他諸々)」を使用するので、もっときれいに書けるらしい…ので、繰り返しのためのメッセージはあまり使用されない。(5章 5.3.7 イテレートプロトコル までのお楽しみ?)
※:確かに、配列の要素数を超えてアクセスする「#(1 2 3) at: 4.」事で「out of bounds」エラーになる事が多いので、内部イテレータを使用すれば解決するのでしょう。
〔開始番号〕 to: 〔終了番号〕 do: [ブロック]
〔開始番号〕 to: 〔終了番号〕 by:〔増減数〕 do: [ブロック]

・timesRepeat: 回数を指定して繰り返す。これもあまり使われないとか。
・repeat: 無限ループを実現する。 [ブロック]内でリターン↑を忘れるとヒサンな事に…。 [command][.](ピリオド)で停止できます。


17:24:59 | 3k1 | comments(0) | TrackBacks

自由自在 Squeak プログラミング:第2章 オブジェクト, 変数

Squeak Logo
<Squeak(Smalltalk)の文法について>
大文字と小文字は厳密に区別されます。また、変数への代入「←」に[ _ ](アンダースコア)を使用する為、「 _ 」(アンダースコア)は変数名などに使用できません。
コメントは、[ " ](ダブルクォーテーション)で前後を囲みます。例:"コメントです。"

Squeakの「Workspace」では入力が難しく感じたり(Macでは日本語をインライン入力できません)、表示フォントが読みにくい(Squeak日本語版イメージで日本語を表示出来るフォントは NewYork だけのようです)場合は、使い慣れたエディタで、ファイル形式「UTF-8」、改行コード「CR」で保存すれば、保存したファイルを Squeak にドロップするだけで開けます(日本語も大丈夫です)ので、そこからワークスペースにコピー([command][C])ペースト([command][V])します。
私は、Mac用のフリーのエディタ「mi」(Ver.2.1.5)を使用しています。

<ポイント>:Squeakのプログラムは、〔オブジェクト〕に【メッセージ】を送るという形式になっており、長い式(メッセージチェーン)でも常に「左から→右へ」評価されます。メッセージの種類によって優先順位が変わったり、カッコを付ける事で優先順位を変える事はできます。

<オブジェクト>:Squeakで扱う「モノ」はすべて「オブジェクト」で、最上位に居るのが〔Smalltalk〕(グローバル)オブジェクトです。その為、演算子や変数の型も無く、み〜んな〔オブジェクト〕になります。

1.最初から存在する「予約語」のようなオブジェクトは5つ:〔true〕真、〔false〕偽、〔nil〕不定、〔self〕と〔super〕はどちらもメッセージの受け取り手。

2.グローバルオブジェクト:Squeakに用意されている高機能なオブジェクトで、〔Transcript〕や〔ActiveWorld〕などの他にも多数有ります。

3.リテラルオブジェクト:数字、文字、文字列、シンボル、配列、動的配列、ブロックの7つ
・〔数字〕:Squeakでは数字もオブジェクト。そしてメモリの許す限り、整数の桁数に制限がない!(マジ?スゴい!)
「r」を使って2、8、16進数を表す:2r1010(2進数の1010=10)、8r1010(8進数の1010=520)、16rFFFF(16進数のFFFF=65535 ※ffffと小文字ではダメ)
Squeakでは、分数も扱える!(小学生の宿題の強い味方?親の威厳を示せる?) 2分の1足す3分の2は、(1/2) + (2/3)と書きます。「print it」[command][P]すると、結果は「7/6」。カッコを付けないと「5/6」とおかしな結果に…それは、Squeakでは左から右に式を評価し(おそらく、(1/2 + 2) * 1/3 と解釈された)、演算子の優先順位が無いからです。そこで、カッコで優先順位を指定します。カッコを付ければ帯分数も簡単。(19*(16/17))-(11*(17/13)) を「print it」[command][P]すると(773/221)と計算されます。約分まではしてくれませんので、商を求める // メッセージや、余りを求める \\ メッセージを使います。

・〔文字〕:文字1字(キャラクタ)の前に「$」を付けるとそれは「文字」オブジェクトになります。例:$a, $A, $$, $? など。当然$xxと2文字はダメ。 日本語$あもOKでした。

・〔文字列〕:[ ' ]シングルクォーテーションで囲むと、文字列オブジェクトになります。文字列に[ ' ]を含めたい場合は「''」と2つ並べてエスケープします。例:'3K1''s blog' で 「3K1's blog」

・〔シンボル〕:先頭に[#]シャープの付いた文字列。シンボルテーブルに作成され、作成後は変更(コピー)不可。定数、フラグなどに使用。スペースや#が含まれるシンボルを作成する時は、[ ' ]シングルクォーテーションで囲む。例:#'#1 test simbol'

・〔配列〕:先頭が[#]シャープの丸カッコで囲まれ、各要素はスペース区切り。要素は1から始まる。他の言語の様に要素の番号でもアクセスはできるが、存在しない配列要素にアクセスする事が無い様に、イテレータという仕組みが使われている。 配列には型は無く、オブジェクトをどれでも入れられる。 例:#(1 $2 #(3 4 5) '678')

・〔動的配列〕:Squeak固有のもので、{ }ブレースで囲み、式そのものを要素にでき、区切りには .ピリオドを使用します。実際は式が評価された結果、ただの〔配列〕になる。

・〔ブロック〕:[ ] 角カッコで囲まれた部分で、その中にSqueakプログラムを幾つも書けますが、すぐには実行されず、「value」メッセージを送信する事で初めて実行(遅延実行)されます。 分岐やループ等で、必要な時に実行する際に利用。

4.クラスから作られるオブジェクト:new メッセージをクラスに送信する事で作成されるオブジェクト。new以外にも、分かり易さを優先して、クラスに合わせたメッセージが有ります。例:Color random.では、(Color r: g: b: )オブジェクトが作成されます。

<変数>:Squeakで変数にオブジェクトを代入するには「[変数] ← 〔オブジェクト〕」と書きます。変数に型は無く、どんなオブジェクトも代入可能です。
Squeakで代入を表す「←」記号は[ _ ]アンダーバーで入力出来ますが、ANSI Smalltalkの「:=」コロン・イコールも使えます。

<テンポラリ(一時)変数>変数を「|」縦バーで囲むと、実行の間のみ使用出来る、一時変数(テンポラリ変数)になる。
例:| tmpString | tmpString := 'Hello Squeak!'. Transcript cr; show: tmpString.
これはできない:| tmpString | := 'Hello Squeak'. テンポラリ変数の宣言と使用は別にする。


15:16:37 | 3k1 | comments(0) | TrackBacks

自由自在 Squeak プログラミング:第1章

Squeak Logo
自由自在 Squeak プログラミング」は、Squeakが紹介される場合に良く利用される「SqueakToys」ではなく、Squeakを使って「Smalltalk」と言う言語を学習する本です(多分…)。
これは、私自身の備忘録と、後で読み返して「以前の自分を笑う」ためにさらす恥です(以前の自分の方が良く理解出来てたりすると悲しいですが…良く有る事です)ので、このblogを読んでもSqueak(Smalltalk)でプログラム出来る様にはなりません。必ず「自由自在 Squeak プログラミング」を買って、自分で試して下さい。

・Squeakを構成するファイル(フォルダ):下記は、Mac OS X用「SqueakNihongo6Dev-Mac」フォルダの中身です。
「Squeak 3.7.4Beta1j.app」:Squeakのイメージファイル「….image」を動作させる「バーチャルマシン」です。
「SqueakV3.sources」:Squeakの開発に必要な「ソースファイル」です。必ずバーチャルマシンと同じ場所に置きます。
「Plugins」:「Plugins」フォルダ内に各プラットホーム毎(ここではMac用)に、バーチャルマシンの機能を拡張するプラグインファイルが入っています。これもバーチャルマシンと同じ場所に置きます。
「SqueakNihongo6Dev.image」:Squeakの全てが書き込まれた「イメージ」ファイルです。
「SqueakNihongo6Dev.changes」:自分で書いたプログラムのソースが保存されるファイルです。

勝手な想像ですが、バーチャルマシン「Squeak 3.7.4Beta1j.app」がファミコン本体で、イメージファイル「SqueakNihongo6Dev.image」がファミコンカセットみたいなものでしょうか(例えが古いですが…)。
本体にカセットを差し込む様に、イメージファイルをバーチャルマシンにドロップすると、Squeakが起動します。
Macの場合、イメージファイル「….image」をダブルクリックするだけでもOKです。
※:「….image」と「….changes」ファイルはMac, Windows, Linuxで共通だそうで、この2つのファイルが有ればヨソのSqueakのバーチャルマシンでも自分の環境で作業出来るようです。

・マウス操作:Macでも2ボタンスクロールマウスが使えます。(私は、Amazonで買ったMicrosoftのマウスを使っています。)
Squeak(Smalltalk)では、左から、1:■レッドボタン3:■ブルーボタン2:■イエローボタン と、色と番号で呼ばれており、Smalltalkの専用機ではマウスのボタンに実際に色が塗られていたとか。
実際のマウスの対応は、1:左ボタン、3:スクロールボタン、2:右ボタン になっています。Macでもスクロールボタンをクリックする事で3ボタンとして使えます。

・キーボードの操作:本の中の[Alt]キーは、Macではコマンド[command]キー(アップルマークと、四葉のクローバの様なアイコンが刻印されているキー)になります(最近のMacのキーボードは[option]キーに「alt」の刻印が有りますが、惑わされない様に。)。
よく使うキーボードショートカット:下記3つはよく使います。同じ事はマウスの3:スクロールボタンクリックでも選べます。
[command][D]:「do it」式が評価(実行)されます。
[command][P]:「print it」式を評価して、結果をすぐ隣に表示します。
[command][i]:「inspect it」式評価して、結果をインスペクタウィンドウに表示します。
Squeak特有の特別なキーの入力
←:変数に代入する記号は、[_](アンダースコア)を入力します。
↑:値を呼び出し元に返す記号は、[^](キャレット)を入力します。

・開発で使うツール・ウィンドウ
「Workspace」ワークスペース:[command][K]または「World」メニューから[open…][workspace…]で開きます。:ここで色々プログラムを入力・実行します。エディタみたいなものでしょうか。
「Transcript」トランスクリプト:[command][T]または「World」メニューから[open…][transcript…]で開きます。:文字列を表示するウィンドウです。標準出力(STDOUT)の様に使います。
デバッガ:文法や式の間違いが有る式を「do it」すると表示されます。
「System Browser」システムブラウザ:[command][B]または「World」メニューから[open…][browser…]で開きます。:本格的なプログラム開発(用意されたクラスを見たり、クラスを新たに作成したり)などに使用します。


11:21:29 | 3k1 | comments(0) | TrackBacks