Laz*_*535 2 macros function clojure special-form
我发现很多"特殊形式"只是在背景中使用星号版本的宏(fn*,let*和所有其他版本).
例如,在fn的情况下,它将解构能力添加到fn*单独不提供的混合中.我试图找到一些关于fn*可以和不能自己做什么的详细文档,但我没那么幸运.
它肯定支持:
&/ catchall指标
(fn* [x & rest] (do-smth-here...))
Run Code Online (Sandbox Code Playgroud)并且好奇地还有arity的超载,如:
(fn* ([x] (smth-with-one-arg ...)
([x y] (smth-with-two-args ...))
Run Code Online (Sandbox Code Playgroud)所以我的问题最终是,为什么不定义:
(fn& [& all-args] ...)
Run Code Online (Sandbox Code Playgroud)
这将是绝对最小的,可以通过宏提供所有arity选择(检查参数列表的大小,if/case语句直接代码路径,将前几个参数绑定到所需的符号等).
这是出于性能原因吗?也许有人甚至有一个链接到星号特殊形式的实际标准定义方便.
Arity选择利用JVM虚方法调度:每个arity(从0到20个参数)都有自己的方法,并且21 + -arg arities有一个方法.
您可能会注意到这种applyTo方法类似于您提出的方法fn&.它的实现只是一个巨大的开关来选择正确的专用方法.