第181回 素人くさいSICP読書会(at 三田某所)

  • 会場提供ありがとうございました
  • 参加者3名。いつも通り
  • orkenさんが問題5.15と問題5.16を解いたとのことなので答合わせ
  • まあ、誰が書いてもだいたい同じになりますね
  • 両方の答が入ったコードはこれ
  • 問題5.15
  • make-new-machine内にカウンタ用の変数を用意してexecuteの際にインクリメント
  • 表示&リセット用のメッセージ処理をmake-new-machineのディスパッチャ内に書いて、大域用関数インタフェースを用意
  • リセットのset!の戻り値が表示されちゃうので自分は'clearedを返すようにした
  • orkenさんはリセットを先にやるとか言ってたんだけど、それだとカウントとして0が表示されるような気がしてきた。どういうことなのか来週聞いてみよう
  • 問題5.16
  • traceの状態を表すフラグを作って、フラグのオンオフを行うメッセージを実装するだけ
  • traceがオンのときのみexecuteの際に命令を印字
  • フラグの名前を「trace-on?」にしたら、変数名に?を付けるのはきもいと言われた。自分的には条件判定の意味がわかりやすくなると思うんだけど。このあたりは好みの問題
  • 問題5.17
  • 先週、議論した通りに実装したら動かず
  • assembleの結果を見る限り、動かないはずないんだけど、なぜかexecuteの段階で怒られる
  • リスト処理を間違えてるんじゃね?とか言われてさんざん試してみたんだけど、ミスってるようにも見えない
  • 家に帰って夜中までいろいろ試したんだけど改善せず
  • で、寝て起きたらあっさり解けた
  • instsにラベルの情報を付加するところを非破壊的にやろうとしてたのが間違いの元だったらしい。consセルの接続がおかしくなってたと思われ
  • update-insts!の流儀に従ってinstsにラベル情報を付加するようにした。具体的には、instを3要素の構造に固定することにし、instのコンストラクタで3要素目(ラベル名)にダミーの空リストを設定。update-label-name!という破壊的な関数を作って、instsにラベル情報を付加する際には3要素目を破壊的に書き換えるようにした
  • これさえ通るようになれば、あとはinstがラベル名を持ってたら表示するようにするだけ
  • 無事に動いた