Clojure :: arity-overloaded函数互相调用

Mar*_*tus 10 clojure

Clojure arity-overloading的示例如下所示(取自cookbook):

(defn argcount
  ([] 0)                                ; Zero arguments
  ([x] 1)                               ; One argument
  ([ x &  args] (inc (count args))))    ; List of arguments
Run Code Online (Sandbox Code Playgroud)

...使用一个似乎不允许较低arity函数的表单来简单地调用具有一些默认值的较高arity函数(这是Java中常见的习语).是否使用了其他一些特殊形式?

mik*_*era 14

通常有一种很好的方式来表达更高的arity参数,这种方式不需要使用更高阶函数和map/ 来引用其他arities reduce.在这种情况下,它非常简单:

(defn argcount
  ([] 0)
  ([x] 1)
  ([x & args]
    (reduce + 1 (map (constantly 1) args))))
Run Code Online (Sandbox Code Playgroud)

请注意表达式的一般形式是:

(reduce reducing-function arity-1-value (map mapping-function rest-of-args))
Run Code Online (Sandbox Code Playgroud)

你无法以这种方式做任何事情,但这适用于大量的多参数函数.它也可以获得使用懒惰的优点map,所以你可以做一些疯狂的事情,比如将一千万个参数传递给函数而不用担心:

(apply argcount (take 10000000 (range)))
=> 10000000
Run Code Online (Sandbox Code Playgroud)

尝试在大多数其他语言,你的堆栈将吐司:-)