(这是基于"https://stackoverflow.com/a/10757945/181772">对我在评论中提出的问题的回答)。
-gt;
宏观将每个参数都取而代之, 必要时将它编成一个列表( 将“ raw” 函数应用到无参数 - 将 < code> myfunc 转换为 < code> (myfunc) ), 然后将第一个参数插入到 < code>- gt; 中, 作为每个列表中的第二个参数 。
所以 (- & gt; foo myfunc)
变成 (- & gt; foo (myfunc))
大致上成为 (myfunc foo)
(myfunc fo) 。
这在docs (->
) 的docs中都有描述。
匿名函数的问题在于,它们是由以下读者宏生成的: 描述在这里(croll down) 。 这意味着 被转换为 ( before normal 宏扩展) (fn [...]...)
。 这很好,但归根结底, 已经是一个列表 。
因此宏认为匿名函数已经应用, 当它事实上遇到函数定义( 两者都是列表) 时, 并且添加“ extra” 仆人―― 如上文在另一答案中所描述的那样 - 将匿名函数应用到任何参数 。
这种不直观行为的原因是, ->
宏所使用的 dwim (do- what-i- meant, not dwim-wit-wited, 尽管...), 添加了 ->
宏, 允许您提供“ bare” 函数, 而不是要求您在列表中附加这些函数, 而不是要求您将其应用到没有参数的参数中, 是 < em> justit a hyuristical - 它只是对列表的测试 - 并且被读者宏创建的函数定义所混淆 。
[在我不好的意见中,-gt;
没有很好地执行,应该拒绝所有“bare”功能,而只接受功能应用程序;这样就显得更加一致。如果不是,那么至少医生可以更清楚,解释将东西放入清单背后的动机mantics 。 ]