Featured image of post 【目次】PerlとMooでダイス言語を作ってみよう(全8回)

【目次】PerlとMooでダイス言語を作ってみよう(全8回)

Perl と Moo で TRPG のダイス記法 (2d6+3) を解釈するインタプリタを作る全8回の連載。目次を兼ねた案内板で、読む回の選び方と各回の内容をまとめています。

2d6+3 のようなダイス記法の文字列を読み取り、実際にダイスを振って結果を返すインタプリタを、Perl と Moo で作る全8回の連載です。ダイスを振るだけの小さなクラスから始め、計算式を足して if/else が破綻するところまで体験してから、式をオブジェクトの木で表す設計に組み替えます。最終回で「ここまで作ったのが Interpreter パターンだった」と名前がつきます。

このページは目次を兼ねた案内板です。初めてなら「読み方」から、いま if/else だらけの式の処理に困っているなら「困りごとから探す」から選んでください。

対象読者

「Mooで覚えるオブジェクト指向プログラミング」シリーズを読了した方、または Moo でクラスを定義し、has 属性とメソッドが書ける方を対象としています。

読み方

  • 通して読む: 第1回から順に。コードは前の回の続きなので、動かしながら進めるなら順番どおりが確実です
  • if/else の増殖に困っているなら: 第2回で問題を、第3回から第5回で解き方を読めば要点がつかめます
  • Interpreter パターンの名前と対応表が目的なら: 第8回から読み、気になった所だけ前の回に戻れます

全8回

  1. 2d6 を解釈して振りたい。まず最小の Dice クラスを作る【Moo】
  2. 2d6+3 に対応したら if/else の嵐になる。複雑さの正体を整理する【Perl】
  3. 数値とダイスをオブジェクトにして、eval メソッドで評価させる【Moo】
  4. 足し算を AddExpr クラスにする。左辺と右辺を再帰で評価する【Moo】
  5. 式クラスに eval を書き忘れても気づけない。Moo::Role で約束を強制する【Moo】
  6. 引き算と掛け算を足したい。既存クラスは1行も直さない【Moo】
  7. 文字列 2d6+3 から式ツリーを自動で組み立てる。パーサーを作って完成させる【Perl】
  8. ここまで作ってきた設計の名前は Interpreter パターンだった【Moo】

困りごとから探す

計算式を足すたびに if/else が伸びる

  • 第2回 — 加算を足しただけで、正規表現と分岐が組み合わせの数だけ増える
  • 第3回 — 数値とダイスを別のクラスに分けて、評価を各クラスに任せる
  • 第4回 — 足し算を左辺と右辺を持つクラスにして、式を木で表す

演算を足すたびに既存コードを触りたくない

  • 第6回 — 引き算と掛け算を、既存クラスに手を入れずに足す(OCP)
  • 第5回 — 新しい式クラスが守るべき約束を Moo::Role で書いておく

文字列の式を読み取って評価したい

  • 第1回 — 「NdM」形式を読み取ってダイスを振るところから
  • 第7回 — 文字列から式ツリーを組み立てるパーサー

仕組みに名前をつけて整理したい

  • 第8回 — GoF の Interpreter パターンの登場人物と、ここまでの実装の対応

関連シリーズ

Composite パターンを学ぶと、Interpreter パターンの抽象構文木がより深く理解できます。

comments powered by Disqus
システム開発・AIワークフローのご相談は Meetsource へ
Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。