Clojure变量参数惯用语

4

我正在使用官方指南尝试Clojure。以下是我对该链接问题8的解决方案,其中要编写一个函数opposite,该函数应模仿complement函数:

(defn opposite [f] (fn [& args] (not (apply f args))))

为了对比,这里是complement的源代码:

(defn complement
  "Takes a fn f and returns a fn that takes the same arguments as f,
  has the same effects, if any, and returns the opposite truth value."
  {:added "1.0"
   :static true}
  [f] 
  (fn 
    ([] (not (f)))
    ([x] (not (f x)))
    ([x y] (not (f x y)))
    ([x y & zs] (not (apply f x y zs)))))

现在,我的实现似乎只适用于一些简单的情况,例如只有几个参数:

user=> (def unequal (opposite =))
#'user/unequal
user=> (unequal 1 2)
true
user=> (unequal 1 1)
false

我的两个问题是:

  1. 我的opposite函数和complement等价吗,还是只是看起来像?也就是说,前三个明确参数的情况是否真正必要?
  2. 如果它们不是必需的,那么为什么补集源代码的形式在Clojure中是惯用语?

提前感谢(及致敬友好的SO!)。

1个回答

5
Clojure源代码为了提高效率,将0、1和2个参数的情况拆分处理。它们基本上预先编译了3种特殊情况和一个通用情况。
您的代码是完全合法的,除非已经测量并证明存在性能瓶颈(或者您正在编写类似于clojure.core的编译器/库)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接