我发现许多“特殊形式”只是在后台使用星号版本的宏(fn*、let* 和所有其他形式)。
例如,在 fn 的情况下,它将解构能力添加到 fn* 单独不提供的组合中。我试图找到一些关于 fn* 自己可以做什么和不能做什么的详细文档,但我没有那么幸运。
它绝对支持:
&/总括指标
(fn* [x & rest] (do-smth-here...))
奇怪的是arity的重载,如:
(fn* ([x] (smth-with-one-arg ...) ([x y] (smth-with-two-args ...))
所以我的问题最后是,为什么不只定义:
(fn& [& all-args] ...)
这绝对是最小的并且可以通过宏提供所有的arity选择(检查参数列表的大小,if / case语句以直接代码路径,将前几个参数绑定到所需的符号等)。
这是出于性能原因吗?也许有人甚至可以方便地链接到星号特殊形式的实际标准定义。