Datomic 中的数据库函数,特别是事务数据库函数,对于保持一致性很是有用。在文档中的例子是用 edn 来写的。象这样:html
;;add a transaction function called add-doc [{:db/id #db/id [:db.part/user] :db/ident :add-doc :db/fn #db/fn {:lang "java" :params [db e doc] :code "return list(list(\":db/add\", e, \":db/doc\", doc));"}}]
其中的引号还要 Escape,实在有些不顺眼。好在 datomic 的 Clojure API 提供了 function 函数:java
(def add-doc "Add document to an entity" (d/function {:lang "clojure" :params '[db e doc] :code '[[:db/add e :db/doc doc]]}))
这样实现的好处不仅是使用 ' 来创造 quote 的代码,它的另外一个玄机在于它返回了一个真正的函数!这个 add-doc 是能够在你的本地代码上调用的,这让单元测试数据库函数成为可能。数据库
将这个函数安装到数据库:ide
[{:db/id #db/id [db.part/user] :db/doc (-> #'add-doc meta :doc) ;重用上面的文档 :db/fn add-doc}]