【发布时间】:2015-09-15 21:46:10
【问题描述】:
我发现很多“特殊形式”只是在后台使用星号版本的宏(fn*、let* 和所有其他形式)。
例如,在 fn 的情况下,它将解构功能添加到 fn* 单独不提供的组合中。我试图找到一些关于 fn* 可以自己做什么和不能做什么的详细文档,但我没有那么幸运。
绝对支持:
-
&/catchall 指标
(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语句以直接代码路径、将前几个参数绑定到所需的符号等)。
这是出于性能原因吗?也许有人甚至有一个链接到星号特殊形式的实际标准定义。
【问题讨论】:
-
您的意思是上面的“(fn* ...”而不是“(fn& ...”)?
-
为清楚起见,fn& 由我最初编写的 fn* 的编辑更改。在这种情况下,fn& 表示 fn* 的一个非常小的版本。然而,这个版本并不存在,只是一个假设的结构。
标签: function clojure macros special-form