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

  • 会場提供ありがとうございました
  • 参加者4名。前回比でなんと2倍ですよ!
  • 事前告知を忘れてて、始まってからあわてて告知メール。すいません
  • 仕事が一段落したのでまたもや一人打ち上げモードでビール。すいません
  • お土産のほやの干物をほやのキャラメルと勝手に勘違い。美味しうございました
  • SFCからの交通機関について
  • 予習で問題5.15と問題5.16を解いていったらそこまで進まなかった
  • 人数が増えると雑談が増えるので進度が落ちる。いいんだけど
  • 問題5.14
  • 終わったと思ってたら、読書会的にはまだ終わってなかったらしい
  • 先週は外部のプログラムでループを回したわけだけど、問題文に「計算機を修正したくなるであろう」とか書いてあるし、どうせなんで計算機を書き換えてみた
  • 要するに、計算機にループを組み込むということです
  • こんな感じ↓
(define fact-machine
  (make-machine
   '(n val continue max-n)
   (list (list '= =) (list '- -) (list '* *) (list '<= <=) (list '+ +))
    '(
      (assign n (const 2))
    fact-entry
      (perform (op initialize-stack))
      (assign continue (label fact-done))
    fact-loop
      (test (op =) (reg n) (const 1))
      (branch (label base-case))
      (save continue)
      (save n)
      (assign n (op -) (reg n) (const 1))
      (assign continue (label after-fact))
      (goto (label fact-loop))
    after-fact
      (restore n)
      (restore continue)
      (assign val (op *) (reg n) (reg val))
      (goto (reg continue))
    base-case
      (assign val (const 1))
      (goto (reg continue))
    fact-done
      (perform (op print-stack-statistics))
      (assign n (op +) (reg n) (const 1))
      (test (op <=) (reg n) (reg max-n))
      (branch (label fact-entry)))))

;(set-register-contents! fact-machine 'max-n 10)
;(start fact-machine)
  • 問題5.15と問題5.16は簡単なんで宿題にした
  • メッセージで呼び出す処理をディスパッチャの中に直書きするか関数として定義するかでちょっとだけ議論