【问题标题】:Clojure (map) over map keysClojure(地图)在地图键上
【发布时间】:2014-05-20 22:17:46
【问题描述】:

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

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

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

(dirnames :n)
;# = "North"

在我看来

(map dirnames [:n :s])

应该返回向量

["North" "South"]

但它会返回

[:n :s]

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

显然我缺少一些基本的东西。这是什么?

【问题讨论】:

  • 哪个 Clojure 版本?我只在 1.4.0 和 1.5.1 中尝试过,它们都做你想做的事,即(map dirnames [:n :s]) 评估为("North" "South")。或者将map 替换为mapv,你会得到["North" "South"]
  • 我一直在 Light Table 中工作;我在 Light Table 的“InstaREPL”中看到了上面的结果。如果我将 REPL 作为“java -cp clojure.jar clojure.main”运行,我会看到正确的行为。
  • 好像是Light Table的问题。
  • 啊,那我帮不了你了:/我不使用 Light Table。
  • 让 Light Table 从头开始​​评估整个模块似乎已经解决了问题。

标签: clojure lighttable


【解决方案1】:

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

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"]

【讨论】:

  • 错误的问题,虽然我很高兴知道 (mapv)。问题不在于我得到的是序列还是向量,而是我没有得到字符串,而是关键字。
【解决方案2】:

我敢打赌你忘记了一些括号。考虑这个函数定义:

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

它看起来几乎是正确的,但它评估 map 的副作用,然后评估 dirnames 的副作用(这两个都什么都不做),最后返回 [:n :s]。对于您所描述的行为,这是我能想到的唯一合理解释。

【讨论】:

  • 原来代码是正确的,但我混淆了我正在使用的 REPL。我认为 var 的绑定与我意识到的不同。很好的教训。
  • 这个问题的猜测很好。
猜你喜欢
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多