Do you control the writing of objects to a port? If so, check out 'serialization.' If not, I don't think I can help you. Sorry -- Matthias
On Jun 5, 2014, at 12:29 PM, Roman Klochkov <kalimeh...@mail.ru> wrote: > 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