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

Declare dummy (unused) parameters for Clojure anonymous function

正如答案 of this question 中所解释的那样,Clojure 通过主体中引用的最大参数索引(例如,如果最大引用参数是%4,那么那个匿名函数有4个参数)。

问题:是否有某种语法告诉 Clojure 编译器匿名函数需要一个参数,即使不引用该参数?或者,在这种情况下,唯一的 "clean way"* 是使用 fn syntax? (* "Clean way":我知道在大多数情况下,您可以在不影响函数的情况下引用虚拟参数——见下文,但我想避免这种变通方法。)

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

在这种特殊情况下,我可以使用一些巧妙的技巧,例如 #(or true %),但是:

  1. 几乎与 fn 变体一样多。
  2. 如果有通用的解决方案,我很感兴趣。

编辑:明确地说,我正在寻找这样的东西:

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

没有。只需使用 fn。这就是它的用途。

如果它是一个常量 return 你可以使用 constantly:

(map (constantly 10) '(1 2 3 4 5)) 
; ==> (10 10 10 10 10)

如果不是,您可以使用 fn 和 rest 参数:

(fn [& _] 
 some-side-effect-expression)
; ==> non functional value

事实上,这可以在不需要所有传递参数的高阶函数上完成:

(some-fun (fn [a b & _] (+ a b)) '(1 2 3 4 5))
; ==> (3 5 7 9)

如果你坚持#( ... )语法,你可以写成

#(do % true)

... 不会招致 run-time 处罚,随心所欲 return。

但是 (constantly true),正如 所暗示的那样,是惯用的,并且接受任何参数列表:

((constantly true) 1 2 "Buckle my shoe");true