Это репост вопроса, который я задал в группе Datomic google (см. здесь - последние 3 поста лучше).
Эта проблема связана с тем, что я динамически генерирую запросы Datomic. Таким образом, количество параметров (имен и значений) неизвестно до тех пор, пока они не будут переданы в функцию. Я могу сгенерировать запрос просто отлично. Основная проблема заключается в том, что с помощью Clojure Datomic API я не могу вызвать функцию datomic.api/q с динамическим числом аргументов. Таким образом, приведенное ниже выражение ~@unquote-splice не работает. Я попробовал несколько других подходов, в том числе частично и применить, но безрезультатно.
(def expression-final `(datomic.api/q ~expression-intermediate ~db-conn ~@param-values)) ;; gives the error in question
(eval expression-final)
java.lang.Exception: processing rule: (q__34868 ?e)
at datomic.datalog$eval_rule$fn__4687.invoke(datalog.clj:977)
at datomic.datalog$eval_rule.invoke(datalog.clj:957)
at datomic.datalog$eval_query.invoke(datalog.clj:999)
at datomic.datalog$qsqr.invoke(datalog.clj:1053)
at datomic.datalog$qsqr.invoke(datalog.clj:1021)
at datomic.query$q.invoke(query.clj:453)
at datomic.api$q.doInvoke(api.clj:31)
... 1 stack levels elided ...
at user$eval34866.invoke(crud_spec.clj:32)
... 3 stack levels elided ...
at stefon_datomic.crud$retrieve_entity.invoke(crud.clj:95)
...
Caused by: java.lang.Exception: processing clause: [?e :posts/title (quote ?title)] ;; this fails with or without the (quote ...)
at datomic.datalog$eval_clause$fn__4667.invoke(datalog.clj:934)
at datomic.datalog$eval_clause.invoke(datalog.clj:900)
at datomic.datalog$eval_rule$fn__4687.invoke(datalog.clj:972)
at datomic.datalog$eval_rule.invoke(datalog.clj:957)
...
Caused by: java.lang.UnsupportedOperationException: nth not supported on this type: Symbol
... 2 stack levels elided ...
at datomic.datalog$extrel_coll$fn__4384.invoke(datalog.clj:197)
... 4 stack levels elided ...
at datomic.datalog$iterator.invoke(datalog.clj:30)
Мне интересно, является ли это ошибкой в Datomic Clojure API? Или если есть более простой способ передать динамическое количество переменных. Жесткое кодирование количества передаваемых переменных противоречит цели динамической генерации запроса. См. последние 3 сообщения здесь, чтобы получить более подробную информацию.
Спасибо
(def invoke-query (partial apply d/q))
с(invoke-query '[:find ?e :in $ ?title :where [?e :posts/title ?title]] [(d/db conn) "Post-Title!"])
- person Leon Grapenthin   schedule 09.09.2013(crud/retrieve-entity conn {:content-type "c/t" :title "t"})
или(crud/retrieve-entity conn {:content-type "c/t"})
. - person Nutritioustim   schedule 09.09.2013