为什么clojure允许小于(<)或大于(>)运算符/函数使用单个参数?我想知道为什么它只是返回"true",而不是强迫至少两个论点?
来源:
(defn >
"Returns non-nil if nums are in monotonically decreasing order,
otherwise false."
{:inline (fn [x y] `(. clojure.lang.Numbers (gt ~x ~y)))
:inline-arities #{2}
:added "1.0"}
([x] true)
([x y] (. clojure.lang.Numbers (gt x y)))
([x y & more]
(if (> x y)
(if (next more)
(recur y (first more) (next more))
(> y (first more)))
false)))
如果您认为"单调递减"与"第一个值之后是否有任何值大于前一个值(对此,我们将拒绝将其作为单调递减序列)"相同,则>
(和<
,如果您说递增/小于)的单个自变量满足此定义。
可能有更好的理由,但一个简单的理由是:假设你从某个地方得到了一个列表,你想检查它是否有序,你可以简单地做:
(let [ls (list-from-somplace)]
(apply < ls)
如果clojure不支持<
函数的1个参数,那么您将不得不手动检查列表的长度,从而使代码变得更丑陋:)
编辑
mars提出了一个很好的观点,我们仍然需要处理空列表,引入丑陋:
(let [ls (list-from-someplace)]
(when ls (apply < ls)))
可以无限期地接受多个参数的Clojure运算符通常只接受零或一个,如果这样做有意义的话
(+) ;0
正如@Mars所指出的,令人惊讶的是,>
没有返回零arity的true
。Arity one回归true
正是你所期待的。
从逻辑上讲,适用于所有包括没有任何相邻对的情况。