使用clojure的动态代码

使用clojure的动态代码,clojure,Clojure,我试图在clojure中创建一些动态代码。在下面的函数中,将动态生成(和)宏的条件 (defn matching-keys [rec match-feed keys] (> (count (clojure.set/select #(and (for [k keys] (= (% k) (rec k)))) (set match-feed)))

我试图在clojure中创建一些动态代码。在下面的函数中,将动态生成(和)宏的条件

(defn matching-keys [rec match-feed keys]
  (> (count (clojure.set/select #(and (for [k keys]
                                        (= (% k) (rec k))))
                                (set match-feed)))
     0))
所以如果成功了!!然后,当传递
[:tag:attrs]
:

(and (= (% :tag) (rec :tag))
     (= (% :attrs) (rec :attrs)))
我一直在与各种
``和
~`操作符混在一起,试图让它正常工作,现在处于一种混乱状态。欢迎任何指导

谢谢

Colin

您可以使用eval评估动态构建的表单,例如:

(eval '(= 2 3))
请记住,动态计算的表单将无法访问词汇上下文。这意味着:

(let [a 1 b 2]
  (eval '(+ a b)))
这是行不通的

但是,仍然可以使用动态环境:

(def a nil)
(def b nil)

(binding [a 1 b 2]
  (eval '(+ a b)))

您不需要为此动态生成代码。将匿名函数更改为
#(every?(fn[k](=(%k)(reck)))键)
应该可以执行您想要的操作,而无需在运行时生成代码


使用高阶函数的能力意味着您几乎不需要动态生成代码。

谢谢Brian。我自己也是这样做到的:#(有些是真的?(对于[k个键](=(%k)(reck))),但是你的解决方案更好。干杯。+1的见解动态与词汇绑定与评估。。。我不知道!