[racket-dev] define-struct exports something to BSL
Nadeem Abdul Hamid <nadeem at acm.org> writes:
> Consider a beginner file with:
> (define-struct boa (name length))
>
> Student writes a template/function with parameter named "a-boa", but
> misspells one occurrence, writing "boa" instead of "a-boa".
>
> (define (feed a-boa)
> (make-boa (boa-name a-boa)
> (boa-length boa)))
>
> Their tests then fail at runtime with:
> boa-length: expects argument of type <struct:boa>; given (make-signature ...)
>
> Why is "boa" as a type visible at all in the student languages? The
> make-signature thing is really confusing, because they recognize it as
> something like a constructor but they don't know what structure it
> corresponds to.
This is my fault: We're working on something called "signatures", which
can take the place of a contract comment, but is instead checked by the
system. For example, one could write for the functions above:
(: make-boa (string number -> boa))
(: boa-name (boa -> string))
(: boa-length (boa -> number))
(: feed (boa -> boa))
^^^
This is why `boa' is available, and why you get output identifying "boa"
as a signature. (Before the introduction of signatures, it would say
"illegal use of syntax" - I'm not sure that's much better.)
The work on signatures is not quite done yet (and undocumented ...), but
we're working hard on completing it in the near future.
--
Cheers =8-} Mike
Friede, Völkerverständigung und überhaupt blabla