Как преобразовать "общие" выражения в утвержденные выражения предикатов? (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 ответ

Не делай этого с выражениями. Вместо этого используйте функции. Тогда легко просто вызвать каждую функцию с любым значением, которое вы хотите.

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