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.
____________________
Racket Users list:
http://lists.racket-lang.org/users