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&registry-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&registry-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&registry-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&registry-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&registry-updater>----------------------------
test The data type name isn't an identifier, expects #<error> ==> ok
passed.
$

パスしてますな。明日とか明後日も時間が取れそうなんで色々確認してみます。