今回は,Smalltalkの入門について.Simulaはどうしたといわれそうなタイトルだな.まあ,僕の中ではSmalltalkが始祖なんだって.
なんで,Smalltalkって思う人もいるかもしれないんだけど,オブジェクト指向について考えててぶつかったからなんだよね.(「オブジェクト指向における再利用のためのデザインパターン」を読んでるせいもある.)オブジェクト指向の始祖であるSmalltalkのオブジェクト指向ってのが,いま主流のC++とかJavaとかのクラスベースオブジェクト指向とJavaScriptとかSelfとかのプロトタイプベースオブジェクト指向のどちらとも違うってところでね.だけど,どこが違うとかの情報がなくて,どう違うのかがいまいちピンとこないから,実際に書いてみればわかるはずだってことで,Smalltalk入門ってなわけだ♪
処理系は,MacPortsで,GNU Smalltalkをインストール.(MacPortsを$ sudo port selfupdateしてからインストールしよう.なんか,アップデート前はIntel Macに対応してないとかで,インストールできなかった・・・.)
$ sudo port -c install gst
とりあえず,起動,Hello, world!,終了をやってみた.
$ gst
GNU Smalltalk ready
st> 'Hello, world!' printNl(「Hello, world!」文字列オブジェクトにprintNlメッセージを送信する.)
'Hello, world!'(表示結果.)
'Hello, world!'(評価結果の戻り値.)
st> ObjectMemory quit(終了方法.)
$
Hello, world!は,ほとんど普通の言語と同じだねぇ・・・.普通の言語は述語,主語の順だけど,Smalltalkは主語,述語の順ってかんじだね.
さてと,つぎはお約束の階乗計算プログラム♪っていつもなら軽いノリで書くんだけど,Smalltalkのプログラミングはかなり苦戦した〜.その苦戦したソースをどうぞw
Integer extend [
factorial [
self = 0 ifTrue: [ ^1 ].
self > 0 ifTrue: [ ^(self - 1) factorial * self ].
]
]
10 factorial printNl.
これは,既存のIntegerクラスを拡張して,factorialメソッドを追加する(実際は,factorialメソッドが存在するのでオーバライドになる.)という意味.末尾の10 factorial printNlでメッセージ送信をしてて,10っていうIntegerインスタンスへfactorialメッセージを送信し,その結果にprintNlメッセージを送信しているってかんじ.10は,factorialメソッドでいうところのselfになって,再帰されるようなね,そんな感じだと思う・・・たぶん・・・.
実行結果は当然普通だ.
$ gst factorial.st
3628800
$
Smalltalkって言語と環境ってこともあるせいか,処理系によって方言がある模様.ってかそもそも,Smalltalkのシステムブラウザから追加するもんだから,GNU Smalltalkは独自の記述に近いのね・・・.悩ましいなぁ.それに,GNU Smalltalkで解説してるとこってほとんどないんだね.やっぱり,Squeakが多いみたい.まだまだわからないことだらけだなぁ・・・.
FizzBuzzもやってみたけど,ひどいな・・・.
| fizzbuzz |
fizzbuzz := [
(1 to: 100) do: [ :n |
n \\ 3 = 0 ifTrue: [
n \\ 5 = 0 ifTrue: [
'FizzBuzz' printNl.
] ifFalse: [
'Fizz' printNl.
].
] ifFalse: [
n \\ 5 = 0 ifTrue: [
'Buzz' printNl.
] ifFalse: [
n printNl.
].
].
].
].
fizzbuzz value.
無理矢理4つに分岐させるようなコードを書いたかんじ.Smalltalkerはこれをどうやって書くんだろう.まだまだ理解不足だね.
うむぅ.不出来すぎるんで,Squeak本読んで出直してこよう・・・.Smalltalkの考え方についていけてない.必要なのは,オブジェクト脳っていうよりSmalltalk脳?
参考文献:
GNU Smalltalk User's Guide
Smalltalkイディオム
