对于使用缩写符号#(..)的匿名函数,我有些不了解。
以下作品:
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])