【发布时间】:2012-02-22 11:15:22
【问题描述】:
假设我有以下 clojure 函数:
(defn a [x] (* x x))
(def b (fn [x] (* x x)))
(def c (eval (read-string "(defn d [x] (* x x))")))
有没有办法测试函数表达式的相等性 - 一些等价于
(eqls a b)
返回真?
【问题讨论】:
-
不可能——函数的等价性是不确定的。
-
糟糕,对于赏金评论格式感到抱歉——没有意识到格式不会以同样的方式工作。
-
你好奥姆里。如果您在下面看到我的回答,您会看到我讨论了两个函数,它们具有与它们的主体相同的 JVM 字节码。这实际上是内涵平等。我还指出,内涵平等意味着外延平等(但反过来不正确)。如果字节码最终不同(就像您给出的某些示例可能那样),那么我们将重新尝试实现扩展相等 - 正如我们所知,这是无法确定的。希望这能让事情更清楚一点——内涵平等(加上一些特殊情况)可能是我们所能希望的最好的。
-
@kittylyst 感谢您的回复,我觉得您的回答很周到。我越来越相信特殊情况的数量(如您所说)实际上非常大,以至于我们可以有意义地测试功能等效性。例如,我认为
(* x x)等于(* x x 1)的情况可以通过注意*函数的标识值是1来解决。更一般地,我们可以通过获取(f)的结果来测试身份值。如果给定的f确实有一个标识值,我们可以在等价测试时忽略某些(f ...)中的所有这些值。 -
@kittylyst 另外:如果你知道获取函数体的 JVM 字节码的方法,我很想学习如何——这听起来很酷。
标签: function clojure expression equality