1. I would hope that some generics might help here. 
2. I see a need for struct mixins here because meter isn't a refinement per se 
but some 'attribute'. Then you could mixin several different units and I may 
have both m and m-1. 

Data representation not fully thought thru. -- Matthias





On Oct 26, 2013, at 11:26 AM, Laurent wrote:

> How would you represents quantities like 2 kg.m^2/s^-2 with that?
> And how would you convert from mi/h to m/s?
> 
> Anyway, I've started adding in some converters:
> https://github.com/Metaxal/measures/blob/master/converters.rkt
> 
> Some more to come, but I may not be able to work on it for very long for now.
> 
> Laurent
> 
> 
> On Sat, Oct 26, 2013 at 5:05 PM, Matthias Felleisen <matth...@ccs.neu.edu> 
> wrote:
> 
> 
> Wouldn't we want something like this: 
> 
> #lang racket
> 
> (module+ test (require rackunit))
> 
> (struct distance (value) #:transparent) ;; this should be abstract 
> (struct yard distance () #:transparent)
> (struct meter distance () #:transparent)
> 
> ;; distance distance -> distance 
> 
> (module+ test
>   (check-equal? (d+ (yard 1) (yard 2)) (yard 3))
>   (check-equal? (d+ (yard 1) (meter 2)) (meter (+ .9 2)))
>   (check-equal? (d+ (meter 1.8) (yard 1)) (yard (+ 2.0 1)))
>   (check-equal? (d+ (meter 2) (meter 1)) (meter 3)))
> 
> (define (d+ d1 d2) 
>   (match (list d1 d2)
>     [(list (struct yard (value)) (struct yard (value2))) (yard (+ value 
> value2))]
>     [(list (struct yard (value)) (struct meter (value2))) (meter (+ 
> (yard->meter value) value2))]
>     [(list (struct meter (value2)) (struct yard (value))) (yard (+ 
> (meter->yard value2) value))]
>     [(list (struct meter (value)) (struct meter (value2))) (meter (+ value 
> value2))]))
> 
> ;; distance distance-constructor -> distance 
> 
> (module+ test 
>   (check-equal? (conversion (yard 3) meter) (meter (* 3 .9))))
> 
> (define (conversion x d)
>   (match x 
>     [(struct yard (y)) (if (eq? yard d) x (meter (yard->meter y)))]
>     [(struct meter (y)) (if (eq? yard d) (yard (meter->yard y)) x)]))
> 
> 
> ;; auxiliaries 
> (define (yard->meter v) (* .9 v))
> (define (meter->yard v) (/ v .9))
> 
> -- Matthias
> 
> 
> 
> On Oct 26, 2013, at 7:20 AM, Laurent wrote:
> 
>> Ok, so I just hacked together a small lib for handling numbers with unit 
>> symbols and exponents:
>> 
>> Quick example:
>> > (measure->value
>>    (m* '(18 s) 
>>        '(1600 km (h -1))
>>        '(1000 m (km -1))
>>        '(1/3600 h (s -1))))
>> '(8000 m)
>> 
>> You can get it with:
>> $ raco pkg install measures
>> or from the File menu in DrRacket, if you have a recent version of Racket 
>> (strictly > 5.3.6).
>> 
>> Examples and details here:
>> https://github.com/Metaxal/measures
>> 
>> HTH,
>> Laurent
>> 
>> 
>> On Fri, Oct 25, 2013 at 12:51 AM, Alvin Schatte <alvinscha...@skytex.net> 
>> wrote:
>> Is there a library or package that combines numbers and their operations 
>> with dimensions that may be associated with them?
>> Alvin Schatte
>> 
>> ____________________
>>   Racket Users list:
>>   http://lists.racket-lang.org/users
>> 
>> 
>> ____________________
>>  Racket Users list:
>>  http://lists.racket-lang.org/users
> 
> 

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

Reply via email to