在clojure中,您可以使用地图数据结构或关键字作为函数来查找地图。
(let [m {:foo "bar"}]
(get m :foo) ; -> "bar"
(:foo m) ; -> "bar"
(m :foo)) ; -> "bar"
所有这些表达式都返回值"bar"。在实现方面,如何将map或关键字用作函数?这是内置于clojure解释器中的特例,还是我可以用该语言重新创建的东西?引擎盖下到底发生了什么?
这一切都是用普通的java完成的。
有一个名为 iFn 的接口,Clojure 中任何想要作为函数调用的东西都可以实现。由那件事来决定被召唤时该怎么做。
- 关键字选择在作为第一个参数传递的集合中查找它们。
- 地图选择查找作为键传递的参数本身。
- 符号也会在集合中查找它们。很像关键字。
- 变量对它们包含的任何函数进行函数调用,使用它们传递的任何参数。他们使用相同的界面来做到这一点。
只是为了向您展示这在任何具有一流函数的语言中是如何实现的 - 下面的JavaScript示例; 运行它以查看结果!
const map = x => a =>
a === undefined ? x : a(map(x))
const get = m => a =>
a(m)
const accessor = k => m =>
m()[k]
// make accessor
const foo = accessor('foo')
// make map
let m = map({foo: 'bar'})
// test expressions
// get applied to map and accessor:
console.log(get (m) (foo)) // bar
// accessor applied to map:
console.log(foo (m)) // bar
// map applied to accessor:
console.log(m (foo)) // bar