我有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
来查找是否存在与映射关键字集相关的公共元素,并根据结果触发函数(我已经为此编码了算法)。
当然,如果有更好的解决方案,我愿意接受任何建议。
答案 0 :(得分:1)
(defn actions...)
。,而不是使用(def actions...)
期望输出的结果。