`recursive-contract` is really just a `delay` that that contract
system knows how to implicitly `force`.

Sam

On Thu, Aug 24, 2017 at 2:54 PM, David Storrs <david.sto...@gmail.com> wrote:
>
>
> On Thu, Aug 24, 2017 at 2:22 PM, Sam Tobin-Hochstadt <sa...@cs.indiana.edu>
> wrote:
>>
>> I think this is roughly what you want:
>>
>>
>> #lang racket
>>
>> (define/contract (safe-hash-set h  . args)
>>     (->* (hash?) () #:rest (letrec ([c (recursive-contract (or/c null?
>> (cons/c any/c (cons/c any/c c))))]) c) hash?)
>>     ...)
>>
>> (safe-hash-set (hash) 1)
>>
>> Sam
>
>
> Thanks, Sam.  I'll need to do some reading on recursive-contract to make
> sense of this, but I appreciate the pointer.
>
> Dave
>
>>
>>
>> On Thu, Aug 24, 2017 at 2:08 PM, David Storrs <david.sto...@gmail.com>
>> wrote:
>> > I'd like to be able to write a function that makes it easy to set one or
>> > more keys in a hash, without worrying about whether the hash is mutable
>> > or
>> > not.  It could be called in any of the following ways:
>> >
>> > (define imm-h (hash 'a 1))
>> > (define mut-h (make-hash '((a . 1))))
>> >
>> > (safe-hash-set imm-hash 'x 2)       ; returns (hash 'a 1 'x 2)
>> > (safe-hash-set imm-hash 'x 2 'y 7) ; returns (hash 'a 1 'x 2 'y 7)
>> >
>> > (safe-hash-set mut-hash 'x 2)        ; returns (begin (hash-set! mut-h
>> > 'x 2)
>> > mut-h)
>> > (safe-hash-set mut-hash 'x 2 'y 7)  ; returns (begin (hash-set! mut-h 'x
>> > 2)
>> > (hash-set! mut-h 'y 7) mut-h)
>> >
>> > This definition isn't quite what I need:
>> > (define (safe-hash-set h  . args)
>> >     (->* (hash?) () #:rest (non-empty-listof any/c) hash?)
>> >     ...)
>> >
>> > I want to be able to say "the rest argument is a list that has an even
>> > number of elements and more than zero elements", but I'm not sure how to
>> > capture that.  Thoughts?
>> >
>> > Dave
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "Racket Users" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an
>> > email to racket-users+unsubscr...@googlegroups.com.
>> > For more options, visit https://groups.google.com/d/optout.
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Racket Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to racket-users+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to