#db/id ... is a "tagged literal". It gets read in as an id object with some integer inside. The way this happens is that the reader looks up a "data reader" function associated with the symbol db/id in the map held by the var *data-readers* and passes to it the result of parsing the rest of the literal (a vector holding the keyword :db.part/db in this case). Importantly, this function is not pure and the integer it uses will be different on each invocation. (Given this form of the #db/id literal; you can also specify a particular number yourself -- #db/id [:db.part/db some-number-here].)
In any case, once the reader reads in your code including some particular id, the compiler will compile the result preserving the particular values it sees, so it will embed code to construct *exactly this* id in the compiled output. Thus you end up with a particular id hardwired into the first version of your function. With the second version, if you invoke it multiple times at the REPL, you ask the reader for a new id at each invocation, so it works as you expect. If instead you were to use it inside a function like so: (defn foo [] (make-column-schema #db/id [:db.part/db] :results/subject :db.type/string)), then again the same id would be used for every (foo) call. Cheers, Michał On 3 March 2013 21:58, <edw...@kenworthy.info> wrote: > So, I am studying a piece of code from the web. I've dissected most of it > and am in the process of re-factoring it. > > What I don't understand is why one version works and the other doesn't. > > So for both: > > (ns gcse-results.core (:use [datomic.api :only [q db] :as d]) (:use > quil.core)) > > This doesn't work: > > (defn make-column-schema [db-ident db-type] > {:db/id #db/id[:db.part/db] > :db/ident db-ident > :db/valueType db-type > :db/cardinality :db.cardinality/one > :db.install/_attribute :db.part/db}) > > Each call to: > > (make-column-schema :results/subject :db.type/string) > > The value of #db/id[:db.part/db] is the same. > > And this works: > > (defn make-column-schema [db-id db-ident db-type] > {:db/id db-id > :db/ident db-ident > :db/valueType db-type > :db/cardinality :db.cardinality/one > :db.install/_attribute :db.part/db}) > > Each call to: (make-column-schema #db/id[:db.part/db] :results/subject > :db.type/string) > > The value of #db/id[:db.part/db] is the different, as expected. > > Now I thought that I understood #db/id[:db.part/db] (call to a Java > constructor) but obviously my understanding is flawed as I would expect both > of these functions to produce the same thing, but they don't so there's > obviously some gap in my understanding. > > Help? > > -- > -- > 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. > > -- -- 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.