如何使 clojure 映射和关键字成为一个函数



在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

最新更新