71
今日から使おうSmalltalk 26Smalltalk勉強会 吉田 翔 1

今日から使おうSmalltalk

Embed Size (px)

Citation preview

Page 1: 今日から使おうSmalltalk

今日から使おうSmalltalk第26回 Smalltalk勉強会

吉田 翔

1

Page 2: 今日から使おうSmalltalk

第26回Smalltalk勉強会

Smalltalkのインストール

Squeak 4.1-ja(All in one)がおすすめ

Mac, Linux, Windows全てに対応

http://swikis.ddo.jp/umejava/48

zipファイルを解凍してすぐに使える

使い方は環境編を参照

2

Page 3: 今日から使おうSmalltalk

第26回Smalltalk勉強会

Smalltalkが分からない

文法 開発環境

array := Array with:-1 with:1 with:100.array inject:  Float infinity negated into:[:v1 :v2 | v1 max: v2 ].

3

Page 4: 今日から使おうSmalltalk

第26回Smalltalk勉強会

Smalltalkのプログラミングの流れ

Workspace,SytemBrowserを起動

プログラムを記述

プログラム実行

開発環境編

文法編

開発環境編

4

Page 5: 今日から使おうSmalltalk

基本文法編第26回 Smalltalk勉強会

吉田 翔

5

Page 6: 今日から使おうSmalltalk

第26回Smalltalk勉強会

コメント

ダブルクオーテーションで囲む

"0 notNil"

ダブルクオーテーションをコメントに含める場合

" このように「""」2回記述します"

6

Page 7: 今日から使おうSmalltalk

第26回Smalltalk勉強会

文の区切りと代入文の区切り

代入(assignment)

.

:=

ピリオド

コロン,イコール

昔のSmalltalkのコードではアンダーバー_

7

Page 8: 今日から使おうSmalltalk

第26回Smalltalk勉強会

リテラル(数字)

5.1.414.-1.122244567.10e7.2r100. "2進数 "

8r12. "8進数"

16rFF. "16進数"

8

Page 9: 今日から使おうSmalltalk

第26回Smalltalk勉強会

文字

文字列

リテラル(文字と文字列)

$a "文字の前に$を付けます"$b$-

'Smalltalk' "シングルクオーテーションで囲む"

"「'」を文字列に含める場合は2回続けて書く "

" 文字列結合は「,」 "

9

Page 10: 今日から使おうSmalltalk

第26回Smalltalk勉強会

リテラルシンボル

配列

#apple.#pineapple.

システム内に1つしか存在しない文字列

#($a 'smalltalk' 42.19).#(#(1 2) 3).#(a b c) ===> #(#a #b #c)

要素のオブジェクトは統一しなくてもいい

10

Page 11: 今日から使おうSmalltalk

第26回Smalltalk勉強会

擬変数true

false

nil

self

super

thisContext

自身を表す

メソッドの検索の際,スーパークラスのものを表す

自身実行中のコンテキスト(システムの実行状態)を表す

11

Page 12: 今日から使おうSmalltalk

第26回Smalltalk勉強会

メッセージ式

3 negated -3

オブジェクト メッセージ

オブジェクトにメッセージを送るSmalltalkのプログラム

1. 単項メッセージ式2. 2項メッセージ式3. キーワードメッセージ式

12

Page 13: 今日から使おうSmalltalk

第26回Smalltalk勉強会

単項メッセージ(Unary messages)

4 sqrt. "平方根"

12 i. "虚数"

1 asFloat. "浮動小数とする"

#(1 2 3) first. "最初の要素を取り出す"

引数を取らないメッセージ

13

Page 14: 今日から使おうSmalltalk

第26回Smalltalk勉強会

2項メッセージ(Binary Messages)

4 + 1.

10 / 2.

8 // 3.

1 < 2.

'Small','talk'.記号 +, -, ,,!, /, &, =, >, |, <, ~, @を組み合わせた名前をもつメッセージ

主に数学の2項演算子(2つのデータに対する演算)を表すためのもの

14

Page 15: 今日から使おうSmalltalk

第26回Smalltalk勉強会

キーワードメッセージ(Keyword Messages)

"3番目の要素を取り出す"#($z $y $x) at: 3."10から100の間の数ならばtrueを返す"11 between: 10 and: 100. 11.between(10,100)"2番目の要素をhelloに置き換える"#($a $b $c) at: 2 put: 'hello'.

1 to: 10 by: 2 do:[:v | Transcript cr; show:v ].

引数を取るメッセージのうち, 2項メッセージ以外.メッセージの終わりにはコロン(:)が必ず付く

15

Page 16: 今日から使おうSmalltalk

第26回Smalltalk勉強会

メッセージの優先順位

四則演算の優先順位がない.優先順位を付けるには括弧を付ける.

単項 > 2項 > キーワード

基本は左優先順単項,2項,キーワードメッセージが,1つの文に含まれていた場合には以下の優先順位で実行

16

Page 17: 今日から使おうSmalltalk

第26回Smalltalk勉強会

メッセージの優先順位(例)基本は左優先

単項 > 2項 > キーワード

3 + 4 sqrt

(3 + 4) sqrt

1 2

21

17

Page 18: 今日から使おうSmalltalk

第26回Smalltalk勉強会

練習問題

3 + 4 * 5.

3 + 4 sqrt.

50 + 4 sqrt between: 10 and: 100.

実行順序と実行結果を考えましょう

18

Page 19: 今日から使おうSmalltalk

第26回Smalltalk勉強会

ブロック

block := [:x :y | x + y].block value: 1 value: 2.block valueWithArguments: #(3 4)

主に制御構造に用いられる

任意の時点で実行可能なプログラムの固まり•function(x){x + 1}のようなもの

•(lambda (x) (+ x 1))

実行する際には,引数の数に応じてvalue,value:等を送信する

19

Page 20: 今日から使おうSmalltalk

第26回Smalltalk勉強会

カスケード

Transcript show: 'Hello '; cr; show:'Squeak'.

Transcript show: 'Hello '.Transcript cr.Transcript show: 'Squeak'.

先頭オブジェクトに対してメッセージを連続的に送信する際に用いる

; セミコロンを用いる

20

Page 21: 今日から使おうSmalltalk

第26回Smalltalk勉強会

リターン

^

値を返す

キャレット

^ 1 + 2.

^ true.

21

Page 22: 今日から使おうSmalltalk

第26回Smalltalk勉強会

制御文(条件分岐)

Float infinity > 0 ifTrue:[ Transcript show:'Yes!'. ]ifFalse:[ Transcript show: ' NO... ' ].

22

Page 23: 今日から使おうSmalltalk

第26回Smalltalk勉強会

制御文(繰り返し)

1 to: 10 by: 2 do:[:v | Transcript cr;show:v ].

| i | "一時変数"

i := 1.[i < 10] whileTrue:[:v | Transcript cr; show:v. i := i + 2. ].

for(int i=1; i<=10; i=i+2)

int i=1; while(i<10;){ i=i+2;}

23

Page 24: 今日から使おうSmalltalk

第26回Smalltalk勉強会

制御文(繰り返し)

#(1 2 3) do:[:v | Transcript cr; show:v ].

3 timesRepeat:[Transcript show:‘Hello’].

24

Page 25: 今日から使おうSmalltalk

第26回Smalltalk勉強会

Smalltalkのポイント

変数名にアンダーバーやダラーは使えない

擬変数には代入できない

算術演算の時は優先順位を注意する

whileTrue:はブロックオブジェクトに送る

配列の添字は1からはじまる

25

Page 26: 今日から使おうSmalltalk

開発環境編第26回 Smalltalk勉強会

吉田 翔

26

Page 27: 今日から使おうSmalltalk

第26回Smalltalk勉強会

ワールドメニュー(World menu)背景(ワールド)をクリック開き方

27

Page 28: 今日から使おうSmalltalk

第26回Smalltalk勉強会

Smalltalkの開発環境

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

覚えて欲しいツール

28

Page 29: 今日から使おうSmalltalk

第26回Smalltalk勉強会

ワークスペース(Workspace)プログラムを記述するためのエディタ開き方ワールドメニュー (World menu)の開く

開く メニューワークスペース(Workspace)

29

Page 30: 今日から使おうSmalltalk

第26回Smalltalk勉強会

トランスクリプト(Transcript)実行結果を出力するためのウィンドウ開き方ワールドメニュー (World menu)の開く

開く メニュートランスクリプト(Transcript)

30

Page 31: 今日から使おうSmalltalk

第26回Smalltalk勉強会

使いたくてたまらない人のためにHello Smalltalkを表示してみましょう

必要なツールワークスペーストランスクリプト

Transcript show: 'Hello Smalltalk'.

ワークスペースに以下のコードを記述

トランスクリプトにHello Smalltalkを出力する

31

Page 32: 今日から使おうSmalltalk

第26回Smalltalk勉強会

プログラムの実行方法do it

1.実行するプログラムを選択して ALT(右クリック)+ クリック2.「式を評価」を選択

使い方

32

Page 33: 今日から使おうSmalltalk

第26回Smalltalk勉強会

プログラム結果の出力方法

print it

Transcriptに出力

1 + 3.

Transcript show: 1 + 3. 「式を表示」を選択

33

Page 34: 今日から使おうSmalltalk

第26回Smalltalk勉強会

システムブラウザクラス検索,クラス定義を行なう開き方ワールドメニュー (World menu)の開く

開く メニューシステムブラウザ(Browser)

34

Page 35: 今日から使おうSmalltalk

第26回Smalltalk勉強会

インスペクタオブジェクトを調べるツール

xをインスペクタで確認

オブジェクトを選択,ALT(右クリック)押しながらクリック.「式をインスペクト」を選択

35

Page 36: 今日から使おうSmalltalk

第26回Smalltalk勉強会

インスペクタを使ってみよう

"配列の要素をランダムで取り出す"

x := #(#(7 9) #(3 1)) atRandom.x. "インスペクト"

x inspect. "Do It"

どちらの配列がxに代入されたか調べてみる

または

36

Page 37: 今日から使おうSmalltalk

第26回Smalltalk勉強会

メソッド・ファインダ(Method Finder)メソッド検索をするツールワールドメニュー (World menu)の開く

開く メニューメソッド・ファインダ(method finder)

37

Page 38: 今日から使おうSmalltalk

第26回Smalltalk勉強会

ノーティファイア

デバッカを開くエラーの際に開く警告表示

最初は,中止ボタン(Abandon)でも構わない

38

Page 39: 今日から使おうSmalltalk

第26回Smalltalk勉強会

デバッガ(Debugger)

使い方は「自由自在Squeak プログラミング」を参考にしてください

39

Page 40: 今日から使おうSmalltalk

第26回Smalltalk勉強会

ショートカットMac Windows

ワークスペースを開く CMD + k ALT + k

トランスクリプトを開く CMD + t ALT + t

システムブラウザを開く CMD + b ALT + b

do it CMD + d ALT + d

print it CMD + p ALT + p

CMD(ALT) + ピリオド(.)強制終了(割り込み)

40

Page 41: 今日から使おうSmalltalk

第26回Smalltalk勉強会

終了方法ワールドメニューの「保存して終了」または「終了」

実行中のプログラム(プログラムの実行状態)をイメージに保存できる再び起動した際に,前回の状態が再現される

41

Page 42: 今日から使おうSmalltalk

第26回Smalltalk勉強会

イメージの保存について

種類 内容保存(save) 現在の状態を現在使用しているイメージに保存

別名保存(save as)

別のイメージに保存に状態を保存.イメージ名を決定する.保存後は,新たに作成したイメージ画面が表示

新しい版として保存(save as new version)

自動的にイメージ名にバージョン番号が付加される

保存して終了(save and quit)

現在の状態を現在使用しているimageに保存して終了

イメージとはSmalltalkのオブジェクトをファイルにダンプしたもの

42

Page 43: 今日から使おうSmalltalk

何か作りましょうBMI計算ツールを作ろう

43

Page 44: 今日から使おうSmalltalk

第26回Smalltalk勉強会

BMIBMI = 体重[kg] ÷ (身長[m] × 身長[m])標準体重 = 身長 × 身長 x 22日本肥満学会によるとBMIが22の場合が標準体重BMIが25以上の場合を肥満BMIが18.5未満である場合をやせ

9//2. “商”

9\\2. “余り”

44

Page 45: 今日から使おうSmalltalk

第26回Smalltalk勉強会

UIを使ったツールにするためにh := FillInTheBlank request:'身長(cm)は?'

initialAnswer:'0'.

“戻り値はByteStringなので変換する”

h asInteger .

45

Page 46: 今日から使おうSmalltalk

第26回Smalltalk勉強会

UIを使ったツールにするために

Utilities informUser: '計算中'

! during: [(Delay forSeconds: 1) wait].

1秒間Squeakの画面上に計算中と表示する

46

Page 47: 今日から使おうSmalltalk

第26回Smalltalk勉強会

| h w bmi sw |h := FillInTheBlank request: '身長(cm)は?' initialAnswer: '0'.h asInteger <= 0 ifTrue:[ ̂ false ].

w := FillInTheBlank request: '体重(kg)は?' initialAnswer: '0'.h asInteger <= 0 ifTrue:[ ̂ false ].

bmi := w // ( ( h*h ) //10000 ).sw := ( h*h*22 ) // 10000

Utilities informUser: '計算中'! during: [(Delay forSeconds: 1) wait ].

一部

47

Page 48: 今日から使おうSmalltalk

(おまけ)クラスとインスタンス編

第26回 Smalltalk勉強会吉田 翔

48

Page 49: 今日から使おうSmalltalk

第26回Smalltalk勉強会

1.クラスカテゴリ作成2.クラス名作成3.メソッドカテゴリ作成4.メソッド作成

クラス定義

クラス定義はクラスブラウザを用いる

49

Page 50: 今日から使おうSmalltalk

第26回Smalltalk勉強会

クラス定義 - クラスカテゴリ作成

1. ALT(右クリック)を 押しながらクリック2.「項目を追加」を選択

50

Page 51: 今日から使おうSmalltalk

第26回Smalltalk勉強会

クラス定義

スーパークラス名 subclass: #クラス名 instanceVariableNames: 'インスタンス変数名1 インスタンス変数名2' classVariableNames: 'クラス変数名1 クラス変数名2' poolDictionaries: 'プール辞書名' category: 'クラスカテゴリ'

必ずスーパークラスを持つ

クラスブラウザのコードペインに記述

51

Page 52: 今日から使おうSmalltalk

第26回Smalltalk勉強会

クラス定義

クラス定義の例52

Page 53: 今日から使おうSmalltalk

第26回Smalltalk勉強会

クラス定義の反映accept

ショートカット : CMD(ALT) + s

•記述した定義等を保存(変更通知)•クラス定義,メソッド定義を追加・変更の際行なう•ALT(右クリック) + 了解 で行なう

初めてのacceptの際には右のフォームが表示されるのでイニシャルを入力

53

Page 54: 今日から使おうSmalltalk

第26回Smalltalk勉強会

メソッドの定義messageSelectorAndArgumentNames "comment stating purpose of message"

| temporary variable names | statements

メソッドのテンプレートの意味1行目はメソッド名2行目はコメント4行目は一時変数の定義5行目以降はメソッドの動作記述

54

Page 55: 今日から使おうSmalltalk

第26回Smalltalk勉強会

インスタンスの生成

x := Human new.

クラスにnewメッセージを送信

55

Page 56: 今日から使おうSmalltalk

(おまけ)基本クラス編第26回 Smalltalk勉強会

吉田 翔

56

Page 57: 今日から使おうSmalltalk

第26回Smalltalk勉強会

基本クラスの紹介NumberBlockCollectionクラス, イテレータ等

Bag, SetArray, OrderedCollectionDictionary

文字列(String)Stream

他にも色々なクラスがあります

57

Page 58: 今日から使おうSmalltalk

(おまけ)応用編第26回 Smalltalk勉強会

吉田 翔

58

Page 59: 今日から使おうSmalltalk

第26回Smalltalk勉強会

Workspaceの内容の保存をクリックし,save contents to file...を選択

59

Page 60: 今日から使おうSmalltalk

第26回Smalltalk勉強会

ソースの管理方法(Squeak)

imageごと

csファイル(今回は紹介しない)

stファイル

Monticello(今回は紹介しない)

Metacello(第23回Smalltalk勉強会)

60

Page 61: 今日から使おうSmalltalk

第26回Smalltalk勉強会

イメージ単位のバックアップimageフォルダをコピー

61

Page 62: 今日から使おうSmalltalk

第26回Smalltalk勉強会

stファイルでの保存プロジェクト名,クラス名またはメソッド名で右クリックしファイルアウト

62

Page 63: 今日から使おうSmalltalk

第26回Smalltalk勉強会

stファイルの読み込み

開き方ワールドメニュー (World menu)の開く

開く メニューファイル・リスト

ファイル・リストからstファイルを読み込む

63

Page 64: 今日から使おうSmalltalk

第26回Smalltalk勉強会

stファイルの読み込みファイル・リストよりstファイルを指定し,ファイルインする

64

Page 65: 今日から使おうSmalltalk

第26回Smalltalk勉強会

MonticelloFTP,HTTPサーバに保存することが可能

65

Page 66: 今日から使おうSmalltalk

おわりに

66

Page 67: 今日から使おうSmalltalk

第26回Smalltalk勉強会

現在チュートリアル作成中1. Squeakインストール2. Squeakの基本操作3. 基本文法4. クラス定義等5. 基本クラス5.1.Number5.2.Block5.3.Collectionクラス,

イテレータ等5.4.文字列(String)5.5.Stream

6. デバック7. 例外処理8. ツール9. 探索の旅10.スレッド処理11.Morph ?12.パッケージ管理13.Web13.1.Seaside13.2.Iliad13.3.Magma

13.4.JSON, XML14.正規表現15.Traits

他にも要望があればどうぞ

67

Page 68: 今日から使おうSmalltalk

Smalltalkをもっと勉強したい人のために

68

Page 69: 今日から使おうSmalltalk

第26回Smalltalk勉強会

おすすめ参考文献

1) 自由自在Squeakプログラミング

2) Smalltalkで学ぶオブジェクト指向プログラミングの本質

3) Squeak by Example http://www.squeakbyexample.org/

4) Smalltalkイディオム

5) ケント・ベックのSmalltalkベストプラクティス・パターン

書籍

69

Page 71: 今日から使おうSmalltalk

第26回Smalltalk勉強会

MLSqueak-ja http://www.smalltalk.jp/mailman/listinfo/squeak-ja

SML http://www.smalltalk.jp/SML/

Squeak-dev http://lists.squeakfoundation.org/mailman/listinfo/squeak-dev

Pharo http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-users

71