为Clojure匿名函数声明虚拟(未使用)参数

时间:2017-01-28 11:15:48

标签: clojure arguments anonymous-function

正如答案fn syntax中所解释的,Clojure通过正文中引用的最大参数索引确定匿名函数的参数个数(通过#()定义)(例如,如果最大参考参数是%4,那么匿名函数有4个参数。)

问题:是否有一些语法告诉Clojure编译器匿名函数需要一个参数,甚至不引用该参数?或者,在这种情况下,唯一的“干净方式”*是使用{{3}}? (*“清理方式”:我知道在大多数情况下,你可以在不影响功能的情况下引用虚拟参数 - 见下文,但我想避免这种解决方法。)

我的用例:我有一个函数(defn foo [predicate]),其中predicate只需要一个参数,我想用一个始终返回foo的谓词来测试true 。 (即,类似#(true)。)这会导致ArityException,因为解释器认为#(true)期望零参数。

在这种特殊情况下,我可以使用一些聪明的黑客,如#(or true %),但是:

  1. 输入fn - 变种几乎一样多。
  2. 如果有通用的解决方案,我很感兴趣。
  3. 编辑:所以要清楚,我正在寻找这样的东西:

    #[1](true) ;; the anonymous function takes one parameter

3 个答案:

答案 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