EoPL reading (61) 2.2 An Abstraction for Inductive Data Type

2.2.2 節突入。例示されているソレ達を順に色々確認。
まず以下を作ってみましたが、どんな試験を書いたものやら。

(add-load-path ".")
(load "definie-datatype")

(define-datatype expression expression?
  (var-exp
   (id symbol?))
  (lambda-exp
   (id symbol?)
   (body expression?))
  (app-exp
   (rator expression?)
   (rand expression?)))

上記に沿って (lambda (x) (f (f x))) がどうなるか、を検討。これは図示されてるんで楽かな、と言いつつ以下?

(lambda-exp x (app-exp (var-exp f) (app-exp (var-exp f) (var-exp x))))

一応図とは合致してますな。あと Exercise-2.6 も以下にリストのみ。

(app-exp (lambda-exp a (app-exp (var-exp a) (var-exp b))) (var-exp c))

で、次に例示されてる occurs-free? を試験する手続きを探す旅に出てました。検索すりゃ良いのに自分ブログを一日づつ見てた。(を
# 薄いのか濃いのか自分でも分からん

occurs-free?

ええと、元の実装が以下。

(define occurs-free?
  (lambda (var exp)
    (cond ((symbol? exp) (eqv? exp var))
	  ((eqv? (car exp) 'lambda)
	   (and (not (eqv? (caadr exp) var))
		(occurs-free? var (caddr exp))))
	  (else (or (occurs-free? var (car exp))
		    (occurs-free? var (cadr exp)))))))

あら、今度の実装の方が簡易になってるな。これは正に lisp/scheme の力なナニですな。On Lisp だと_アーチ_って表現してたような。下地にあるコードが確かにナニ。
で、試験のコードを探したんですが、面倒臭いけど理解度をナニするため自分でもっかい試験書いてみる事に、と言いつつ、へろへろで以下。

(use gauche.test)

(add-load-path ".")
(load "define-datatype")
(load "expression")
(load "occurs-free")

(test-start "occurs-free?")
(test-section "var-exp")
(test* "not occurs free (var-exp)"
       #f
       (occurs-free? 'x '(var-exp y)))
(test* "occurs free (var-exp)"
       #t
       (occurs-free? 'y '(var-exp y)))

(test-section "lambda-exp")
(test* "occurs free (lambda-exp)"
       #t
       (occurs-free? 'y '(lambda-exp x (var-exp y)))) 

(test-end)

続きは明日。