4
({:x 10, :y 20, :z 50} :y)
gives 20

并且

(:y {:x 10, :y 20, :z 50})
gives 20

在这两种情况下它是如何在内部工作的,

对于作为函数的地图,我可以理解您可以通过了解第一个值是地图来区分形式。

但是 key 是如何变成函数的呢?在运行时,键可以是任何类型的值,那么运行时如何理解它必须将此值视为函数?

4

1 回答 1

4

地图是函数,来自文档

映射实现 IFn,用于一个参数(键)的调用()和可选的第二个参数(默认值),即映射是其键的函数。nil 键和值都可以。

所以这:

({:x 10, :y 20, :z 50} :y)

将函数{:x 10, :y 20, :z 50}应用于:y.

关键字也是函数,引用文档

关键字使用可选的第二个参数(默认值)为一个参数(映射)的 invoke() 实现 IFn。例如 (:mykey my-hash-map :none) 的含义与 (get my-hash-map :mykey :none) 相同

所以当你这样做时:

(:y {:x 10, :y 20, :z 50})

你实际上调用:ywith{:x 10, :y 20, :z 50}作为参数。

基本上任何实现IFn并在类路径上的东西都可以被视为一个函数。

于 2013-09-10T10:21:08.673 回答