えちょ記

語らないブログ

チェーントークをデフォルトとして設計せよ

案を思いついてから数日推敲したが特に問題は思いつかなかったのでここにメモをしておく。

チェーントークの概念

SHIORI的にいうと、1回のリクエストでは終わらずに、2回以上のリクエストに分割して会話を成立させるのがチェーントーク。昔ながらのプログラムだと直前の状態をグローバル変数に維持した上で次のトークを特別な処理でつなげる必要があるので割と面倒。

継続という概念

なお、この手の実装を簡単に行えるプログラム的手法として「継続」というものがある。最近のプログラム言語で使われる「yield」という処理。コルーチンとも、ジェネレータとも言う。プログラムの記述的には「続いて」書いてるけど、実際の処理では「yield」が現れるたびに処理が中断され、そこから続きを再開できるように動く。「特別な処理」の記述を言語側で肩代わりしてくれるのでとっても便利。

チェーントークを継続で書くとすれば

さ:こうなったら電源切り替えてやる!
エ:だめ〜〜!
yield;    // ここで一旦トーク終了

エ:えーと‥‥。
さ:‥‥。
エ:電源を抜いた瞬間、止まってしまったようです。
さ:‥‥。

どこのネタなのかは気にしないように。まあ、yield;に続けて続きを書くだけ、という風に記述できれば楽だよね、ということ。だがこの場合、逆に普通のランダムトークはどうなるの?特殊なコトしないとだめ?という事になる。

じゃあ普通の会話はどうなのか

チェーンしない会話とは、考え方を変えると、「yield」のたびにランダムに次の場所にジャンプするチェーントーク、に他なら無い。たとえば「yield random」とキーワードがあれば、次の再生場所をシャッフルしますよ、という実装。大筋として、栞のトーク辞書は頭っから終わりまで、上から下にトークが流れる構造でも、全く問題ない。根本が継続で処理が動くのであれば、「次のトークを開始するときにランダム(あるいは一定のフィルタなどに基づく条件選択)ジャンプ」で良いのだ。

ということで

チェーントークさえ処理できればSHIORIは成立する。それも恐らく、デベにとって非常に辞書が書きやすくわかりやすい実装となるはずだ。継続さえ可能であれば、トーク辞書は本質的に、グローバルでフラットな構造で問題ない。
‥‥まあまだ妄想だ!いつもの妄想だ!!ということでとりあえずメモなのだ。