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

Cannot have first parameter as optional

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

因此

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

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

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

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

在此示例中,如果您调用第一个参数为零的函数定义,它将简单地调用默认值为 12 的第二个参数为 1 的函数定义。

这会起作用:

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

使用 seq 是您应该使用的编码方式 'not empty'。不要与 seq? 混淆,后者的意思完全不同,实际上这里是 return true

重要的一点是bar在函数体内变成了一个列表。如果你想让这个列表恢复到你调用函数时的状态,那么使用 apply,或者在函数本身中解构列表,如下面的评论中所解释的......