具有 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 添加,将空值添加为零。
有人可以解释 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 添加,将空值添加为零。