Clojure 为什么Datomic在迭代时一行两次生成相同的临时ID?

Clojure 为什么Datomic在迭代时一行两次生成相同的临时ID?,clojure,datomic,Clojure,Datomic,这将产生两个不同的ID,这很好: #db/id[:db.part/user] #db/id[:db.part/user] 但是像下面这样的任何东西(到目前为止我尝试了很多想法)都会产生两次相同的id,这不是我想要的: (repeatedly 2 (fn [] #db/id[:db.part/user])) (for [n [1 2]] #db/id[:db.part/user]) 都会产生类似的结果 (#db/id[:db.part/user -1000774] #db/id[:db.par

这将产生两个不同的ID,这很好:

#db/id[:db.part/user]
#db/id[:db.part/user]
但是像下面这样的任何东西(到目前为止我尝试了很多想法)都会产生两次相同的id,这不是我想要的:

(repeatedly 2 (fn [] #db/id[:db.part/user]))
(for [n [1 2]] #db/id[:db.part/user])
都会产生类似的结果

(#db/id[:db.part/user -1000774] #db/id[:db.part/user -1000774])
每次通话产生的号码相同

我真正想要的是这些调用根本不产生一个数字,这样我就可以通过事务添加生成的数据

有什么想法吗

说得很清楚,“每次对tempid的调用都会产生一个唯一的临时id。”


[在@maxthoursie评论后编辑,
repeat
在任何情况下都会有此问题。]

因为repeat重复调用id一次所得到的值

反复使用

参见

使用中的示例

(require '[datomic.api :as d])
(repeatedly 2 #(d/tempid :db.part/user))
;; => (#db/id[:db.part/user -1000118] #db/id[:db.part/user -1000119])

考虑一下。。。读卡器宏意味着当读取表达式时,它们的值将被解析,而这自然只发生一次。使用#。。。仅当您正在写入文本事务数据(如模式)时才执行宏。使用datomic.api/tempid在运行时生成tempid。

Thx,我忘了这一点。但是,我们还没有到那里,我可能不得不使用实际的有问题的代码来回答我的问题,因为
(重复2(fn[].\db/id[:db.part/user])和
(for[n[12].\db/id[:db.part/user])
都会产生类似于
(db/id[:db.part/user-1000774].\db/id[:db.part/user-1000774])的结果,生产的号码是相同的。好的,对不起。在您链接到的文档中看到了这样的文本:“如果给定的临时id在给定的事务中被多次使用,那么所有实例都映射到相同的实际实体id。”我想这就是问题所在。但我对datomic了解太少,无法提供解决方案,谢谢。只是偶然发现了其中显示的代码示例。