线程优先数组映射文字到Clojure中的匿名函数

时间:2014-08-14 20:41:49

标签: clojure

非常困惑 - 如果

(#(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

1 个答案:

答案 0 :(得分:3)

线程第一个宏始终将参数作为列表中的第二个项。所以在这种情况下,它将它插入匿名函数定义而不是调用匿名函数

(-> {"a" "b"} #(get % "a"))

扩展为*:

#(get {"a" "b"} % "a")

它只是返回一个匿名函数而不运行它。如果您添加另一组(),它应该有效。

(-> {"a" "b"} (#(get % "a")))

将扩展为:

(#(get % "a") {"a" "b"})

将匿名函数之后的参数放在外部列表中。

*我已经手动扩展了这个,以更清楚地展示这个想法。这不是文字扩展(这会扩展读者宏并添加名称空间。