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)
尝试在大多数其他语言,你的堆栈将吐司:-)
| 归档时间: |
|
| 查看次数: |
3903 次 |
| 最近记录: |