非常困惑 - 如果
(#(get % "a") {"a" "b"})
返回"b"
,为什么不返回
(-> {"a" "b"} #(get % "a"))
还会返回"b"
?
(第二个错误w / CompilerException java.lang.ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to clojure.lang.ISeq
)
答案 0 :(得分:3)
线程第一个宏始终将参数作为列表中的第二个项。所以在这种情况下,它将它插入匿名函数定义而不是调用匿名函数
(-> {"a" "b"} #(get % "a"))
扩展为*:
#(get {"a" "b"} % "a")
它只是返回一个匿名函数而不运行它。如果您添加另一组()
,它应该有效。
(-> {"a" "b"} (#(get % "a")))
将扩展为:
(#(get % "a") {"a" "b"})
将匿名函数之后的参数放在外部列表中。
*我已经手动扩展了这个,以更清楚地展示这个想法。这不是文字扩展(这会扩展读者宏并添加名称空间。