Мне нужно создать следующее:Clojureql - не может принимать значение макроса (Clojure)
(clojureql.core/join (clojureql.core/table db :tableA) (clojureql.core/table db :tableA)
(clojureql.core/where (apply and (= :tableA.id :tableB.id)
[(apply or [(clojureql.predicates/in :tableA.id [1 2])
(clojureql.predicates/in :tableA.id [3 4])])])))
Но «применять или» форма должна быть «принят» из другой функции или макро. Вот что я имею в виду:
(clojureql.core/join (clojureql.core/table db :tableA) (clojureql.core/table db :tableA)
(clojureql.core/where (apply and (= :tableA.id :tableB.id)
[(my-or-f)])))
, где эта функция:
(defn my-or-f []
(apply or [(clojureql.predicates/in :tableA.id [1 2])
(clojureql.predicates/in :tableA.id [3 4])]))
однако эта функция выдает это исключение:
#<CompilerException java.lang.Exception: Can't take value of a macro: #'clojure.core/or (NO_SOURCE_FILE:2)>
Я также попытался с помощью макроса. Она компилирует, но он бросает то же исключение при попытке выполнения запроса с помощью этого макроса
(defmacro my-or-f []
`(apply or [(clojureql.predicates/in :tableA.id [1 2])
(clojureql.predicates/in :tableA.id [3 4])]))
Есть еще один способ, который я мог бы использовать «применять или»?
Спасибо.
Retief, я пробовал ваше предложение, однако это не работает с библиотекой clojureql. вот sql, который он генерирует: SELECT tableA. *, tableA. * FROM tableA JOIN tableA ON ((tableA.id = tableB.id) И tableA.id IN (1,2)), но sql, который мне нужно сгенерировать (из моего первого рабочего примера): SELECT tableA. *, tableA. * FROM tableA JOIN tableA ON ((tableA.id = tableB.id) AND (tableA.id IN (1,2) ИЛИ tableA.id IN (3, 4))) –
Проблема заключается в том, что clojureQL/where является макросом, который перемещается по исходному дереву, которое вы его передаете, ища математику, 'и' и' или'. В нормальной среде мой код будет работать нормально, но это не работает для clojureQL. Вероятно, есть обходной путь, но, к сожалению, я фактически не использую clojureQL, поэтому я этого не знаю. Одна вещь, которая может работать, - принять мое окончательное предложение (без каких-либо операций с списками) и сделать макрос my-or-f. – Retief
@RonP проверить мое редактирование - я нашел информацию, проверив источник clojureql [здесь] (https://github.com/LauJensen/clojureql) – Retief