[plt-scheme] Documentation inconsistencies? [was: Create new inspector hierarchies?]
Thanks! Being able to create custom inspection facilities is
interesting.
In the MzScheme documentation section 4.4 paragraph about the structure
type property guards, it says: "The list contains the values that
struct-type-info would return for the new structure type if it skipped
the current-inspector control check". I am curious about the
implications of this skip of the current-inspector control check so I
made the below code, and by doing so I think I might have found some
documentation inconsistencies:
1) In my code below, `be-sneaky' does not get access to the
super-struct-type, but if the current-inspector control check is skipped
when making the list of values given to the `prop:sneaky' property
guard-proc, shouldn't this list's value for the super-struct-type be
`struct:s' because the current-inspector control check was skipped?
2) Exploring #1 further, I made `hmm' and found that in the list of the
values from struct-type-info, the init-field-k and auto-field-k values
are not consistent with the documentation, which says these values are
the number of fields "not counting fields created by its ancestor
types", because the print-out shows these values are counting ancestor
fields.
(module A mzscheme
(define-struct S (a b))
(provide (struct S ())))
(module B mzscheme
(require A
(lib "struct.ss")
(lib "match.ss"))
(define-values (prop:sneaky prop:sneaky? prop:sneaky-accessor)
(make-struct-type-property
'sneaky
(λ (ignored type-info)
type-info)))
(define-struct/properties (sub-S S) ()
([prop:sneaky 'ignored]) #f)
(define (be-sneaky ss)
(match-let ([(name init-k auto-k accessor mutator immutable-k super skipped?)
(prop:sneaky-accessor ss)])
(struct-type-info super)))
(define (hmm ss)
(printf "(struct-type-info struct:sub-S) => ~s\n"
(call-with-values (λ () (struct-type-info struct:sub-S)) list))
(printf "(prop:sneaky-accessor ss) => ~s\n" (prop:sneaky-accessor ss)))
(provide
(struct sub-S ())
be-sneaky
hmm))
(require B)
(define ss (make-sub-S 1 2))
(hmm ss)
(be-sneaky ss)
;; print out:
(struct-type-info struct:sub-S) => (sub-S 2 -2 #<primitive:sub-S-ref> #<primitive:sub-S-set!> () #f #t)
(prop:sneaky-accessor ss) => (sub-S 2 -2 #<primitive:sub-S-ref> #<primitive:sub-S-set!> () #f #t)
;; error:
struct-type-info: expects argument of type <struct-type>; given #f
--
: Derick
----------------------------------------------------------------