[由于缺少 # 而进行了编辑]
这种方法有点不太正规,因为 constantly
的意图是允许一个接收任意参数且总是返回常量的函数。#(...) 匿名函数简写提供了快速定义函数的便捷方式,这些函数可以处理不同的参数数量。
0 - #(vector)
1- #(vector %1)
2 - #(vector %1 %2)
...
n - #(vector %1 %2 ... %n)
& args - #(apply vector %&)
然而,有一些限制,因为您正在定义函数体。如果您尝试定义类似于 identity 的东西,最终它会看起来像是一个调用。
#(%)
;; 这将尝试将单个参数作为一元函数调用。
一种绕过这个问题的方法是在 let 或其他形式中绑定输入以传达参数数量...
#(let [v %] v)
或者
#(do %)
将像 identity 一样工作,我们只是在函数体中返回它。
尽管如此,我们想要定义一个变量参数的函数,所以想用%&来指明参数。但参数对于结果来说没有意义...它们唯一的作用是将参数的数量或arity传递给匿名函数的简化语法。
虽然有些笨拙,但这是实现它的一种方法
(defn constantly2 [v]
;;ignore the arguments, but communicate a varargs function
#(let [_ %&]
v))
user=> (def f (constantly2 10))
#'user/f
user=> (f 1 2 3 4)
10
user=> (f 1)
10
user=> (f 5)
10
user=> (f :a)
10
我可能会避免为这类事情使用#(..)语法糖。短写对于非常简单的内联匿名函数最有用,即使在那时,我也通常更喜欢明确写出fn
。