[racket] strange behavior with class/c, class, and define/contract---user error or Racket bug?
On Jun 23, 2013, at 1:05 PM, Christopher wrote:
> However, this does NOT work as expected (changed class/c keyword from "field" to "init"):
>
> #lang racket
>
> (define/contract my-string%
> (class/c (init [string-thing string?]))
> (class object%
> (super-new)))
>
> (print (new my-string%))
>
> [running the code produces the following:]
>
> Welcome to DrRacket, version 5.3.4 [3m].
> Language: racket; memory limit: 128 MB.
> (object:my-string% ...)
> >
>
> In other words, when I declare an initialization parameter in the class contract which is absent from the class declaration and is not inherited, I expect a contract violation exception to be raised, similar to the one above for the non-existant field, either on execution of the define/contract clause or later when I try to instantiate the class with new. However, Racket does not complain at all---at neither location.
>
> If Racket does not check that init parameters declared in class/c are actually present in the class itself or one of its superclasses, why does the class/c form allow them to be declared at all? Is it just for documentation?
>
> I appreciate the feedback. Thanks!
init contract clauses are useful to check the initial value:
#lang racket
(define/contract my-string%
(class/c (init [string-thing string?]))
(class object%
(init string-thing)
(super-new)))
(print (new my-string% (string-thing 10)))
As it turns out, the class initialization system is so dynamic in Racket that it is impossible to decide whether a class has an init parameter or an init-field.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20130623/887679fa/attachment.html>