为 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 %)
,但是:
- 几乎与
fn
变体一样多。
- 如果有通用的解决方案,我很感兴趣。
编辑:明确地说,我正在寻找这样的东西:
#[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
正如答案 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 %)
,但是:
- 几乎与
fn
变体一样多。 - 如果有通用的解决方案,我很感兴趣。
编辑:明确地说,我正在寻找这样的东西:
#[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