これは、オリジナル Diving in to Smalltalk の学習記録です。
原文を参照しながら、見て下さい。
#12/15/2002 オリジナルが変更になっているため、修正開始。
#7/2/2000新規作成


Diving in to Smalltalk(Smalltalkに飛び込む)
を学ぶ

Do you hate tutorials?
チュートリアルはおきらい?

実際のSmalltalkコードを見たいのでしたら、こちらをどうぞ。どの部分もクリックすれば説明がでます。 .

Organization of this tutorial
このチュートリアルの構成

このチュートリアルはこういう人のために書かれました

・プログラミングは知っている
・Smalltalkを使いたい
・”オブジェクト指向”プログラミングを知っていてもいなくても
・マニュアルは読みたくない

このfast-paced(高速)イントロダクションでこういうことができるようになります

・Smalltalkコードを書いて、動かし、デバッグする
・環境のmeatな機能をいくつか使える
・システムを役に立つように理解できる

Preparing the sytem
システムを準備する

Smalltalkプログラムを動かしてください。Windowがいくつか出ますので、画面をキレイにするために、最小化(ミニマイズ)してください。

Running code
コードを走らす

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)

Writing more permanent code
より永続的なコードを書く

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 でもよい)

Writing more interesting code
より興味深いコードを書く

ループについてコードを書こう。
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!' とする。

So what's really going on here?
実際、何が進行しているのか

・ Smalltalk には型が無い
・パラメータには ”:”を使う。 hello:say: も ifTrue:ifFalse: も全てメッセージ。
・[ ]はブロックを示し、:i| はiがブロック内で使用されるか否かにかかわらず 引数として渡され、1からtimesの
値をとる。

More coding
もっとコーディング

ローカル変数を使う時は以下のようにする。

hellox2: times say: text

    | timestwo |

    timestwo := 2 * times.

    self hello: timestwo say: text

#注:self(=an Object) に(hello: timestwo say: text)を送る。times の2倍、textを表示する。

Simple debugging
単純なデバッグ

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 を
含んでいたことにある。

Finding your way around the guts of the system
システムの核心に触れる方法

”*” 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 を引数に送り、次にその結果に * を送る。, この * メッセージの引数は
adaptToIntegeraNumber に送った結果である。
大変複雑だが、このような処理の結果、multiplyFractionTimesFloatというような名前を持った、何ダースもの
メソッドを 持つことが出来ている。

そこで、 adaptInteger: は何をするのだろう。最初に実装を知ろう。
adaptInteger: を選択し、 more... 次に explain。comment によると adaptInteger:Number、
Fraction、 Float に定義されている。これらのクラスを知りたければ、 find method... また
implementors of it
#という方法で、どんどんシステムの内部を探っていくことができる、と言っている。

Complicated Debugging
複雑なデバッグ

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 の doesNotUnderstandString(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 でコードを一行ずつ実行することもできる。

More
追加
More

tutorial は今後追加される。今は、Numeric classes と 'Collections-Text'の中の class String を探索することを薦める。
Written by Chris Phoenix; Edited by Ted Kaehler