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))
なリストにオブジェクトが云々、ではないのかどうなのか。