Smalltalk-72で学ぶOOPの原点:サンプルコード「じゃんけんゲーム」(@nrslibさんのSIMULA版を移植)

アラン・ケイの“オブジェクト指向”というアイデアをもとに(非同期処理などいろいろ足りていないながらも──)比較的忠実に実装された1970年代の非常に古いSmalltalk-72で遊んでみるシリーズです(なお最新のSmalltalkについては Pharo などでお楽しみください!)。他の記事はこちらから→Smalltalk-72で学ぶOOPの原点 Advent Calendar 2019 - Qiita


サンプルコード「ローンシミュレーション」(report、demand、payment)の続き)

じゃんけんゲーム

以前、@nrslibさんとSmalltalk-72およびSIMULAの話をした際に、

その流れで即座に作られたSIMULA版(Cimを使用)のじゃんけんゲーム

こちらを比較のためSmalltalk-72に移植させていただきました。

インスタンス変数dispが同名のグローバル変数と被るのでこれをdisplayに変更した以外は、なるべく忠実に再現したつもりですが、ちょっとだけ余計なひねり(後述)を入れています。どうぞあしからず。なお、クラス名を大文字スタートにしていなかったり、変数名等を含めキャメルケースにしなかったのは、Smalltalk-72の他のコードの雰囲気に合わせただけで、言語の制約によるものではありません。いずれも普通に使えますので、お手元で試される際は読みやすいように適宜書き換えてください。

まず、jankenクラスとenglishdisplayおよびjapanesedisplayアクションです。これらの名前はそのまま~dispのままでよかったかと思いますが、先述のインスタンス変数等のdispdisplayに変更するのにあわせてうっかり変えてしまいました。

f:id:sumim:20191227205335p:plain
「janken」「englishdisplay」「japanesedisplay」の定義

Smalltalk-72にはそもそも継承機構が無いため、englishdisplayjapanesedisplayに共通の抽象クラスであるdisplayは定義していません。もしテンプレートメソッドパターンが使われていたら、このシリーズでも取り上げたクラス変数を使ったメソッド(正確にはアクション)の共有テクニックなどを活用しようかとは思っていたのですが、今回はその出番はありませんでした。

そこで“ひねり”を思いついて、この2つはクラス(実際に使うのはそのインスタンス)ではなく、アクション(インスタンス生成能を持たないクロージャーのようなもの)で実装してみました。クラスもそうですが、アクションは名前を書くだけで実行されてしまうので、その本体を変数に代入したり引数として渡す際には参照(#~)で渡さないといけなくなるなど、かえって面倒になったような気もしますがまあよしとしましょう。^^;

呼び出し用のjankengameアクションの定義と実行例はこちらです。

f:id:sumim:20191227210152p:plain
「jankengame」アクションの定義と実行例

実行時に「1」というメッセージを送るとenglishdisplayが、それ以外ではjapanesedisplayが選ばれる挙動は(プログラムの起動方法、オプションをメッセージとして与える等の手段は別にして──)元のSIMULA版と同じです。

シリーズ通して読んでいただいたなら、特に説明は不要かと思いますが、いちいち読んでいられない! and/or 分かりにくいところ等あれば補足しますのでコメント欄やTwitterのメンション、DM等で気軽にリクエストください。

まとめへ続く)