有人可以在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];
答案 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的添加,它将空值添加为零。