@uents blog

Code wins arguments.

SICP 読書ノート#78 - 5.5 翻訳系(3) (pp.360-362)

今回は「5.5.6 文面アドレス」から。

5.5.6 文面アドレス

「文面」とはlexicalの直訳のよう。

これまでの評価機は変数の値を探す際に、実行時にenvフレームを 都度探索していたので、それなりに計算コストがかかっていたはず。

Schemeはレキシカルスコープなので、コンパイル時にアドレッシングを済ませといて コンパイル時環境(compile-time environment)として管理できれば、 実行時の変数探索のための計算コストを省けて、最適化できるのでは? というお話だと思う。

で、練習問題を解こうと思ったけど、手元のソースコードでは 環境フレームを以下のようにRacketのHash Tableで作り変えていたため、 そのままではアドレッシングの実装ができない。

(define (make-frame vars vals)
  (let ((frame (make-hash)))
    (map (lambda (var val) (hash-set! frame var val))
         vars vals)
    frame))

(define (extend-environment vars vals env)
  (with-handlers
      ([exn:fail? (lambda (exn)
                    (error "extend-environment: arguments error:"
                           vars vals))])
    (cons (make-frame vars vals) env)))

;; ...

環境フレームの実装をSICPのテキスト通りに戻すと set-car!set-cdr!を使う必要が出てくるので、 R5RSモードに切り替えてmutable pairsを使えるようにしたが、 今度はレジスタ計算機シミュレータの方に影響が出てうまく動かない。

RacketでSICPをやるとやっぱここがいちばん辛いな、と改めて思う。 最初から全部 #lang r5rs でやれば良かったのかもしれない。

http://docs.racket-lang.org/r5rs/r5rs-mod.html

これ以上頑張って直す元気もないので、あきらめて次に進みます。残念..


※「SICP読書ノート」の目次はこちら