Clojure asterisks特殊形式(fn*,let*等...)

Laz*_*535 2 macros function clojure special-form

我发现很多"特殊形式"只是在背景中使用星号版本的宏(fn*,let*和所有其他版本).

例如,在fn的情况下,它将解构能力添加到fn*单独不提供的混合中.我试图找到一些关于fn*可以和不能自己做什么的详细文档,但我没那么幸运.

它肯定支持:

所以我的问题最终是,为什么不定义:

(fn& [& all-args] ...)
Run Code Online (Sandbox Code Playgroud)

这将是绝对最小的,可以通过宏提供所有arity选择(检查参数列表的大小,if/case语句直接代码路径,将前几个参数绑定到所需的符号等).

这是出于性能原因吗?也许有人甚至有一个链接到星号特殊形式的实际标准定义方便.

cgr*_*and 5

Arity选择利用JVM虚方法调度:每个arity(从0到20个参数)都有自己的方法,并且21 + -arg arities有一个方法.

您可能会注意到这种applyTo方法类似于您提出的方法fn&.它的实现只是一个巨大的开关来选择正确的专用方法.