¿Por qué Datomic de producir el mismo ID temporal dos veces en una fila cuando la iteración?
Pregunta
Esto va a producir dos diferentes números de identificación, lo cual es genial:
#db/id[:db.part/user]
#db/id[:db.part/user]
pero nada como el siguiente (he intentado un montón de ideas hasta el momento), se producirá el mismo id dos veces, que no es lo que quiero:
(repeatedly 2 (fn [] #db/id[:db.part/user]))
(for [n [1 2]] #db/id[:db.part/user])
Todos dan algo como
(#db/id[:db.part/user -1000774] #db/id[:db.part/user -1000774])
donde el número generado es el mismo para cada llamada.
Lo que yo realmente quiero es que las llamadas a NO producir un número, así que sólo puedo añadir el producido de datos a través de una transacción.
Alguna idea?
Para ser claros, la documentación dice, "Cada llamada a tempid produce un único id temporal."
[Editado después de comentario por @maxthoursie que repeat
sería tener este problema, en cualquier caso.]
Solución
Uso
(require '[datomic.api :as d])
(repeatedly 2 #(d/tempid :db.part/user))
;; => (#db/id[:db.part/user -1000118] #db/id[:db.part/user -1000119])
Considere la posibilidad de que #...están lector de macros lo que significa que su valor será resuelto cuando la expresión se lee lo que naturalmente sucede sólo una vez.Usar el #...macro sólo cuando usted está escribiendo literal de los datos de la transacción (como un esquema).Uso datomic.api/tempid para generar tempids en tiempo de ejecución.
Otros consejos
Porque repetir se repite el valor que recibió de identificador de llamada una vez.
Utilizar en varias ocasiones en su lugar.
Consulte los ejemplos en http://clojuredocs.org/clojure_core/clojure.core/repeatedly