问题描述
引用Clojure 的乐趣,第 4.3.1 节--
Quoting from Joy of Clojure, section 4.3.1--
因为关键字是自我评估的并提供快速的相等性检查,所以它们几乎总是在映射键的上下文中使用.使用关键字作为映射键的一个同样重要的原因是它们可以用作函数,将映射作为参数,执行值查找:
(def population {:zombies 2700, :humans 9})
(:zombies population)
;=> 2700
(println (/ (:zombies population)
(:humans population))
"zombies per capita")
; 300 zombies per capita
我不清楚这里发生了什么.不知何故,(:zombies population)
必须转化为 (get population :zombies)
,对吧?这是如何工作的?关键字对自身求值,而不是对函数求值.读者是否会注意列表中的第一件事是关键字的情况,并添加 get 并将关键字移动到列表的末尾?
It is not apparent to me what is going on here. Somehow (:zombies population)
has to get transformed into (get population :zombies)
, right? How exactly does this work? The keyword evaluates to itself, not to a function. Does the reader look out for cases where the first thing in a list is a keyword, and add get and move the keyword to the end of the list?
推荐答案
引自 官方文档一个>:
关键字为带有可选的第二个参数(默认值)的一个参数(映射)的 invoke() 实现 IFn.例如 (:mykey my-hash-map :none) 与 (get my-hash-map :mykey :none) 的意思相同.见获取.
Clojure 可以将关键字作为函数调用,因为它实现了与函数相同的接口.符号也是一样...
And Clojure can call keyword as function, because it implements same interface as function. The same is for symbols...
这篇关于为什么使用关键字或符号作为函数从地图中查找值有效?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!