如何传递Datomic函数(适用于Clojure API)

时间:2013-09-02 16:40:36

标签: database clojure datomic

使用Clojure的Datomic APi,我有一个架构,我想通过 transact 函数来执行。但是,尝试调用传入的 transact 函数不起作用。 repl将其识别为符号。它进行了评估,但没有提交任何数据,也没有返回任何未来,这意味着没有返回的事务ID。

但是,直接调用 (datomic.api/transact conn [adatom]) ,按预期工作。如何让abouve场景有效?

(defn some-fn[conn mapped-fn adatom] 

  (datomic.api/transact conn [adatom])  ;; works 
  #_(mapped-fn conn [adatom]) ;; does not work - evaluates, but no data committed, no future returned, meaning, no returned transaction ID
)

谢谢

1 个答案:

答案 0 :(得分:1)

目前还不是很清楚你要做什么。例如:

  • 为什么不在d/transact内拨打some-fn
  • mapped-fn一个将应用于许多事实的函数(在这种情况下它是d/transact)?
  • 什么是整体意图?

只是盲目地按照你的例子,确实有效并返回“未来”:

user=> (use '[datomic.api :only (db) :as d])
nil
user=> (d/create-database "datomic:mem://unsure-db")
false
user=> (def c (d/connect "datomic:mem://unsure-db"))
#'user/c
user=> (defn f [conn mapped-fn fact] (mapped-fn conn fact))
#'user/f
user=> (f c d/transact [])
#<promise$settable_future$reify__4526@2da07336: {:db-before datomic.db.Db@8835fddc, :db-after datomic.db.Db@6e2a2e78, :tx-data [#Datum{:e 13194139534313 :a 50 :v #inst "2013-09-03T15:23:34.977-00:00" :tx 13194139534313 :added true}], :tempids {}}>

确保您拥有有效的连接(例如,您已[连接到正确的数据库]),并且数据库已存在。