2017-05-09 45 views
2

在clojure中,可以使用地图数据结构或关键字作为函数来查找地图。clojure地图和关键字如何成为函数

(let [m {:foo "bar"}] 
    (get m :foo) ; -> "bar" 
    (:foo m)  ; -> "bar" 
    (m :foo)) ; -> "bar" 

所有这些表达式都返回值“bar”。实施方面,如何使用map或关键字作为函数?这是一个clojure解释器内置的特殊情况,还是我可以用该语言重新创建的东西?实际情况下发生了什么?

回答

4

这一切都在正常的java下完成。

有一个称为iFn的接口,任何在Clojure中想要被调用的函数都可以实现。调用时决定该做什么取决于该事情。

  • 关键字选择看看他们自己在作为第一个参数传递的集合中。
  • 地图选择查找自己作为关键字传递的参数。
  • 符号也看起来他们自己在一个集合。就像关键字一样。
  • Vars对它们包含的任何函数进行函数调用,使用它们传递的任何参数。他们使用这个相同的界面来做到这一点。
+1

瓦尔* *是功能,但肯定不用*包含*功能。函数调用可能会检索内容。 – Thumbnail

2

只是为了向您展示如何在具有头等功能的任何语言中实现这一点 - 下面的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

相关问题