As an experiment, I've written a DSL that generates database queries using *effectively* only the data. The query logic is derived from the data assemblance and choice of data structures (or types). I am at the stage where I have all the logic working, and I am now moving into perf testing and tuning. BUT, before I do, there's this one hack I have implemented that has me asking the this question.
As I wrote the DSL I ran out of data structure types to account for a few defined meanings within the query logic. As a short term hack I decided to attach meta data to symbols where the meta data contained a data value along with, for example, a sort option. I only intended for this to be short term until I got around to figuring out the semantics of Clojure's deftype or defrecord. Here's the hack: (defn object [v m] (let [id (gensym #"object#")] (with-meta id (merge m {:default v :id id})))) (defn object? [o] (if-let [it (meta o)] (if (= (it :id) o) true false) false)) (defn inspect ([o] (inspect o nil)) ([o & xs] (if-let [it (meta o)] (if (= (:id it) o) (if-let [x (first xs)] (if (coll? x) (select-keys it x) (x it)) it))))) (defn instance ([o] (instance o nil)) ([o & args] (if-let [it (meta o)] (if (= (:id it) o) (if-let [x (:default it)] (if (fn? x) (if-let [args (or (and (some identity args) args) (it :args))] (apply x args) (x)) x) it))))) => (def o (object #(java.util.UUID/randomUUID){:sort '>}) object#24397 => (object? o)) true => (instance o) #uuid "3c9cca8b-59e2-46b2-9175-468de3a21a22" => (inspect o :sort)) > So now I've been reading up on Clojure's deftypes & defrecords and while it I expect they are both considered the right tool for the job, everything I read seems like overly complicated bloat code compared to my hack. Am I missing something? Is this a case where you wouldn't be caught dead using the above hack? Why or why not? As I see it: I'm not creating and/or holding millions of objects that would need to be shared, altered or held onto. These have relatively short lives that only serve in compiling to a different query language. Type hints or java interop really shouldn't matter. Notes: 1. While the above function names may carry OO concepts, these functions are not intended to fulfil all of them them; rather they only fill a specific functionality gap that appears to meet my needs. 2. I realize one wouldn't sort on a UUID, it's just an example to show the functionality. :) Thanks, Tim -- -- 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/groups/opt_out.