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