第185回 素人くさいSICP読書会(at 三田某所)
- 会場提供ありがとうございました
- 間違えて月島に行った人が約1名
- 佐野さんがSchemeバトンで苦しんでいるのを横目に黙々と問題5.19を解いていました
- 問題5.19
- 先週書いた「命令列にブレークポイントを書き込む関数」がきちんと動作することを確認
- search-labelでラベルを検索し、見つかったらset-bpでオフセットの位置のブレークポイント(instの4要素目)を書き換え
(define (write-breakpoint-to-insts insts label n bp) (define (set-bp insts i) (if (null? insts) (error "Out of range -- BREAKPOINT" label n) (let ((inst (car insts))) (if (= i 1) (set-cdr! (cddr inst) (list bp)) (set-bp (cdr insts) (- i 1)))))) (define (search-label insts) (if (null? insts) (error "Label not found -- BREAKPOINT" label n) (let ((inst (car insts))) (if (eq? (caddr inst) label) (set-bp insts n) (search-label (cdr insts)))))) (search-label insts)) (define (set-breakpoint-to-insts insts label n) (write-breakpoint-to-insts insts label n (cons label n))) (define (reset-breakpoint-to-insts insts label n) (write-breakpoint-to-insts insts label n #f))
- 次にinstのコンストラクタとアクセサを4要素対応に書き換え
- make-new-machineにブレークポイントの追加機能とブレークポイントがあったら停止する処理を追加。とりあえずブレークポイントで止まるところまで確認してタイムアップ
【追記】
よく見ると
(set-cdr! (cddr inst) (list bp))
とかむごいな。
(set-car! (cdddr inst) bp)
だろJK。というか、あとでちゃんとinstに対するセッターを定義しました