Smalltalk開発環境入門編

# Smalltalk開発環境入門編
ほとんどのSmalltalk処理系は、文法だけ学んでも使い方が分からないづらい方が多いと思います。そこで今回はSmalltalkの基本的な開発環境、ツールについて紹介します。Smalltalkの基本的な文法については[Smalltalk基本文法編](http://qiita.com/newapplesho/items/6376c90d3e9ca66d2a95)にて紹介します。これを学ぶことでSmalltalkの開発およびプログラム実行をすることができます。

#覚えて欲しいツール
[Smalltalkだめ自慢](http://www.slideshare.net/umejava/smalltalk-38297600)でも紹介されておりますが、
> Smalltalkの開発では、viやEmacsなどの一般的なエディタは利用せずに、Smalltalkで作られたツールを使って開発を使います。

そのため、以下が主なツールについては覚えておくとよいでしょう。

* Workspace （ワークスペース）
* Transcript（トランスクリプト）
* System Browser （システムブラウザ）
* Inspector （インスペクタ）
* Method Finder （メソッドファインダ）
* Notifier （ノーティファイア）
* Debugger （デバッガ）

#Workspace （ワークスペース）
Workspaceは、プログラムを記述するためのエディタです。プログラムの実行などをするときに利用します。

**開き方**
[World Menu]-[Wordspace]を選択。

![Workspace.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/79ee58c0-38ce-9f3e-0e2a-48979d61ca32.jpeg)
Workspace

#Transcript（トランスクリプト）
Transcriptはプログラムの実行結果出力するためのウィンドウです。

**開き方**
[World Menu]-[Tools]-[Transcript]を選択。

![Transcript.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/2ee8c21d-910b-0fac-f25d-874869d847dc.jpeg)
Transcript

# Smalltalkのプログラムの実行
Smalltalkを使いたくてたまらない人もいるかもしれませんので、WorkspaceとTranscriptを使ってSmalltalkのプログラムを実行してみます。

おなじみの'Hello, world!'を表示するプログラムを実行してみましょう。
必要なツールは以下のツールです。

* Workspace
* Transcript

プログラムを実行する前に開きましょう。Workspaceに以下のコードを記述します。

```smalltalk
"TrascriptにHello, Wolrd!という文字列を出力するプログラム"
Transcript show:'Hello, world!'.
```
![helloworld-Workspace.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/4a459df0-eed1-cdf8-84e6-ae7b79c4e173.jpeg)

実行するプログラムを選択して[右クリック]、[Do it]を選択すると実行されます（ショートカットキー、Macならcommand + d, Windowsならalt + d）。実行されるとTranscriptに```Hello, world!```と表示されるでしょう。
![doit.png](https://qiita-image-store.s3.amazonaws.com/0/18287/b629a163-3c99-3d0f-0612-24c8c72aa497.png)

実行結果
![helloworld-Transcript.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/ea19a188-addf-6a00-5bba-b2f33e25445a.jpeg)

Smalltalkの世界では、プログラムを実行するには`Do it`をすればよいことが分かったでしょう。
世界中のSmalltalkerが記載したウェブサイトで「コードを`Do it`」などと記載されておりましたら、プログラムを実行するということです。

## プログラム実行結果の出力方法
Smalltalkのプログラム実行結果の出力方法は、Transcriptに出力する以外に別の方法があります（簡易的なプログラムの実行の際にはこちらの方を利用することが多いかも）。
説明するよりも実行する方が分かりやすいので、Workspaceに以下のプログラムを書きます。

```smalltalk
1 + 3. 
```

実行するプログラムを選択して[右クリック]、[Print it]（ショートカットキー、Macならcommand + p, Windowsならalt + p）を選択するとWorkspaceのプログラムの最後に実行結果が表示されます。

![printit-Workspace.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/19a7fe77-b7f6-34df-7c91-bc4ed679f834.jpeg)

Smalltalkでは、実行したいプログラムの実行および実行結果が得られるため、アイディアをすぐに確認することができます。**Do it, print it**は忘れないようにしましょう。

# メッセージの優先順位の練習問題の答え
[Smalltalk基本文法編](http://qiita.com/newapplesho/items/6376c90d3e9ca66d2a95)の練習問題を実行をしてみましょう。print itで実行して結果を得るといいでしょう。余力があるかたは、プログラムを少し修正してTranscriptにも出力してみるとよいでしょう。

```smalltalk
3 + 4 * 5.
```

```smalltalk
3 + 4 sqrt.
```

```smaltalk
50 + 4 sqrt between: 10 and: 100.
```

![answer-Workspace.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/cce0495b-2d0a-ec03-6900-210e5e533cf5.jpeg)

#System Browser （システムブラウザ）
システムブラウザ（クラスブラウザと呼ぶドキュメントもあります）は、既存クラスの検索およびクラス定義を行うツールです。

**開き方**
[World Menu]-[System Browser]を選択。

![SystemBrowser.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/e7360e61-9ade-8d9e-7ea7-ca8766557209.jpeg)

詳しい使い方は別の記事にて紹介します。Smalltalkはネットにリファレンス等が少ないのはこのブラウザがおかげといってもいいでしょう（よいいことか悪いことかは人によりますね）。

#Inspector （インスペクタ）
Inspectorは、オブジェクトを調べるツールです。プログラムとしても呼び出せますので、実行中のオブジェクトを調べることができます。

**開き方**
[調べたいオブジェクトを選択]、[右クリック]、[Inspect it]を選択。
または、ショートカットキー、Macならcommand + i, Windowsならalt + i。

例えば、以下のコードをInspectorで調べてみます。

```smalltalk
#($a $b $c).
```

inspect itをすると、以下の画面が表示されます。
![inspector.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/f01a5a42-7319-a0ed-1629-670bcd71e9f4.jpeg)

配列（Arrayクラスのオブジェクト）の要素を調べることができます（図は１番目の要素の中身）。
　
## Inspectorを使ってみる
Inspectorをもう少し具体的なプログラムを書いてみましょう。
以下のプログラムをWorkspaceに記述します。


```smalltalk
"配列の要素をランダムで取り出すプログラム"
x:= #( #(29 12) #(3 1)) atRandom.
x. "xをInspect it"
```

または

```smalltalk
x := #( #(29 12) #(3 1)) atRandom.
x inspect. "Do it"
```

２番目のコードは、`inspect`をいうメッセージをオブジェクトに送ることでInspectorを開いております。


#Method Finder （メソッドファインダ）
Method Finderはメソッド検索をするツールです。

**開き方**
[World Menu]-[Tools]-[Finder]を選択。

以下は、Method Finderにて`doesNotUnderstand:`を検索した結果です。*意外に多くてびっくりです。*

![Finder.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/a353acfd-d9a7-14b7-523b-c7fb7709c457.jpeg)


# Notifier （ノーティファイア）
Notifierはエラーの際に開く警告通知ツールです。
 
以下のプログラムを実行してみます。

```smalltalk
"配列から4番目の要素を取り出す"
#($a $b $c) at:4.
```

エラーになるプログラムなので、実行すると以下のようにNotifierが開きます。

![SubscriptOutOfBounds: 4.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/a38d320a-c30e-f02e-8fd5-aef09ceb2675.jpeg)

Notifierには直前に実行したメッセージの一覧（正確には、呼び出しスタックの一覧）が表示されております。


#Debugger （デバッガ）
Debuggerはプログラムのデバッグをするツールです。
Notifierが開いたら、右の[Debug]ボタンを押下します。
Smalltalkのデバッガは非常に強力かつ便利なツールなので、別の機会で紹介します。

*今回のエラーはデバッガの魅力を伝えるにはあまりいい例題ではありません*
![SubscriptOutOfBounds: 4-2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18287/e003c9a8-4f19-ef29-da1e-7bd2353e8c8a.jpeg)

#まとめ
いかがでしょうか。文法とツールの使い方がわかったので、Smalltalkでの開発ができそうですね。

# 参考
Smalltalkだめ自慢
http://www.slideshare.net/umejava/smalltalk-38297600

自由自在 Squeakプログラミング PDF版
http://swikis.ddo.jp/squeak/13

Pharo by Example 日本語
http://www.smalltalk-users.jp/Home/docs/PBE1-ja.pdf

Pharo by Example
http://www.pharobyexample.org/

今日から使おうSmalltalk
http://www.slideshare.net/newapplesho/smalltalk-32627289