見出し画像

Retro-gaming and so on

RE: プログラミング学習日記 2022/12/14〜

星田さんの記事に対するコメント。

もう一度big-bangのおさらいを。

big-bangは本質的にはループ構文だ。Schemeで言う名前付きlet、あるいは他の言語で言うwhileと変わらない。
特にGUIに絡むループをイベントループと呼んだりするけど、イベントループ用の構文がbig-bangなんだ。
そして重要なのは、REPLのreadprintに当たる部分もbig-bangが内包出来る。
REPLのreadに当たる部分がマクロon-key(あるいはゲームパッドを前提にするならon-pad)、そしてprintに当たる部分がto-drawになる。

つまり、原則的に、REPLで

(print (eval (read)))

と書くトコを、big-bangだと

(big-bang 環境情報
 (on-key 入力関数)
 (to-draw 出力関数))

と書く事になる。
で、入力関数がeval(world-go)を呼び出すように書けば、big-bang自体が直接eval(world-go)を呼び出さなくても構わない、と言う事になる。

で、だ。
まずは入力関数。
CLIの場合は、基本、大雑把にreadに頼ればいいんだけど、big-bangを使ったゲームの場合は、自分で入力関数を作らないとならない。
でもその雛形はRacketのマニュアルに書いてある。


キーボードの全キーをマッピングしていくのは現実的じゃないんで、選択肢候補、例えば1とか2とかを判定して、その時の情報をeval(world-go)に送るように書けばいいです。
そして、上の例でも書かれている通り、入力関数は環境情報と入力されたキーを引数に取る二引数関数として書かないといけない。
それだけ気をつけておけばいい。

eval(world-go)は環境情報を返すように設計する。そうすれば、中にeval(world-go)を含んだ入力関数は結果環境情報を変更するわけ。それを自然とbig-bangが拾ってくれるんで、big-bangの環境情報が更新される。そしてその情報を元にしてto-drawが画像を更新してくれるわけ。
一見ややこしく思うだろうけど、CLIでのREPLでも細かくは

(print (eval (read 環境情報) 環境情報))

と書いたりするんで、結果やってる事は変わんない。
んで、星田さんが書いたコードは恐らく、evalがいくつか設定されてると思うんだ。帳尻合わせる為に改造が若干必要になるとは予想してるんだけど、入力関数から呼び出すworld-goは、原則

(define (world-go w input)
 (cond ((条件1) battle-eval)
    ((条件2) shop-eval) ...

みたいにクロージャを返す関数になるんじゃないか、と思う。
そもそも、big-bang自体が、内包するマクロに手渡す関数はクロージャの形式になってるんで、そこだけは工夫が必要になるかな?
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「RE: プログラミング学習日記」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事