(这是基于我在评论中发布的问题的答案)。
->
宏接受每个参数,如有必要将其设为列表(将“原始”函数应用于无参数 - 转换为myfunc
)(myfunc)
,然后将第一个参数插入到->
每个列表中作为第二个参数。
so(-> foo myfunc)
变成(-> foo (myfunc))
,(myfunc foo)
大致上。
这在文档中->
都有描述。
匿名函数的问题在于它们是由阅读器宏生成的,如此处所述(向下滚动)。这意味着#(...)
将(在正常宏扩展之前)转换为(fn [...] ...)
. 这很好,但至关重要的是,它已经是一个 list。
所以宏认为匿名函数已经被应用,而实际上它正在遇到函数定义(两者都是列表)。并添加“额外”括号 - 如上所述在另一个答案中 - 将匿名函数应用于无参数。
这种不直观的行为的原因是宏使用的 dwim(do-what-i-mean,不是 dwim-witted,虽然......)启发式->
,添加以允许您提供“裸”功能而不是要求通过将它们包含在列表中来将它们应用于无参数,这只是一种启发式方法——它只是测试一个列表——并且被阅读器宏创建的函数定义混淆了。
[在我的坏脾气看来,->
实现得很差,应该拒绝所有“裸”功能,而只接受功能应用;然后它会显得更加一致。如果不是,那么至少文档可以更清晰,解释将事物放入列表背后的激励语义。]