对于使用缩写符号#(..)的匿名函数,我有些不了解。
以下作品:
REPL> ((fn [s] s) "Eh")
"Eh"
但这不是:
REPL> (#(%) "Eh")
这有效:
REPL> (#(str %) "Eh")
"Eh"
我不明白的是为什么(#(%)“ Eh”)不起作用,同时我不需要在((fn [s] s)“ Eh”)中使用str
它们都是匿名函数,并且都采用一个参数。为什么速记符号需要功能而其他符号则不需要?
Answers:
正如其他答案已经很好地指出的那样,#(%)
您发布的内容实际上扩展为(fn [arg1] (arg1))
,与完全不同(fn [arg1] arg1)
。
@John Flatness指出您可以使用identity
,但是如果您正在寻找一种identity
使用#(...)
dispatch宏编写的方法,则可以这样做:
#(-> %)
通过将#(...)
调度宏与->
线程宏结合使用,它可以扩展为(fn [arg1] (-> arg1))
,然后再次扩展为(fn [arg1] arg1)
,这正是您想要的。我还发现->
和#(...)
宏组合对于编写返回向量的简单函数很有帮助,例如:
#(-> [%2 %1])