第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))

【追記】
よく見ると
(set-cdr! (cddr inst) (list bp))
とかむごいな。
(set-car! (cdddr inst) bp)
だろJK。というか、あとでちゃんとinstに対するセッターを定義しました