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
これ以上頑張って直す元気もないので、あきらめて次に進みます。残念..