具有 nil 值的 Clojure `+` 行为

Clojure `+` behaviour with nil values

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

(+ 1)       ;; 1
(+ nil)     ;; nil
(+ 5 nil)   ;; java.lang.NullPointerException
(+ nil nil) ;; java.lang.NullPointerException
;; same behaviour with +'

注意:它不会在 ClojureScript 中抛出异常:

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

查看 clojure 的 + 来源:

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

所以对于 arity 1,它只是将一个值转换为一个数字。这看起来真的很奇怪,这里没有检查 nil,我想有人应该将其作为错误提交。

另一方面,clojurescript 的变体:

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

只是 return 的值(这也让人觉得有问题,因为 (+ "hello") 会 return "hello"(好吧,还没有测试过,但仍然))

对于其他参数,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 添加,将空值添加为零。