[racket] Typed Racket struct with more permissive constructor
On occasion the datatype as constructor does get in the way.
(struct: MyDataType (...))
One needs to export the MyDataType identifier for type declarations. But
entailed is a constructor function and match deconstruction as well. i.e.
I can't provide the type without providing the ctor as well when maybe all
I wanted was the type.
For 95% of all Typed structs: isn't a problem. For the remaining 5% one
wants some sort of detailed control of the ctor function, which leads to
public/private fields, default init values ....
Support for some sort of case-lambda ctors as well as default field values
would go far and avoids potential multiple make-Mytype and new-Mytype.
(struct: Person ([name: String] [age: Integer #default 21]) )
then
(Person "Joe")
(Person "Joe" 35)
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). Also, not using the structure name to create
> instances from their field values now makes me feel dirty. :D
>
> Neil ⊥
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/**users <http://lists.racket-lang.org/users>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20120531/b77d31a0/attachment.html>