我正在尝试在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
〜'运算符,试图让它工作,现在我处于混乱状态。欢迎任何指导。
谢谢,
科林
答案 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)))