Clojure 将操作结果与hashmap值关联

Clojure 将操作结果与hashmap值关联,clojure,hashmap,Clojure,Hashmap,我有两张地图: (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 qu

我有两张地图:

(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"]}
据我所知,这是对动作对象的引用

我应该怎么做才能收到预期的结果?我也尝试过使用无引号拼接,但我还不够高级,无法使用宏,无法使其工作

编辑1:


好吧,看来我找到了解决办法。我不应该使用
(defn actions…
而应该使用
(def actions…

编辑2:

澄清我为什么使用这种结构

正如我在下面的评论中所说,我将使用此映射将其与用户提供的答案进行比较,以找到要使用的命令。例如,如果用户键入“show me directions”,它将触发函数,以显示基于关键字“directions”的方向。如果用户根据关键字“查看”和“检查房间”询问“我环视房间”或“我检查房间以找到道路”,则会出现相同的结果

首先将用户输入拆分为一组字符串,然后从我的地图(转换为集合)中查找是否有带有键的公共单词。因此,输入的
“show me directions”
将被处理为set
{“show”“me”“directions”}
。然后,我将使用
clojure.set/intersection
查找是否存在带有映射关键字集的公共元素,并相应地触发结果函数(我已经为此编写了算法)


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

好的,看来我自己找到了解决方案。我不应该使用
(defn actions…
而应该使用
(def actions…


这是所需输出的结果。

您的地图是向后的。将符号用作键,而不是值。取决于你想做什么,地图甚至可能不是正确的选择。@jmargolisvt什么?为什么你会说他的映射是向后的,仅仅因为它将字符串映射到关键字?快速检查他的数据可以很清楚地看出他想做什么。@MarcinKruglik既然你找到了解决方案,你能把它作为一个答案而不是问题的编辑吗?@jmargolisvt我将使用此地图与用户提供的答案进行比较,以找到要使用的命令。例如,如果用户键入“向我显示方向”,它将触发函数根据关键字“方向”显示方向。如果用户根据关键字“查看”和“检查房间”询问“我环视房间”或“我检查房间以找到道路”,则会出现相同的结果。这就是为什么我使用字符串。我试图将我的讲师用Lisp提供的代码实现到Clojure中。@Elogent,当我说他想做什么时,我并不是说他马上就要合并它们。我的意思是,当他继续添加到动作列表中时,用字符串键控这些动作并没有多大用处。继续在每个图标上添加:quit符号也不理想。我会使用一个嵌套的映射并用字符串生成一个向量。通过这种方式@MarcinKruglik,您可以简单地显示操作列表:
(>:操作列表:操作名称)