アラン・ケイの“オブジェクト指向”というアイデアをもとに(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72で遊んでみるシリーズです(なお最新のSmalltalkについては Pharo などでお楽しみください!)。他の記事はこちらから→Smalltalk-72で学ぶOOPの原点 Advent Calendar 2019 - Qiita
(サンプルコード「ローンシミュレーション」(report、demand、payment)の続き)
じゃんけんゲーム
以前、@nrslibさんとSmalltalk-72およびSIMULAの話をした際に、
smalltalk と Simula 67 を触りたいんだけど
— nrs (@nrslib) 2019年9月24日
Simula 67 はやっぱり実行環境は手に入らないか
SIMULA は、SIMULA I(Smalltalk-72 は主にこちらに影響を受けた)は無理っぽいですが、SIMULA 67 については Cim という処理系(Cへのトランスパイラ)があるようです https://t.co/TouFOZYI17 こちらとかがお手軽かと→https://t.co/QmxQJ1p3Kc
— sumim (@sumim) 2019年9月24日
その流れで即座に作られたSIMULA版(Cimを使用)のじゃんけんゲーム
昼休み、早速 Simula で遊んでる
— nrs (@nrslib) 2019年9月25日
引数により結果表示が英語になったり日本語になったりするジャンケン作ったんだけど、ホントいわゆるクラスベースのオブジェクト指向プログラミング言語だなーhttps://t.co/YWSOpGzzYB
こちらを比較のためSmalltalk-72に移植させていただきました。
インスタンス変数disp
が同名のグローバル変数と被るのでこれをdisplay
に変更した以外は、なるべく忠実に再現したつもりですが、ちょっとだけ余計なひねり(後述)を入れています。どうぞあしからず。なお、クラス名を大文字スタートにしていなかったり、変数名等を含めキャメルケースにしなかったのは、Smalltalk-72の他のコードの雰囲気に合わせただけで、言語の制約によるものではありません。いずれも普通に使えますので、お手元で試される際は読みやすいように適宜書き換えてください。
まず、janken
クラスとenglishdisplay
およびjapanesedisplay
アクションです。これらの名前はそのまま~disp
のままでよかったかと思いますが、先述のインスタンス変数等のdisp
をdisplay
に変更するのにあわせてうっかり変えてしまいました。
Smalltalk-72にはそもそも継承機構が無いため、englishdisplay
とjapanesedisplay
に共通の抽象クラスであるdisplay
は定義していません。もしテンプレートメソッドパターンが使われていたら、このシリーズでも取り上げたクラス変数を使ったメソッド(正確にはアクション)の共有テクニックなどを活用しようかとは思っていたのですが、今回はその出番はありませんでした。
そこで“ひねり”を思いついて、この2つはクラス(実際に使うのはそのインスタンス)ではなく、アクション(インスタンス生成能を持たないクロージャーのようなもの)で実装してみました。クラスもそうですが、アクションは名前を書くだけで実行されてしまうので、その本体を変数に代入したり引数として渡す際には参照(#~
)で渡さないといけなくなるなど、かえって面倒になったような気もしますがまあよしとしましょう。^^;
呼び出し用のjankengame
アクションの定義と実行例はこちらです。
実行時に「1
」というメッセージを送るとenglishdisplay
が、それ以外ではjapanesedisplay
が選ばれる挙動は(プログラムの起動方法、オプションをメッセージとして与える等の手段は別にして──)元のSIMULA版と同じです。
シリーズ通して読んでいただいたなら、特に説明は不要かと思いますが、いちいち読んでいられない! and/or 分かりにくいところ等あれば補足しますのでコメント欄やTwitterのメンション、DM等で気軽にリクエストください。
(まとめへ続く)