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

Reply via email to