Smalltalkに馴染むのに有用かなと思う、1つの小咄(a small talk.)


1980年代トークができると、幅広い上の年代に受けるよ、という処世術的な意味で、新人プログラマ応援ネタにてエントリー。あと、教育向けのSmalltalk環境がユニコードにガチ対応したら 楽しそうだなと思ったので、絵文字カテゴリーーの方にも.. ᗧ....(文字コード依存注意 ><)

バック・トゥ・ザ・フューチャー

「コロン語(?)」たちについてこんなことを書いた。ついでに、伝説の、かつ現役のオブジェクト指向言語のSmalltalkの名著「Squeak入門―過去から来た未来のプログラミング環境」をアマゾンにて1円でポチした。

sq

  • [目次]
    • 1 バック・トゥ・ザ・フューチャー-Squeak物語
    • 2 Smalltalk初心者のためのSqueak入門
    • 3 Morphic入門:SqueakのGUIフレームワーク
    • 4 Squeakの国のAlice
    • 5 Squeakでネットワーキング
    • 6 Squeakオブジェクトエンジン早分かり
    • 7 その後のバック・トゥ・ザ・フューチャー

届いた本の冒頭20ページほど読んだところで、ふと思いあたった。
Smalltalkのオブジェクト指向って、Objectが主体の動的言語だってことなんだ、と。
Smalltalk実行環境は、Objectが主体的に動き回れる言語環境だな、と。

小咄「Packman......:」

Squeak/Pharo等の現代Smalltalkは、1980年に発表されたSmalltalk-80を源流とする。

1980年といえば,一世を風靡した古典ゲーム「パックマン」が発表された年。
ゲーマーのジョイスティックさばきにより主体的に動き回るパックマン。
このイメージは、Smalltalkのメッセージ重視のオブジェクト指向にふさわしいのでは。

パックマンを知らない世代向けの余談 :

そう、(少なくとも1コーダー/1ゲーマー視点)では『SmalltalkはPacman』なのだ。

...man??男。

いやpack.manとかPackManとかの二語ではなくて、SmalltalkとかGodと同じく一語で固有名詞の「Pacman」。下の黄色いのがパックマンね。どうみても性別なし。
sq
gifの出典 http://gif-anime.seesaa.net/article/141547034.html

"pack"って、猟犬の群れとかの意味もあるのね。

そう、Packmanを漢字で書くなら、「猟漢」かな。探検心と漢気(おとこぎ)を併せ持った奴らの固有名詞なわけだ。

... そういえば、google.co.jp/search?q=パックマンで遊べるゲームをグーグルが公開してたわね♪...

閑話休題。
話を戻すと、ある目的(object)をもって生成された主体が、目の前にあるメッセージをひとつひとつ片付けていくPacmanのイメージはSmalltalkのオブジェクトに似つかわしいと考えたわけだ。

Smalltalkのコードで説明しよう:

block.st
aᗧ :=  new.             "クラスᗧからオブジェクトaᗧを生成" 
aᗧ firstName: 'パック' lastName: 'マン' . "オブジェクトaᗧの名前は、パック、マン"

aBatman := 🦇 new.        "クラス🦇からオブジェクトaBatmanを生成"
aBatman firstName: 'バット' lastName: 'マン' . "オブジェクトaBatmanの名前は、バット、マン"

(概説) クラス1から生成されたオブジェクトaᗧが、自身の名前についてのメッセージ firstName:とlastName:とをぱくぱくと受け取る。オブジェクトへのメッセージの区切りである「.(ピリオド)」を受け取ったところで、オブジェクトaᗧの状態は確定する。クラス🦇2の方もおんなじ。

こうしたオブジェクトによる主体的なメッセージの受取りを理解することが、Smalltalkのコードを読む第一歩と見た。

付記

1.Smalltalkにおけるクラスの定義

お風呂で読んだ本に出てきた例にならうとクラスᗧはこんな風にかける。

ᗧ.st
Object subclass #ᗧ
  instanceVariableNames: 'firstName lastName'
  category: 'Game Character'

多言語の人には見慣れない記法だろうけど、まぁ割合と普通だね。
ここに、クラスPacmanとは何者かが書かれていくわけだ。

2.Smalltalkの制御構造ブロック

ブロックとは、Objective-Cでも有名になったいわゆる大カッコ表記の制御構造のこと。
処理単位と思っておけばいいかな。

printit.st
calc := [2 + 3 * 4 -4 / 4 ] . "[]内を右から順にぱくぱくと計算していく"

これを算数として計算すると
calc =(((2 + 3) * 4) -4) / 4
=(20-4) /4
=16 / 4 = 4
となる。

Smalltalkは、パックマン流に、右から一つずつメッセージを解釈していく言語なのだと考え、慣れてしまおう。

3.IfTrue / whileTrue ᗧ ................・

1円本も読み進み、いよいよ、「第四章Squeakの国のアリス」だ。
Smalltalkの実行環境Squeakに,アリスちゃん(a)、ボブくん(b)と一緒に、取り組んでみよう。

まずは条件判断から。

ms.true.st
(a=b)
  ifTrue: [Transcript show: 'アリスもボブもパックマン']
  ifFalse: [Transcript show: 'アリスはミズ☆パックマン、ボブはパックマン。さっそく試着しましょ。']

条件判断の記述も、ブロック使って、いい感じ、..................................・じゃない。。。

ミズ☆パックマンの出典 http://gunp.jp/archives/post_98/

Smalltalk、此処から先はよそ者にとっては、漢の道じゃなくて、茨の道なのかも。
...急ぎませんので、Smalltalkは茨の道じゃないよという解説を、Smalltalkerの方、
お願い致します!

ただ、Lispからclojureが誕生したように、SmalltalkからMs.Smalltalishな良さげな言語が誕生する可能性もあるかなと思っている今日この頃。
思うところの委細は、別の小噺にて :)


  1. ユニコードパックマンのユニコード文字ᗧ(U+15E7) 

  2. ユニコードコウモリのユニコード文字ᗧ(U+1F987)