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 なナニに書きかえてみれば良いのかな。結構直感的に書けそげ。とりあえず晩遅いので明日ヤリます。完全に自分用メモになってるが、それ系のツッコミはスルーって事で。