Thanks very much Michael and Jonas.

On Monday, 4 March 2013 07:20:24 UTC, Jonas wrote:
>
> Hi
>
> You can use the tempid (
> http://docs.datomic.com/clojure/index.html#datomic.api/tempid) function 
> to generate new temporary ids.
>
> Jonas
>
> On Monday, March 4, 2013 8:50:56 AM UTC+2, edw...@kenworthy.info wrote:
>>
>> Okay, I think I understand that.
>>
>> Does that mean this code could never work as intended in a Clojure 
>> program, only at the repl (which seems a bit of a limitation) or is there a 
>> way to make it work as intended, generating a different id each time? Or is 
>> the whole approach taken in this code flawed?
>>
>> On Sunday, 3 March 2013 21:59:45 UTC, Michał Marczyk wrote:
>>>
>>> #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 clo...@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+u...@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+u...@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