我有一个这样定义的函数规范,我想将它评估为一个函数对象,以便我可以传递。
(def spec '(foo [n] (* 2 n)))
我可以创建这样的宏
(defmacro evspec [name arg & body] `(defn ~name [~arg] ~@body))
那么下面的调用会给我函数 foo。当用 3 调用时,(foo 3),将返回 6。
(evspec foo n (* 2 n))
但是,如果我从上面定义的规范中获取函数体,则返回的函数 foo 不会评估主体形式 (* 2 n),而是返回主体形式。
(let [foo (first spec) arg (first (second spec)) body (last spec)]
(evspec foo arg body))
user=> (foo 3)
(* 2 n)
我注意到现在创建的 foo 函数是 $eval$foo
user=> foo
#<user$eval766$foo__767 user$eval766$foo__767@39263b07>
而工作的 foo 功能是
user=> foo
#<user$foo user$foo@66cf7fda>
任何人都可以解释为什么有区别,我怎样才能让它发挥作用?我想有办法不回复 eval 吗?来自javascript背景,不知何故我总是认为 eval 是邪恶的。