define-datatype.scm (2)
とりあえず define-datatype 手続きからかな、と思い define-syntax なナニを確認してます。
試験を書いてみる。まず最初の
((_ Type-name) (define-datatype:report-error 'define-datatype (string-append "~n There are no variants: ~n ~s.") '(define-datatype Type-name)))
から、試験は以下。
(use gauche.test) (add-load-path ".") (load "define-datatype") (test-start "define-datatype") (test-section "define-datatype") (test* "no variants" *test-error* (define-datatype bintree)) (test-end)
パス。
$ make Testing define-datatype ... passed. $ cat test.log define-datatype.scm version J3 2002-01-02 10:55 Testing define-datatype ======================================================= <define-datatype>-------------------------------------------------------------- test no variants, expects #<error> ==> ok passed. $
次、以下を追加。
(test* "no variants" *test-error* (define-datatype bintree bintree?))
試験パス。
$ make Testing define-datatype ... passed. $ cat test.log define-datatype.scm version J3 2002-01-02 10:55 Testing define-datatype ======================================================= <define-datatype>-------------------------------------------------------------- test no variants, expects #<error> ==> ok test no variants, expects #<error> ==> ok passed. $
ここまでは楽勝なんですが、以降が微妙。
((_ Type-name Type-name? (Variant-name (Field-name Pred?) ...) ...) (begin ;[wdc] (define ignored (define-datatype:datatype-checker®istry-updater 'Type-name '((Variant-name (Field-name Pred?) ...) ...))) ;[\wdc] (define Type-name
上記で ignored に設定されるのが何か、がまだ見えてません。また、それ以降で define されている
- Type-name
- Type-name?
- Variant-name
はそれぞれ syntax-rules でマッチしたシンボルの名前な手続きとして define されるはず、と勝手読み。とりあえず ignored を呼び出したらどうなるのか、というのは上記によれば_define-datatype:datatype-checker®istry-updater_という手続きが何を戻すか、という事に依るという事で確認。
順に見てみると、まず Type-name が symbol じゃないと NG 判定か。以下な試験を書いてみた。
(test-section "define-datatype:datatype-checker®istry-updater") (test* "The data type name isn't an identifier" *test-error* (define-datatype "bintree" bintree? (leaf-node (datum number?)) (interior-noe (key symbol?) (left bintree?) (right bintree?))))
で make してみたら微妙な結果。
$ make Testing define-datatype ... failed. discrepancies found. Errors are: test The data type name isn't an identifier: expects #<error> => got #<undef> $ cat test.log define-datatype.scm version J3 2002-01-02 10:55 Testing define-datatype ======================================================= <define-datatype>-------------------------------------------------------------- test no variants, expects #<error> ==> ok test no variants, expects #<error> ==> ok <define-datatype:datatype-checker®istry-updater>---------------------------- test The data type name isn't an identifier, expects #<error> ==> ERROR: GOT #<undef> failed. discrepancies found. Errors are: test The data type name isn't an identifier: expects #<error> => got #<undef> $
微妙な割り込みから復帰。これって ignored を参照? ってか実行したら、という事?
む、ignored ってアレだな、こんなカンジでナニ。
(define define-datatype:reset-registries 'ignored) (define define-datatype:is-a-type? 'ignored) (define define-datatype:datatype-checker®istry-updater 'ignored) (define define-datatype:case-checker 'ignored)
これって手続きとして呼び出されたら ignored という手続きが呼び出されるはず。てーコトは試験としては以下が妥当?
(test* "The data type name isn't an identifier" *test-error* (begin (define-datatype "bintree" bintree? (leaf-node (datum number?)) (interior-noe (key symbol?) (left bintree?) (right bintree?))) (ignored)))
試験してみたら
$ make Testing define-datatype ... passed. $ cat test.log define-datatype.scm version J3 2002-01-02 10:55 Testing define-datatype ======================================================= <define-datatype>-------------------------------------------------------------- test no variants, expects #<error> ==> ok test no variants, expects #<error> ==> ok <define-datatype:datatype-checker®istry-updater>---------------------------- test The data type name isn't an identifier, expects #<error> ==> ok passed. $
パスしてますな。明日とか明後日も時間が取れそうなんで色々確認してみます。