これは、オリジナル Diving
in to Smalltalk の学習記録です。
原文を参照しながら、見て下さい。
#12/15/2002 オリジナルが変更になっているため、修正開始。
#7/2/2000新規作成
実際のSmalltalkコードを見たいのでしたら、こちらをどうぞ。どの部分もクリックすれば説明がでます。 .
このチュートリアルはこういう人のために書かれました
・プログラミングは知っている
・Smalltalkを使いたい
・”オブジェクト指向”プログラミングを知っていてもいなくても
・マニュアルは読みたくない
このfast-paced(高速)イントロダクションでこういうことができるようになります
・Smalltalkコードを書いて、動かし、デバッグする
・環境のmeatな機能をいくつか使える
・システムを役に立つように理解できる
Preparing the sytem
システムを準備する
Smalltalkプログラムを動かしてください。Windowがいくつか出ますので、画面をキレイにするために、最小化(ミニマイズ)してください。
Workspace で Transcript show: 'Hello World'. と入力し、Yellow Button をクリックし、 do it する。 ”Hello World ” が Transcript window に表示される。 #注:マウスのボタンは、当面は、左、右、CTRL+左のに色のカードを貼って識別すると良い。3ボタンなら 割り当ての変更ができる。(Making a BankAccount class 参照) #注:Workspaceでの Yellowボタン#注:ブラウザよりステートメントをコピーする場合、Ctrl-c でコピーし、Squeak では alt-vで ペーストする(Windows95+Netscape Communicator4.7)
Browser の 一番左のペインは groups of classes、次は class names、次が groups of methods、 最後が method names。
#注 実行画面
Pane1(Kernel-Objects) の Pane 2 で (Object) を選ぶ。 Pane2の下の部分(Instanceメソッドかclassメソッドかの選択)は"Instance" メソッドがデフォルトで選択されているはず。
Pane 3 でどれでもいいので名前を名前を選択すると、下の大きな "Edit pane" に(雛形があらわれるのでこれに)以下をタイプする。
hello
Transcript show: 'Hello World'
Yellow Button をクリックし、accept する。これで class 中に a method ができた。
(Pane4 メソッド名 に Hello と表示される)
メソッドの実行は、 Workspace で Object new hello とタイプし、 do it とすればよい。
(Edit Pane でソーステキストを選択してdo it でもよい)
ループについてコードを書こう。hello 1 to: 5 do: [:i | (Transcript show: 'Hello World') cr]
・parameters付き
hello: times
1 to: times do: [:i | (Transcript show: 'Hello World') cr]
これを走らすには Object new hello: 5. とタイプし do it.
・Logic
hello: times
(times > 100)
ifTrue: [ Transcript show: 'You will get bored!']
ifFalse: [1 to: times do: [:i | (Transcript show: 'Hello World') cr]]
・Strings
hello: times say: text
(times > 100)
ifTrue: [ Transcript show: 'You will get bored!']
ifFalse: [1 to: times do: [:i | (Transcript show: text) cr]]
これを走らすには Object new hello: 5 say: 'Hi world!' とする。
・ Smalltalk には型が無い
・パラメータには ”:”を使う。 hello:say: も ifTrue:ifFalse: も全てメッセージ。
・[ ]はブロックを示し、:i| はiがブロック内で使用されるか否かにかかわらず 引数として渡され、1からtimesの
値をとる。
ローカル変数を使う時は以下のようにする。
hellox2: times say: text
| timestwo |
timestwo := 2 * times.
self hello: timestwo say: text
#注:self(=an Object) に(hello: timestwo say: text)を送る。times の2倍、textを表示する。
bug をつくろう。 workspace で (Object new) hellox2: 5 say: 5 とタイプし、 do it 。
#原文のようにはSqueak2.8は反応しない。"Strings only store Characters". のメッセージが出る。
#これは、Squeak2.8の動作。 MessageNotUndestood: do: のウィンドウが出る。 debugボタンを選択。
注:(画面)
一番上の pane は call stack を示す。真ん中の pane は code を示す。 一番下の panes は variables の 値 を示す。
一番上の paneで Object>>hellox2:say: のところまでスクロールダウンし、その行を click する。
#注:(画面)
(この行は、message hellox2:say: が Object型 の an object に送られたことを示す。)
真ん中のPane のコードを見ると、 show: text が白くハイライトされている。これは、問題が show: message か
text variable(引数)にあることを示している。この場合、問題は the text variable が a string でなく、 a number を
含んでいたことにある。
”*” message に関心があるとしよう。全てのシステムは見ることができる。問題はどこを見るかを知ることだ。
number は このメッセージを理解する、しかし number って一体なんだ?
Workspace で 2 をタイプする。それを select し、Yellow Button を Click して inspect it。
window が pop up しそのタイトルは "SmallInteger: 2"。2 のクラスが判った。
システムブラウザの Pane 1 に行き、YellowButton で find class..." をセレクトし、SmallInteger とタイプする。
すると Pane 1 は Numbers-Numeric を指すようにに変わり、Pane 2 にはSmallInteger が指される。
Pane 2 で 同じく YellowButton で (下から2つ目) "find method..." を選択し、 * を選択する。
Pane 3 (プロトコル)は arithmetic となり、pane 4(メソッド名) に * が表示される。
#注:(画面)
他の方法もある。 Workspace で * をタイプして選択し、 Yellow Button で Click して "more..." を選び次に
出てくるウィンドウで "implementers of it" を選ぶ。 "Implementers of *" という window が開く。興味のある
クラスをクリックする。下の pane は Edit pane と同じで、コードを編集し、accept できる。
Edit pane のコードをチェックする。double quotes で 囲まれたのは comment なので無視。
<primitive: 9> は今回は無視する。
^ super * aNumber はとても内容が深いので、次回の説明に譲る。
(必要ならウィンドウの左のスクロールバーを使うか、1番目と2番目の間のしきりを広げて探し)
SmallInteger (Pane 2) を2回クリックする。Edit window には巨大な一つのメッセージが表示される。
subclass:instanceVariableNames:classVariableNames:poolDictionaries:category:
#注。以下のこと。Objectにメッセージが送られている。
----------------------------------------
Object subclass: #NameOfClass
instanceVariableNames: 'instVarName1 instVarName2'
classVariableNames: 'ClassVarName1 ClassVarName2'
poolDictionaries: ''
category: 'Kernel-Numbers'
----------------------------------------
これは class SmallInteger を創るために Integer に送られたメッセージだ。システムはこのメッセージの
テキストを覚えていて、あなたに(クラス定義として)見せる。
最初の行は、Integer subclass: #SmallInteger.
これは SmallInteger の superclass が Integer であることを示す。別の言い方をすれば
変数 super は、 self にある SmallInteger object を integer として扱うことを言っている。
System Browser の Pane 2 で Yellowボタンを押し spawn hierarchy を選択するとクラスの継承階層が
表示される。
#注:(画面)
Smalltalk には 型宣言は無いので、* には全てのものが渡され、 * はそれを処理しなければならないことに
注意しなさい。
まず最初に aNumber に an Integer かどうか isInteger メッセージで聞く。もしそうなら、自分自身に
digitMultiply:neg: メッセージを送る。
もし aNumber が an Integer でなければ * は an integer に a non-integer をかけるという問題に直面する。
これは、自分自身と引数を * に送り、乗算の出来る型に変換することで解決する。それは aNumber に
adaptInteger: を self を引数に送り、次にその結果に * を送る。, この * メッセージの引数は
adaptToInteger を aNumber に送った結果である。
大変複雑だが、このような処理の結果、multiplyFractionTimesFloatというような名前を持った、何ダースもの
メソッドを 持つことが出来ている。
そこで、 adaptInteger: は何をするのだろう。最初に実装を知ろう。
adaptInteger: を選択し、 more... 次に explain。comment によると adaptInteger: は Number、
Fraction、 Float に定義されている。これらのクラスを知りたければ、 find method... また
implementors of it 。
#という方法で、どんどんシステムの内部を探っていくことができる、と言っている。
Object new hellox2: '5' say: 'hi' を do it すると window が開く、そのタイトルは
"Message not understood: adaptInteger"
Yellow Button を Click し debug を選択する。
Object>>hellox2:say: の行を選択する。
コードでは *times がハイライトされている。これが問題を起こしてメッセージだ。
ボトム window の times、 text、 timestwo もクリックできる。
値は times '5'、 text 'hi'、timestwo nil。 nil は a number ではないが問題はない。 timestwo は
an integer ではない、それは typeを持たない。したがって、 nil は妥当な値であり、問題の原因ではない。
stack を下に行くと、 SmallInteger(Integer)>>* で、* が SmallInteger へ Integer 扱いで渡されている。
最下行で message の doesNotUnderstand が String(Object) に渡されている。ここが system が something が
wrong だと通知しているところだ。 A String は String およびその superclasses で定義されていないメッセージを
渡された。
すぐ上では adaptInteger: self がハイライトされている。これが understood されなかった。これは
aNumber へ送られている。aNumber を bottom pane で見ると '5' だ。これが原因だ。
breakpoint の挿入も出来る。単に self halt の statement をコードに挿入するだけでよい。
hellox2:say: を実行すると window に "Halt encountered." と表示される。debug を選択すれば、code を見る
ことができ、step でコードを一行ずつ実行することもできる。
tutorial は今後追加される。今は、Numeric classes と 'Collections-Text'の中の class String を探索することを薦める。
Written by Chris Phoenix; Edited by Ted Kaehler