Exercise 2.11 (3)

ええと、gosh な REPL で問題の手続きを評価してみると同じ形で例外エラー。中身を見てみると以下な記述を発見。

		   (primapp-exp (prim rand1 rand2)
				(primapp-exp (subst rand1) (subst rand2)))))))

これなのかな、ということで修正して再確認してみると Error ではなくなりましたがまだ試験にはパスしてません。つうか置換してない風。
これはやはり occurs-free? が微妙なのかorz

と思ったら

そもそもの考えかたがダウトな事が判明。これ、どうするべきなのかな。ってようやくスタートラインに、なのかorz
以下はそのまんまで良いのか。

  (var-exp (id)
    (if (eqv? id subst-id) subst-exp exp))

で、lambda な式の id で subst-exp の中身と同じ symbol なナニがあれば fresh-id で云々なのかな。fresh-id.scm を見てみるに enum-ids ってのが定義されてます。
つうかこれって

(lambda (p) (+ p x))

の x を (* p 3) と置換する場合は

(lambda (p0) (+ p0 (* p 3)))

で、

(lambda (q) (+ q x))

の x を同様に置換するのであればそのまま

(lambda (q) (+ q (* p 3)))

ってことだったのですが、body を lambda-calculus-subst に食わせる必要があるのかどうか。例えば

  (lambda-exp (id body)
    (if (eqv? id subst-id)
      (let ((newid (fresh-id body id)))
        (lambda-exp newid (lambda-calculus-subst body id newid)))
      (lambda-exp id (subst body))))                 

てカンジで。でもこれで再帰的にバッティングしてる場合に何とかなるようには見えないな。

時間切れ

続きは明日以降、なのかどうか。