我如何从clojure中获取元素?

时间:2016-05-04 14:47:30

标签: arrays clojure elements

我已经设置了

(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}])

我想以这种方式获取元素

((get tableOfStates 0) ":q0")

但返回nil

我该怎么做?

2 个答案:

答案 0 :(得分:2)

(get-in tableOfStates [0 :q0])

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

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

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

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

来自REPL:

> 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
> 

答案 1 :(得分:1)

如果您将tableOfStatesstate transition table地图矢量更改为地图,您可以更加整洁地执行此操作图

(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}})

我们这样使用它:

((get tableOfStates \a) :q0) ;q1

......或者只是

((tableOfStates \a) :q0) ;q1

...因为地图作为自己的get函数。

我们直接使用\a。我们不必使用:_键查找它。

我认为您认为必须是关键字,反之亦然。不是这样!事实上,各州的表现取决于他们扮演的角色:

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

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

(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代替:_代表失败状态。然后你不需要失败的过渡:

(def tableOfStates {\a {:q0 :q1, :q1 :q1, :q2 :q3}
                    \b {:q0 :q2, :q1 :q3, :q2 :q2}
                    \c {:q0 :q3, :q1 :q3}
                    \$ {:q3 :pass}})

例如,

((tableOfStates \$) :q0) ;nil

好像\$代表输入结束。如果这是提供的,那就好了。如果没有,您最好使用集#{:q3}来测试最终状态。