我有一个返回另一个函数的函数,cons-then-eval-fn:
(defn cons-then-eval-fn [x]
(fn [& e] (cons x (eval e))))
由此,我定义了这个概念的两个实例,一个使用cons-then-eval-fn,另一个使用内联代码执行相同的操作:
(def zero-a (cons-then-eval-fn 0))
(def zero-b (fn [& e] (cons 0 (eval e))))
通过一些参数,这两个函数的行为相同(正如我所料):
(zero-a) => (0)
(zero-b) => (0)
(zero-a identity []) => (0)
(zero-b identity []) => (0)
但是有了这些论点,我看到了不同的行为:
(zero-b zero-b identity []) => (0 0)
(zero-a zero-a identity []) =>
IllegalArgumentException No matching ctor found
任何人都可以帮助我理解为什么会这样吗?
答案 0 :(得分:2)
您不得评估函数对象。 eval用于符号,列表等:要提供给编译器的源代码。已编译的函数对象是eval的无效参数;它恰好在某些情况下工作而在其他情况下不工作(特别是对于它失败的闭包,对于没有捕获范围的函数,它可以工作,但这不能保证)。