Clojure(地图)在地图键上

时间:2014-05-20 22:17:46

标签: clojure lighttable

我有一个从关键字到指南针方向字符串的地图:

(def dirnames {:n "North", :s "South", :e "East", :w "West"})

我可以使用地图作为函数查找名称:

(dirnames :n)
;# = "North"

在我看来

(map dirnames [:n :s])

应该返回向量

["North" "South"]

但它返回

[:n :s]

代替。我尝试过这六种方法,在(map)调用中提供不同的函数来代替“dirnames”,并且我总是得到关键字的向量。

显然,我遗漏了一些基本的东西。它是什么?

2 个答案:

答案 0 :(得分:2)

对我有用,我误解了这个问题:

user> (def dirnames {:n "North", :s "South", :e "East", :w "West"})\
#'user/dirnames

user> (map dirnames [:n :s])
("North" "South")

也:

user> (map #(dirnames %) [:n :s])
("North" "South")
user> (mapv #(dirnames %) [:n :s])
["North" "South"]

答案 1 :(得分:2)

我打赌你忘记了一些事情。考虑这个函数定义:

(defn foo [dirnames]
  map dirnames [:n :s])

它看起来几乎是正确的,但它评估副作用的map,然后dirnames评估副作用(两者都不做任何事情),然后最终返回[:n :s]。对于像你所描述的那样的行为,这是我能想到的唯一合理的解释。