0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pharo でコードを書いてみよう(1)

0
Posted at

導入

今回は最初に書くプログラムとして定番の「Hello,World」を Pharo で書いてみます。さらに簡単な繰り返しの方法についての紹介をします。

はじめての Pharo「Hello,World」

まず最初に Transcript を表示します。Transcript は、Pharo の上部メニューから「Browse」を選び、「Transcript」を選びます。
fig1.png
これに「Hello,World」を表示してみます。Playground に以下を入力して Do it してください。

Transcript show: 'Hello,World'; cr

fig2.png
Transcript に Hello,World が表示できました。Smalltalk における文字列はシングルクォーテーション「'」で括ります。ダブルクォーテーション「"」は使えません。これはコメントの意味なります。セミコロン「;」は複数のメッセージをオブジェクトに送りたい時に区切り文字として使います。

object message1; message2; message3

先の例では、Transcript に show: と cr の 2 つメッセージを送っています。それぞれ show: は引数の文字列を表示して、cr は改行して、という意味になります。

何回も表示したいとき(1)

繰り返し何回も表示したいときがあります。

Transcript show: 'Hello,World'; cr; show: 'Hello,World'; cr; show: 'Hello,World'; cr

という方法でも出来ますが、もっとスマートな方法にしたいですね。
まず、Transcript ウィンドウの Clear ボタンをクリックして表示したものを消去してください。
次のコードを Playground に書いて Do it してください。

5 timesRepeat: [Transcript show: 'Hello,World'; cr]

今度は Hello, World が 5 回表示されました。
このコードについて解説していきます。

BlockClosure

まずブロッククロージャの説明からです。これは遅延実行を実現する仕組みで、大括弧で文を括ります。
と言われても「なんのこっちゃ」だと思いますので、次の例を見てください。

| aBlock |
aBlock := [Transcript show: 'Hello,World'; cr].
aBlock value

Smalltalk で一時変数を使う場合はパイプ「|」で括ります。
ここでは aBlock という変数を用意しています。次の行で aBlock にブロッククロージャを代入しています。Smalltalk では代入は「:=」を使います。ブロッククロージャの中の文は value メッセージが送られると実行します。送られるまでは何も実行しません。これが実行を遅らせている、つまり「遅延」しているということです。
また、文の区切りはピリオド「.」を使います。最後の文にピリオドはつけてもエラーにはなりませんが、文の終わりではなく区切りという意味なので書かないことが多いです。

Transcript に Hello,World を 5 回表示したければ、aBlock に value メッセージを 5 回送れば良いですね。

| aBlock |
aBlock := [Transcript show: 'Hello,World'; cr].
aBlock value; value; value; value; value

スマートな方法ではありませんが間違いではありません。
value メッセージを value: にすると、ブロッククロージャに引数のオブジェクトを渡すことができます。次の例をみてください。

| aBlock |
aBlock := [:val | Transcript show: val printString; cr].
aBlock value: 1

ブロッククロージャの中身の書き方が変化していますが、value: の引数を変数 val で受け取り、ブロッククロージャ内で val を使うことが出来ます。value: の引数を 1 以外にして再び Do it してえみてください。引数の値を変えると、 Transcript に表示する内容が変化することを確認してください。

メソッドの探し方

最後に timesRepeat: メッセージについて解説します。オブジェクトがメッセージを受け取るには同名のメソッドが必要です。では、この timesRepeat: メッセージを受けることができるオブジェクトはどこにあるでしょうか?
Pharo の上部メニューから探すこともできますが、今回はコードで探す方法を示します。以下を Playground で Do it してください。

SystemNavigation default browseAllImplementorsOf: #timesRepeat:

いろいろ謎なものが登場してきましたが、今はこれをそのまま覚えてください。一点だけ注意があります。browseAllImplementorsOf: メッセージの引数にメッセージを書くのですが、頭に「#」を付けるのを忘れないようにしてください。「#」はシンボルのリテラルで、Smalltalk システム内で唯一無二の記号であることを表します。いまいち何のことかよくわかんないかもしれませんが、

browseAllImplementorsOf: メッセージのように、メッセージを引数に書くときは、先頭に「#」をつける

という事と、メソッドを探すときは

SystemNavigation default browseAllImplementorsOf: #メッセージ

と書くということを覚えてください。
なお、メッセージにはコロン「:」が付く場合と付かない場合があります。有り無しで別のメッセージとなりますので、コロンが付くか付かないか注意してください。コロンを勝手に取ったりしてはいけません。
fig3.png
timesRepeat: メソッドを実装しているクラスは Integer でした。つまり Integer とそのサブクラスは timesRepeat: メッセージを受け取ることが出来る、ということがわかります。右側のペインの Integer の部分を右クリックして、プルダウンメニューから Browse を選べば、System Browser で Integer>>timesRepeat: を見ることもできます。
fig4.png
timesRepeat: は、1 から self まで aBlock に value メッセージを送るというコードになっています。つまり最初に示した

5 timesRepeat: [Transcript show: 'Hello,World'; cr]

は self は 5 ですから、 5 回 Transcript に Hello,World を表示します。

10 timesRepeat: [Transcript show: 'Hello,World'; cr]

この場合は self は 10 となるので、10 回 Transcript に Hello,World を表示します。

何回も表示したいとき(2)

次は Transcript に 1 2 3 ... とカウントアップして 10 まで表示してみます。

1 to: 10 do: [:val | Transcript show: val printString; cr]

to:do: という新しいメッセージが登場しましたが、今まで得た知識を使えば理解できると思います。

SystemNavigation default browseAllImplementorsOf: #to:do:

として to:do: メソッドがどのオブジェクトに実装されているか探ってみたり、System Browser を使って to:do: がどのように実装されているか調べたり、いろいろ試してみてください。

おわりに

今回はいろいろな事を解説しました。

・Transcript と、これに表示する方法
・繰り返し処理する方法
・遅延実行(BlockClosure)について
・Smalltalk の文法(一時変数や複数の文を書く方法など)
・メソッドの探し方

次回は Pharo で FizzBuzz を実装してみたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?