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

Exercise 2.4

ええと、以下な試験で bintree 確認。

(use gauche.test)

(add-load-path ".")
(load "bintree")

(define tree-a (interior-node 'a (leaf-node 2) (leaf-node 3)))
(define tree-b (interior-node 'b (leaf-node -1) tree-a))
(define tree-c (interior-node 'c tree-b (leaf-node 1)))

(test-start "bintree")
(test-section "bintree")
(test* "tree-a"
       '(interior-node a (leaf-node 2) (leaf-node 3))
       tree-a)

(test* "tree-b"
       '(interior-node b (leaf-node -1)
		       (interior-node a (leaf-node 2) (leaf-node 3)))
       tree-b)

(test* "tree-c"
       '(interior-node c
		       (interior-node b 
				      (leaf-node -1)
				      (interior-node a
						     (leaf-node 2)
						     (leaf-node 3)))
		       (leaf-node 1))
       tree-c)
       

(test-end)

これって bintree-to-list ってしなくっても良い気がするんですが、とりあえず cases 使う形で手続き書いてみます。まず以下が実装。leaf-sum のパクリ。

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

(define bintree-to-list
  (lambda (tree)
    (cases bintree tree
	   (leaf-node (datum) (list 'leaf-node datum))
	   (interior-node (key left right)
			  (cons 'interior-node
				(list key 
				      (bintree-to-list left)
				      (bintree-to-list right)))))))

最初

	   (leaf-node (datum) (cons 'leaf-node datum))

ってしてて試験にパスせず。試験が以下です。

(use gauche.test)

(add-load-path ".")
(load "bintree")
(load "bintree-to-list")

(define tree-a (interior-node 'a (leaf-node 2) (leaf-node 3)))
(define tree-b (interior-node 'b (leaf-node -1) tree-a))
(define tree-c (interior-node 'c tree-b (leaf-node 1)))

(test-start "bintree-to-list")
(test-section "bintree-to-list")
(test* "tree-a"
       '(interior-node a (leaf-node 2) (leaf-node 3))
       (bintree-to-list tree-a))

(test* "tree-b"
       '(interior-node b (leaf-node -1)
		       (interior-node a (leaf-node 2) (leaf-node 3)))
       (bintree-to-list tree-b))

(test* "tree-c"
       '(interior-node c
		       (interior-node b 
				      (leaf-node -1)
				      (interior-node a
						     (leaf-node 2)
						     (leaf-node 3)))
		       (leaf-node 1))
       (bintree-to-list tree-c))
       

(test-end)

さ、Tex でスライド作ろ。