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

見出しが長い。そりゃ良いんですが、

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

で tree-a に

(interior-node 'a (leaf-node 2) (leaf-node 3))

がセットされてる件について手続き定義を確認。
定義としては define-datatype が define-syntax されてる部分の以下なあたりと見た。

       (define Variant-name
         (let ((expected-length (length '(Field-name ...)))
               (field-names '(Field-name ...))
               (pred-names '(Pred? ...))
               (preds (list (lambda (x) (Pred? x)) ...)))
           (lambda args
             (if (not (= (length args) expected-length))
               (define-datatype:report-error 'Variant-name
                 (string-append
                   "Expected ~s arguments but got ~s arguments."
                   "~n  Fields are: ~s ~n  Args are: ~s.")
                 expected-length (length args) '(Field-name ...) args))
             (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)
             (cons 'Variant-name args))))

引数の数と、例えばこの例であれば

(define-datatype bintree bintree?
  (leaf-node
   (datum number?))
  (interior-node
   (key symbol?)
   (left bintree?)
   (right bintree?)))

の interior-node のそれぞれの引数と対になった述語なチェックにパスすれば、いっちゃん最後で

             (cons 'Variant-name args))))

してるのか。述語な手続きも別途確認してみます。あと、チェックな試験もしてみた方が良いな。ってか、

(interior-node 'a (leaf-node 2) (leaf-node 3))

なリストにオブジェクトが云々、ではないのかどうなのか。