Как преобразовать "общие" выражения в утвержденные выражения предикатов? (Clojure)
Я пытаюсь написать макрос, который преобразует "общие" выражения в выражения, вычисленные для определенного заданного значения.
Допустим, у меня есть вектор неоцененных выражений вида,
'[(map? %)
(-> % :value string?)
(fn[x] (apply #(pos? %) (- x 2))]
У меня есть значение v, которое я хочу "передать" вышеприведенному выражению во время выполнения. Итак, предположим, что v будет именем символа, используемого во время компиляции. Я также хочу утверждать преобразованное выражение. По сути, для приведенного выше примера я хочу преобразовать приведенное выше векторное выражение в приведенную ниже форму. Обратите внимание, что я передаю значение v% в первых двух выражениях и x в третьем выражении. Код ниже не является правильным, но только иллюстрирует то, что я хочу, чтобы произошло. Я понятия не имею, как на самом деле получить v в любом из следующих утверждений выражений.
'[(assert (map? %)) ;; % is equal to v
(assert (-> % :value string?)) ;; % is equal to v
(assert (fn[x] (apply #(pos? %) (- x 2)))] ;; x is equal to v
В качестве руководящего примера я хотел бы иметь возможность делать то, что:post часть карты prepost? делает на выражение Defn. Любая помощь приветствуется.
1 ответ
Не делай этого с выражениями. Вместо этого используйте функции. Тогда легко просто вызвать каждую функцию с любым значением, которое вы хотите.