Algebraic data types are exactly what I'm looking for, actually. I think I'll try something like that.
On Saturday, 5 March 2016 16:28:22 UTC-8, Bobby Eickhoff wrote: > > Note also that I'm giving each Zone "object" it's own :type property. > That's how I'm able to dispatch on the type. It also plays well with > multimethods. > > On Saturday, March 5, 2016 at 7:26:27 PM UTC-5, Bobby Eickhoff wrote: >> >> It sounds like what you're describing is (structurally) an algebraic data >> type, i.e. a generic type with specific variants. I've been able to do >> something like this in my own projects. Here I'm considering Zone the >> general type and each variant is Zone:Hand, Zone:Deck, &c. >> >> (def Zone:Hand >> ...) >> >> (def Zone:Deck >> ...) >> >> (def Zone >> (s/conditional >> #(= (:type %) :Hand) Zone:Hand >> #(= (:type %) :Deck) Zone:Deck >> ...)) >> >> Does that help? >> >> On Saturday, March 5, 2016 at 6:58:31 PM UTC-5, JvJ wrote: >>> >>> I've been using Schema, and there's a kind of type definition that I'm >>> having trouble with. I'm not sure exactly how to describe it, so I'll >>> provide an example. >>> >>> I'm working on a digital card game in which there are numerous zones >>> that a card may be in. Each card needs to know which zone it is in, and >>> there may be additional information depending on the zone. >>> >>> For instance, if a card is in a player's hand, no additional information >>> is required. However, if the card is on the board, it needs to understand >>> its position on the board. >>> >>> I have the following definition for zone types: >>> >>> (def Zone >>> "A schema for referring to the various game zones." >>> (s/enum :Hand >>> :Deck >>> :Board >>> :Field >>> :Discard >>> :Void)) >>> >>> I want to define a different schema type for each of these, and then >>> define a zone spec: >>> >>> (def ZoneSpec {(required-key :zone-type) Zone >>> :data <zone data corresponding to the zone type >>> specified earlier> >>> }) >>> >>> I want to ensure that whichever data is provided specified the schema >>> associated with the zone type. >>> >>> Is there a way to do this? >>> >>> Thanks. >>> >> -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.