我有一个返回另一个函数的函数,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
谁能帮我理解为什么会发生这种情况?
最佳答案
您不得评估函数对象。 eval 用于符号、列表等:要输入编译器的源代码。已编译的函数对象是 eval 的无效参数;它恰好在某些情况下有效,而在其他情况下无效(具体来说,对于闭包它会失败,对于没有捕获范围的函数它可以工作,但这并不能保证)。
关于Clojure 函数的行为与相同的内联代码不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40364481/