gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:14:09 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com