Clojure变量参数成语

时间:2018-04-30 20:20:03

标签: clojure

我正在使用the official guides尝试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,还是仅仅是<Tooltip title="Tooltip Test"> <Select value={this.state.age} onChange={this.handleChange} inputProps={{ name: "age", id: "age-simple" }} > <MenuItem value=""> <em>None</em> </MenuItem> <MenuItem value={10}>Ten</MenuItem> <MenuItem value={20}>...</MenuItem> </Select> </Tooltip> 看起来像吗?即是确定数量的前三个案例 参数确实有必要?
  2. 如果他们没有必要,是否有补充形式的理由 源代码是某种惯用的Clojure?
  3. 提前致谢(冰雹友好!)。

1 个答案:

答案 0 :(得分:3)

为了提高效率,Clojure源代码突破了0,1和2个arg案例。他们基本上已经预先编译了#34; 3个特例,加上一个普通案例。

您的代码是完全合法的,并且除非已经测量到性能瓶颈,否则它是首选的。已证明(或者您正在编写像clojure.core这样的编译器/库。)