为什么Datomic在迭代时连续两次产生相同的临时ID?

0dB*_*0dB 2 clojure datomic

这将生成两个不同的ID,这很棒:

#db/id[:db.part/user]
#db/id[:db.part/user]
Run Code Online (Sandbox Code Playgroud)

但是类似下面的内容(我到目前为止尝试过很多想法)会产生两次相同的id,这不是我想要的:

(repeatedly 2 (fn [] #db/id[:db.part/user]))
(for [n [1 2]] #db/id[:db.part/user])
Run Code Online (Sandbox Code Playgroud)

所有产生的东西都像

(#db/id[:db.part/user -1000774] #db/id[:db.part/user -1000774])
Run Code Online (Sandbox Code Playgroud)

每个呼叫产生的号码相同.

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

有任何想法吗?

为了清楚起见,文档说,"每次调用tempid都会产生一个独特的临时ID."

[在@maxthoursie评论后编辑,无论如何repeat都会遇到这个问题.]

Leo*_*hin 5

使用

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

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