Howto Pass In Datomic функции (для Clojure API)

Используя Clojure Datomic APi, у меня есть архитектура, в которой я хотел бы передать транзакционную функцию для выполнения. Однако попытка вызвать переданную транзакционную функцию не работает. Repl распознает его как символ. И он оценивает, но данные не передаются, и будущее не возвращается, то есть, нет возвращенного идентификатора транзакции.

Однако напрямую звонит (datomic.api/transact conn [adatom]) работает как положено. Как я могу заставить работать сценарий?

(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 ответ

Решение

Не очень понятно, что вы пытаетесь сделать. Например:

  • почему бы не позвонить 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 {}}>

Убедитесь, что у вас есть действующее соединение (например, вы подключены [к нужной базе данных]), и база данных есть.

Другие вопросы по тегам