正如答案fn syntax中所解释的,Clojure通过正文中引用的最大参数索引确定匿名函数的参数个数(通过#()
定义)(例如,如果最大参考参数是%4
,那么匿名函数有4个参数。)
问题:是否有一些语法告诉Clojure编译器匿名函数需要一个参数,甚至不引用该参数?或者,在这种情况下,唯一的“干净方式”*是使用{{3}}? (*“清理方式”:我知道在大多数情况下,你可以在不影响功能的情况下引用虚拟参数 - 见下文,但我想避免这种解决方法。)
我的用例:我有一个函数(defn foo [predicate])
,其中predicate
只需要一个参数,我想用一个始终返回foo
的谓词来测试true
。 (即,类似#(true)
。)这会导致ArityException
,因为解释器认为#(true)
期望零参数。
在这种特殊情况下,我可以使用一些聪明的黑客,如#(or true %)
,但是:
fn
- 变种几乎一样多。编辑:所以要清楚,我正在寻找这样的东西:
#[1](true) ;; the anonymous function takes one parameter
答案 0 :(得分:3)
没有。只需使用fn
即可。这就是它的用途。
答案 1 :(得分:2)
如果这是一个恒定的回报,那么你可以使用constantly
:
(map (constantly 10) '(1 2 3 4 5))
; ==> (10 10 10 10 10)
如果不是,您可以将fn
与休息参数一起使用:
(fn [& _]
some-side-effect-expression)
; ==> non functional value
实际上,这可以在不需要所有传递参数的高阶函数上完成:
(some-fun (fn [a b & _] (+ a b)) '(1 2 3 4 5))
; ==> (3 5 7 9)
答案 2 :(得分:0)
如果您坚持使用#( ... )
语法,则可以编写
#(do % true)
......不管你想要什么,都不会产生运行时间的惩罚。
但正如@Sylvester所暗示的那样,(constantly true)
是惯用的,并接受任何参数列表:
((constantly true) 1 2 "Buckle my shoe");true