[racket] Typed Racket struct with more permissive constructor

From: Sam Tobin-Hochstadt (samth at ccs.neu.edu)
Date: Thu May 31 12:57:37 EDT 2012

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


Posted on the users mailing list.