lookup-variable-value を書き換えてみる (2)
追記せずエントリを改めてみます。この前段なエントリで出てきた手続きをレジスタ計算機の言葉に置き換えれば良い、という事に気がつきました。
現実トウヒを経て色々検討してみるに
(define (lookup-variable-value var env) (define (env-loop env) (define (scan vars vals) (cond ((null? vars) (env-loop (enclosing-environment env))) ((eq? var (car vars)) (car vals))
な部分で手続きを越えて var が使われている部分。set! に至っては val もだったりしています。むむむ、と言いつつ件のエントリを見てみるになんか微妙じゃないか、と。
これってたまたま scheme の使用で set! がセットされた値を戻すからなんとかなってるのかも。ってコトは例えば中の手続きの scan の定義の部分で言えば
(define scan ((lambda (scan-inner) (set! scan-inner (lambda (vars vals) (cond ((null? vars) (env-loop (cdr env))) ((eq? var (car vars)) (car vals)) (else (scan-inner (cdr vars) (cdr vals))))))) '()))
ではなくて
(define scan ((lambda (scan-inner) (set! scan-inner (lambda (vars vals) (cond ((null? vars) (env-loop (cdr env))) ((eq? var (car vars)) (car vals)) (else (scan-inner (cdr vars) (cdr vals)))))) (scan-inner)) '()))
となっている方が可読性は高いのか。自分で作ったにも関わらず、後で見てみたら意味が分からんかった。
閑話休題。lookup な手続きの中で lookup しなきゃいけない問題ですな。
む
なんか前世の記憶が蘇えるが如くに一年ちょい前の記憶が蘇えってまいりました。このあたりが微妙だから問題 5.51 を pending にして EoPL 方面に走ったんだった。
英語が微妙なんですが EoPL 再開の方向で。