#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.


Reply via email to