I don't control class creation.
I need to make a wrapper around make-object and attach contract to the wrapper.

Now I have
(provide/contract
  [ read-object ( ->i ([ binary-class ( implementation?/c binary<%> )]
                         [ port input-port? ])
                        #:rest [ args list? ]
                        [ result ( binary-class ) ( is-a?/c binary-class )])])

I cannot control number of args. Now, when error encountered I have confusing 
error message mentioning "instantiate".

Thu, 5 Jun 2014 12:13:26 -0400 от Matthias Felleisen <matth...@ccs.neu.edu>:
>
>Here is the pattern I recommend: 
>
>Welcome to Racket v6.0.1.11.
>> (define (create-c #:x [x 0]) (new c% [x x]))
>> (define c% (class object% (init-field x) (super-new)))
>
>That is, a class comes with a 'factory' definition, a function that creates 
>instances and uses keywords similar to those used by the class initializer. If 
>you then export these factories, you can enforce invariants and also probe the 
>factory for the information you want: 
>
>> (create-c)
>(object:c% ...)
>> (create-c #:x 10)
>(object:c% ...)
>> (procedure-arity create-c)
>0
>> (procedure-keywords create-c)
>'()
>'(#:x)
>
>
>Yes, one could argue that this is a poor man's substitute for missing class 
>reflection. -- Matthias
>
>
>
>
>
>
>On Jun 5, 2014, at 11:32 AM, Roman Klochkov < kalimeh...@mail.ru > wrote:
>
>> For any procedure I can use procedure-arity. But how to get the number of 
>> init arguments for a class?
>> 
>> Or maybe there are any other way to make a contract, like in Guide 7.3.9, 
>> where one can compare number of arguments and arity of the function, but 
>> when using (make-object someclass ...)
>> instead of the function.
>> 
>> 
>> -- 
>> Roman Klochkov
>> ____________________
>>  Racket Users list:
>>  http://lists.racket-lang.org/users
>


-- 
Roman Klochkov
____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to