带有clojure的动态代码

时间:2011-02-08 14:50:38

标签: clojure

我正在尝试在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)))

我一直在搞乱各种`` and〜'运算符,试图让它工作,现在我处于混乱状态。欢迎任何指导。

谢谢,

科林

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

您可以使用 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)))