1. I am stumped. I don't know how to write a contract for my-send. 

2. I see what you want to do and I think you should seriously consider a 
different protocol: 

(define (get-vector this)
  (vector (send this get-x) (send this get-y))) 

For something like get-vector, I'd create a contract constructor that ensures 
its argument is an object with a get-x and a get-y method. I'd use a contract 
constructor because I suspect you want contracts for more than get-vector. This 
could also be lifted into syntax so that you can generate the contract 
constructor for classes like this. And you might equip the contract constructor 
with more specific constraints for its arguments and return values. 

-- Matthias






On Dec 28, 2013, at 2:43 AM, Alexander D. Knauth <alexan...@knauth.org> wrote:

> The problem isn't with defining the function, the problem is with making a 
> contract for it.  
> 
> I can define the function fine, I just don't know how to write a contract for 
> it.  I used make-keyword-procedure to define the function, but is there 
> something like make-keyword-procedure-contract?  I could write my own error 
> code, but it would be better if I could express it as a contract.  
> 
> The actual concrete example is that I'm making my own version of send that 
> works with method-like procedures.  
> 
> #lang racket
> 
> (define/contract current-send-object (parameter/c (or/c object? #f))
>   (make-parameter #f))
> 
> (define my-send
>   (make-keyword-procedure
>    (lambda (kws kw-args object proc . rest-args)
>      (parameterize ([current-send-object object])
>        (keyword-apply proc kws kw-args rest-args)))))
> 
> (define point%
>   (class object%
>     (super-new)
>     (init-field [x 0] [y 0])
>     (define/public (get-x) x)
>     (define/public (get-y) y)))
> 
> (define (get-vector)
>   (let* ([object (current-send-object)]
>          [x (send object get-x)]
>          [y (send object get-y)])
>     (vector x y)))
> 
> (define p (new point% [x 3] [y 5]))
> 
> (require rackunit)
> 
> (check-equal? (my-send p get-vector)
>               (vector 3 5))
> 
> (check-equal? (my-send p (compose vector->list get-vector))
>               (list 3 5))
> 
> that way you can define new "methods" without them being specified by the 
> class, and they're first class functions.  I wanted to be able to make a 
> contract for my-send (and my-send/apply etc.) that would check that object is 
> an object and that proc is a procedure, but still take arbitrary keyword 
> arguments and just pass them on to proc.  
> 
> On Dec 27, 2013, at 1:03 PM, Matthias Felleisen wrote:
> 
>> 
>> This is a bit vague. Can you clarify the question with a concrete example? 
>> 
>> 
>> On Dec 26, 2013, at 7:45 PM, "Alexander D. Knauth" <alexan...@knauth.org> 
>> wrote:
>> 
>>> I want to make contracts on some apply-like functions that check some 
>>> arguments but just passes all the others (including keyword arguments) on 
>>> to a function (provided as an argument).  If there weren't any keyword 
>>> arguments, I could use a rest argument to do this, but that wouldn't work 
>>> with keyword arguments.  Is there a way to do something like a rest 
>>> argument for keyword-arguments in a contract?____________________
>>> Racket Users list:
>>> http://lists.racket-lang.org/users
>> 
> 


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

Reply via email to