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,您可以简单地显示操作列表:
(>:操作列表:操作名称)
。