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

ええと、Variant-name な手続きが error になるケイスの試験を書いてみます。
まず、引数の数をチェックしてるので以下を追加。

(test* "Expected 3 arguments but got 0 arguments"
       *test-error*
       (interior-node))
(test* "Expected 3 arguments but got 1 arguments"
       *test-error*
       (interior-node 'a))
(test* "Expected 3 arguments but got 2 arguments"
       *test-error*
       (interior-node 'a (leaf-node -1)))
(test* "Expected 3 arguments but got 4 arguments"
       *test-error*
       (interior-node 1 2 3 4))

test.log が以下。

test Expected 3 arguments but got 0 arguments, expects #<error> ==> ok
test Expected 3 arguments but got 1 arguments, expects #<error> ==> ok
test Expected 3 arguments but got 2 arguments, expects #<error> ==> ok
test Expected 3 arguments but got 4 arguments, expects #<error> ==> ok

あるいは

             (for-each
               (lambda (a f p pname)
                 (if (not (p a))
                   (define-datatype:report-error 'Variant-name "~n Bad ~a field (~s ~s) ==> #f."
                     f pname a)))
               args
               field-names
               preds
               pred-names)

な部分の試験。以下 3 つを追加。

(test* "Bad key field (symbol? 1)"
       *test-error*
       (interior-node 1 (leaf-node 2) (leaf-node 3)))
(test* "Bad left field (bintree? 1)"
       *test-error*
       (interior-node 'a 1 (leaf-node 3)))
(test* "Bad right field (bintree? 2)"
       *test-error*
       (interior-node 'a (leaf-node 2) 2))

試験パス。

test Bad key field (symbol? 1), expects #<error> ==> ok
test Bad left field (bintree? 1), expects #<error> ==> ok
test Bad right field (bintree? 2), expects #<error> ==> ok

述語な手続きはこれから見ます。しかしこうして見るに define-syntax とか強力だな。