Hello. I have a project where I am needing to represent vectors (in the
mathematical sense), points, and colors. Both the vectors and points will
be 3D. I'm having trouble knowing what's an idiomatic way to represent and
interact with data types that are similar but different.
In general, I could simply all represent them with a list or vector (in the
Racket sense). So I could have:
(define (vector i j k) #(i j k))
(define (point x y z) #(x y z))
Then I could readily use the existing vector functions, such as vector-map
without having to define my own. But I don't super like this because I have
to define my own accessor functions like vector-i and point-y and also
don't get predicates like vector? for free.
Another way is that I could use structs, but then I'm stuck implementing
things myself and across the structs. To avoid the latter point, I could
use pattern matching. So something like:
(struct vector (i j k))
(struct point (x y z))
(define (tuple-map proc tuple)
(match tuple
[(struct vector (i j k)) (vector (proc (vector-i tuple))
(proc (vector-j tuple))
(proc (vector-k tuple)))]
[(struct point (x y z)) (point (proc (point-x tuple))
(proc (point-y tuple))
(proc (point-z tuple)))]
[(struct color (r g b)) (color (proc (color-r tuple))
(proc (color-g tuple))
(proc (color-b tuple)))]))
But of course, this map doesn't take multiple tuples. And this feels
awkward, because I'll need to implement other things, like fold. Map and
fold would be used in defining new operators on vectors and points, like
addition, normalization (for vectors only), etc.
The ideal thing would be that I could define a struct for these types, that
had the accessor functions like vector-i and predicates likes vector? but
was actually represented by a vector (in the Racket sense) underneath the
hood. Does something like this exist in Racket (not classes please).
In F#, I did this same thing using F#'s records for the vector, point, and
color data types, and they inherited an ITuple interface (F#'s immutable,
functional data types can implement interfaces). Can Racket's stucts
inherit from interfaces? Is there something I can do with generics?
Thanks for any help on this design.
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/racket-users/8214d59a-d6de-445f-b203-b0a2b8c374cdn%40googlegroups.com.