[racket] Typed Racket struct with more permissive constructor
On Thu, May 31, 2012 at 12:21 PM, Neil Toronto <neil.toronto at gmail.com> wrote:
> On 05/31/2012 09:50 AM, Sam Tobin-Hochstadt wrote:
>>
>> On Thu, May 31, 2012 at 11:42 AM, Neil Toronto<neil.toronto at gmail.com>
>> wrote:
>>>
>>> Currently, the floating-point bitmap type is defined so that its size
>>> fields
>>> are Integer, and a guard assures that they're really Nonnegative-Fixnum:
>>>
>>> (struct: flomap ([values : FlVector]
>>> [components : Integer]
>>> [width : Integer]
>>> [height : Integer])
>>> #:transparent
>>> #:guard
>>> (λ (vs c w h name)
>>> (with-asserts ([c nonnegative-fixnum?]
>>> [w nonnegative-fixnum?]
>>> [h nonnegative-fixnum?])
>>> [...] ; elided length check on vs
>>> (values vs c w h))))
>>>
>>>
>>> What I'd *really* like, though, is to have the fields be
>>> Nonnegative-Fixnum
>>> in the first place, and simply have a more permissive constructor. Is
>>> there
>>> a way to do that? As it is, `flomap-components' always returns an
>>> Integer,
>>> but no flomap instance can actually have an integer-valued `components'
>>> field.
>>
>>
>> Could you just structure the program this way?
>>
>> (struct: flomap ([values : FlVector]
>> [components : Nonnegative-Fixnum]
>> [width : Integer]
>> [height : Integer])
>> #:transparent)
>>
>> (: make-flomap : FlVector Integer Integer Integer -> flomap)
>> (define (make-flomap v c w h)
>> (with-asserts ... (flomap v c w h)))
>
>
> I could, but `make-flomap' is already defined and used extensively (it's an
> analogue of make-flvector).
You should be able to fix this with a `rename-out', presumably.
> Also, not using the structure name to create
> instances from their field values now makes me feel dirty. :D
I'm not sure I can help with that. ;)
--
sam th
samth at ccs.neu.edu