Clojure函数的行为与相同的内联代码不同?

时间:2016-11-01 16:37:40

标签: clojure anonymous-function

我有一个返回另一个函数的函数,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

任何人都可以帮助我理解为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

您不得评估函数对象。 eval用于符号,列表等:要提供给编译器的源代码。已编译的函数对象是eval的无效参数;它恰好在某些情况下工作而在其他情况下不工作(特别是对于它失败的闭包,对于没有捕获范围的函数,它可以工作,但这不能保证)。