EoPL reading (68) 2.2 An Abstraction for Inductive Data Type
自宅メイン端末が修理に出てて Exercise 1.31 の実装が無い、って思ったら今使ってる端末にディレクトリがある模様。ちょっとラッキー。
Exercise 1.31 の実装が以下。
(define (lexical-address exp) (define (lexical-address-inner rslt dict l) (cond ((null? l) rslt) ((symbol? l) (let f ((d 0) (p 0) (dict dict)) (cond ((null? dict) `(,l free)) ((memq l (car dict)) (let f-inner ((p p) (dict (car dict))) (if (eq? l (car dict)) `(,l : ,d ,p) (f-inner (+ p 1) (cdr dict))) )) (else (f (+ d 1) 0 (cdr dict)))))) ((eqv? (car l) 'lambda) (lexical-address-inner (append rslt `(lambda ,(cadr l))) (cons (cadr l) dict) (cddr l))) ((eqv? (car l) 'if) (lexical-address-inner (append rslt '(if)) dict (cdr l))) (else (let g ((rslt rslt) (l l)) (cond ((null? l) rslt) (else (g (append rslt (list (lexical-address-inner '() dict (car l)))) (cdr l))))) ) ) ) (lexical-address-inner '() '() exp) )
メインな環境が無い、というのは痛いですが記録がある、ってのは嬉しい。今回のケイスでは予備環境に記録が残ってたのでラッキーだったんですが、該当ログに微妙な情報しか残ってなくって若干困り気味でした。
まず、これを expression なナニに書きかえてみれば良いのかな。結構直感的に書けそげ。とりあえず晩遅いので明日ヤリます。完全に自分用メモになってるが、それ系のツッコミはスルーって事で。