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 でスライド作ろ。