将操作结果与hashmap值相关联

时间:2016-04-24 14:04:00

标签: clojure hashmap

我有2张地图:

(def look {"directions" :look
       "look" :look
       "examine room" :look
       })

(def quit {"exit game" :quit
       "quit game" :quit
       "exit" :quit
       "quit" :quit
       })

通过以下方式合并到一个地图中:

(defn actions [] (merge look quit))

然后我尝试将其结果(这是一个哈希映射)与另一个地图的值相关联:

(assoc {} :1 actions)

但不是预期的结果应该是:

{1: {"directions" :look, "look" :look ...

我收到了

{:1 #object[fun_pro.core$actions 0x20a8027b "fun_pro.core$actions@20a8027b"]}

就是我理解对动作对象的引用。

我应该怎样做才能收到预期的结果?我也试过使用非引号拼接,但我还不够先进,无法使用宏,也无法使其正常工作。

EDIT1:

好的,好像我找到了解决方案。我应该使用(defn actions...)

,而不是使用(def actions...)

EDIT2:

澄清我使用这种结构的原因。

正如我在下面的评论中所说,我将使用此地图将其与用户提供的答案进行比较,以找出要使用的命令。例如,如果用户键入“向我显示方向”,它将触发基于关键字“方向”显示方向的功能。根据关键词“外观”和“检查室”,如果用户会询问“我环顾房间”或“我检查房间找路”,结果相同。

首先将用户输入分成一组字符串,然后查找是否有来自我的地图的密钥的常用字(变成集合)。因此,输入"show me directions"将被处理为集#{"show" "me" "directions"}。然后我将使用clojure.set/intersection来查找是否存在与映射关键字集相关的公共元素,并根据结果触发函数(我已经为此编码了算法)。

当然,如果有更好的解决方案,我愿意接受任何建议。

1 个答案:

答案 0 :(得分:1)

好的,好像我自己找到了解决方案。我应该使用(defn actions...)

,而不是使用(def actions...)

期望输出的结果。