EoPL reading (124) 2.3 Representation Strategies for Data Types

なんとなく目が覚めたので続行。
直前エントリで compose-subst の定義を以下って書いてました。

(define compose-subst
  (lambda (s1 s2)
    (if (eqv? 'empty-subst-rec (car s1))
	s1
	(list (car s1) (cadr s1) (caddr s1) s2))))

こちらとどっちが良いんでしょ。

(define compose-subst
  (lambda (s1 s2)
    (if (eqv? 'empty-subst-rec (car s1))
	s1
	(extend-subst (cadr s1) (caddr s1) s2))))

下の方が格好良いカンジではあります。そりゃ良いとして試験を検討。とりあえず car が unify じゃないケイスからか。
てか、unify-term の試験ってきちんと書いてない気がしてきた。なにしてるんだ。
追加した試験が以下。#f を戻すケイスです。

(test* "(unify-terms '((var-term a)) '((app-term ((var-term a)))))"
       #f
       (unify-terms '((var-term a)) '((app-term ((var-term a))))))

(test* "(unify-terms '((app-term ((var-term a))) (var-term a)))"
       #f
       (unify-terms '((app-term ((var-term a)))) '((var-term a))))

(test* "(unify-terms '((constant-term 1)) '((constant-term 2)))"
       #f
       (unify-terms '((constant-term 1)) '((constant-term 2))))

(test* "(unify-terms '((constant-term 1)) '((app-term ((var-term a)))))"
       #f
       (unify-terms '((constant-term 1)) '((app-term ((var-term a))))))

(test* "(unify-terms '((app-term ((var-term x)))) '((constant-term 1)))"
       #f
       (unify-terms '((app-term ((var-term x)))) '((constant-term 1))))

(test* "(unify-terms '((app-term ((var-term x)))) '((var-term s)))"
       #f
       (unify-terms '((app-term ((var-term x)))) '((var-term x))))

残りは以下の部分なんですが

		 (let ((new-ts (subst-in-terms (cdr ts) subst-car))
		       (new-us (subst-in-terms (cdr us) subst-car)))
		   (let ((subst-cdr (unify-terms new-ts new-us)))
		     (if (not subst-cdr)
			 #f
			 (compose-subst subst-car subst-cdr))))))))))

#f を戻すナニを検討するリキは無いッス。