首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从clojure中的set中获取元素?

如何从clojure中的set中获取元素?
EN

Stack Overflow用户
提问于 2016-05-04 14:47:30
回答 2查看 1.4K关注 0票数 2

我已经准备好

代码语言:javascript
复制
(def tableOfStates [{:_ '\a :q0 'q1 :q1 'q1 :q2 'q3 :q3 '\_ }
                    {:_ '\b :q0 'q2 :q1 'q3 :q2 'q2 :q3 '\_}
                    {:_ '\c :q0 'q3 :q1 'q3 :q2 '\_ :q3 '\_}
                    {:_ '\$ :q0 '\_ :q1 '\_ :q2 '\_ :q3 'pass}])

我想用这种方式得到元素

代码语言:javascript
复制
((get tableOfStates 0) ":q0")

但返回nil

我怎么做这个?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-04 16:19:53

(get-in tableOfStates [0 :q0])

这将返回要查找的值,即与向量中第一个元素的键:q0相关联的值。

如果必须使用字符串,请执行以下操作:

(get-in tableOfStates [0 (keyword "q0")])

这首先将字符串转换为关键字。

来自REPL:

代码语言:javascript
复制
> tableOfStates
[{:_ \a, :q0 q1, :q1 q1, :q2 q3, :q3 \_}
 {:_ \b, :q0 q2, :q1 q3, :q2 q2, :q3 \_}
 {:_ \c, :q0 q3, :q1 q3, :q2 \_, :q3 \_}
 {:_ \$, :q0 \_, :q1 \_, :q2 \_, :q3 pass}]
> (get-in tableOfStates [0 :q0])
q1
> (keyword "str")
:str
> (get-in tableOfStates [0 (keyword "q0")])
q1
> 
票数 2
EN

Stack Overflow用户

发布于 2016-05-04 17:27:04

如果您将tableOfStates ( 状态转换表 )从map_s的向量更改为地图的_map,则可以更整洁、更快地完成这一任务。

代码语言:javascript
复制
(def tableOfStates {'\a {:q0 'q1 :q1 'q1 :q2 'q3 :q3 '\_}
                    '\b {:q0 'q2 :q1 'q3 :q2 'q2 :q3 '\_}
                    '\c {:q0 'q3 :q1 'q3 :q2 '\_ :q3 '\_}
                    '\$ {:q0 '\_ :q1 '\_ :q2 '\_ :q3 'pass}})

我们这样使用它:

代码语言:javascript
复制
((get tableOfStates \a) :q0) ;q1

..。或者只是

代码语言:javascript
复制
((tableOfStates \a) :q0) ;q1

..。因为映射作为自己的get函数工作。

我们直接使用\a。我们不需要使用:_密钥来查找它。

我认为你的印象是键必须是关键字,反之亦然。不是这样的!事实上,各州代表的不同,取决于它们所扮演的角色:

  • 作为关键字,它们是关键字:q0:q1:q2:q3
  • 作为值,它们是对应的符号'q0'q1 'q2'q3
  • (假设)失败状态由字符\_表示。(顺便说一句,没有必要引用字符)。

让我们将它们全部表示为关键字。桌子变成..。

代码语言:javascript
复制
(def tableOfStates {\a {:q0 :q1, :q1 :q1, :q2, :q3, :q3 :_}
                    \b {:q0 :q2, :q1 :q3, :q2 :q2, :q3 :_}
                    \c {:q0 :q3, :q1 :q3, :q2 :_, :q3 :_}
                    \$ {:q0 :_, :q1 :_, :q2 :_, :q3 :pass}})

其他变化。

使用nil而不是:_来表示失败状态。那么,您就不需要失败的转换:

代码语言:javascript
复制
(def tableOfStates {\a {:q0 :q1, :q1 :q1, :q2 :q3}
                    \b {:q0 :q2, :q1 :q3, :q2 :q2}
                    \c {:q0 :q3, :q1 :q3}
                    \$ {:q3 :pass}})

例如,

代码语言:javascript
复制
((tableOfStates \$) :q0) ;nil

看起来,\$代表输入的结束。如果这是供应的,好的,好的。如果不是,那么最好用set #{:q3}测试最后的状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37031157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档