不能将第一个参数作为可选项

时间:2016-07-16 01:47:04

标签: clojure clojurescript

你有一个带有和可选参数的函数作为第一个也是唯一一个参数吗?

从而

(defn foo [& bar] (if (= bar) 1 2))

2 个答案:

答案 0 :(得分:10)

& bar在函数定义中的含义是所有其余参数都将放入列表中。它没有对列表的大小提供任何保证,因此它可能是空的,包含一个或多个项目。

拥有一个且只有一个可选参数的更好方法是让它接受零个或一个参数:

(defn foo
   ([]    (foo 12))
   ([bar] (if (= bar 12) 1 2)))

在这个例子中,如果你调用第一个函数定义,没有arity,它将简单地调用第二个1-arity函数定义,默认值为12。

答案 1 :(得分:0)

这将有效:

(defn foo [& bar]
  (if (seq bar) 1 2))

使用seq是您应该编码的方式,而不是空的'。不要与seq?混淆,这意味着完全不同的东西,实际上会在这里返回true

重要的是bar成为函数体内的列表。如果您希望将此列表恢复到调用函数时的状态,请使用apply,或者解析函数本身中的列表,如下面的注释中所述......