使用nil值的Clojure` +`行为

时间:2016-02-25 11:32:56

标签: clojure nullpointerexception clojurescript

有人可以在Clojure(版本“1.8.0”)中解释+函数的以下行为吗?

(+ 1)       ;; 1
(+ nil)     ;; nil
(+ 5 nil)   ;; 5
(+ nil nil) ;; 0

注意:它不会在ClojureScript中引发异常:

self.LoginButton.backgroundColor = [UIColor colorWithRed:10.0/255.0 green:107.0/255.0 blue:171.0/255.0 alpha:1.0]; 

1 个答案:

答案 0 :(得分:3)

查看clojure的+来源:

(defn +
  ([] 0)
  ([x] (cast Number x))
  ([x y] (. clojure.lang.Numbers (add x y)))
  ([x y & more]
     (reduce1 + (+ x y) more)))

因此,对于arity 1,它只是将值转换为Number。这真的很奇怪,这里没有检查nil,我想有人应该把它作为一个bug提交。

另一方面,clojurescript的变体:

(defn ^number +
  ([] 0)
  ([x] x)
  ([x y] (cljs.core/+ x y))
  ([x y & more]
    (reduce + (cljs.core/+ x y) more)))

只返回值(由于(+ "hello")会返回"hello",因此也会感觉错误(好吧,还没有对它进行测试,但仍然))

对于其他arities clojure使用Numbers.add(需要数字作为参数,并抛出错误),

虽然就我所知,clojurescript使用这个宏:

(core/defmacro ^::ana/numeric +
  ([] 0)
  ([x] x)
  ([x y] (core/list 'js* "(~{} + ~{})" x y))
  ([x y & more] `(+ (+ ~x ~y) ~@more)))

所以它只是javascript的添加,它将空值添加为零。