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