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

  • 会場提供ありがとうございました
  • 解いていた問題5.17と問題5.18をプロジェクタで発表
  • 問題5.17
  • instを3要素に拡張してそこにラベルを格納する方針
  • extract-labelsの中で、命令を取り出すタイミングでラベルを書き込み。あとはmake-new-machineに「ラベルがあったら印字する処理」を追加
(define (update-label-name! insts label-name)
  (if (null? insts)
      '()
      (let ((inst (car insts)))
        (set-cdr! inst (list (cadr inst) label-name))
        insts)))
(define (extract-labels text receive)
  (if (null? text)
      (receive '() '())
      (extract-labels
       (cdr text)
       (lambda (insts labels)
         (let ((next-inst (car text)))
           (if (symbol? next-inst)
               (receive (update-label-name! insts next-inst) ;;←ここ
                        (cons (make-label-entry next-inst insts)
                              labels))
               (receive (cons (make-instruction next-inst)
                              insts)
                        labels)))))))
  • 問題5.18
  • 基本的には問題5.16と同じような処理をmake-registerに追加するだけ
  • 最初、getという内部関数名を使っていたら意味がわからないと怒られた
(define (make-register name)
  (let ((contents '*unassigned*)
        (trace-on? #f))
    (define (display-when-get)
      (if trace-on? (begin (display name)
                           (display ": ")
                           (display contents)
                           (newline))))
    (define set
      (lambda (value)
        (if trace-on? (begin (display name)
                             (display ": old-value = ")
                             (display contents)
                             (display " new-value = ")
                             (display value)
                             (newline)))
        (set! contents value)))
    (define (dispatch message)
      (cond ((eq? message 'get) (display-when-get) contents)
            ((eq? message 'set) set)
            ((eq? message 'trace-on)  (set! trace-on? #t))
            ((eq? message 'trace-off) (set! trace-on? #f))
            (else (error "Unknown request -- REGISTER" message))))
    dispatch))
  • make-new-machineのメッセージ処理はこんな感じ↓
((eq? message 'register-trace-on)
 (lambda (name) ((lookup-register name) 'trace-on)))
((eq? message 'register-trace-off)
 (lambda (name) ((lookup-register name) 'trace-off)))
  • フィボナッチでは同じ値を代入する処理が思いのほか多かった
  • 組み込みなどでメモリ・デバイスの速度がボトルネックの場合には、こういう場合は代入を行わないようにするとか
  • 「この読書会は恵まれている」(佐野さん)
  • たしかに一人で読むのはつらい本
  • この本にはチューター役と生徒役が必要。どんなに人数が少なくなってもその役割分担は保たれていると思った