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

标签 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

谁能帮我理解为什么会发生这种情况?

最佳答案

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

关于Clojure 函数的行为与相同的内联代码不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40364481/

相关文章:

从 lapply 返回匿名函数 - 出了什么问题?

matlab - 在 MATLAB 中是否有 'self' 来引用自己的结构?

javascript - 数组中的每个元素同时递增,而实际上只应该递增一个元素

clojure - 确定矩阵维度

c# - 我可以在 Q# 中使用 lambda 来对量子位进行操作吗?

web-services - 服务器将数据从Clojure推送到ClojureScript

clojure - Om Next 的 query->ast 和 ast->query 函数

list - 如何在 Erlang 中使用闭包?

clojure - 在 Clojure 中创建 Java 类的选项

namespaces - Clojure:函数的全限定名