2016-05-04 106 views
2

我已經設置我如何從clojure中獲取元素?

(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

我怎樣才能使這個?

+0

你傳遞一個字符串'「:q0」',而你想要的內容是':q0' - 一個關鍵字。嘗試'((get tableOfStates 0):q0)' – leetwinski

+0

也可以使用'get-in'來代替'get':'(get-in tableOfStates [0:q0])''。順便說一句,你的向量的內容不是集合,但散列圖 – leetwinski

+0

我知道它,但我的目標是獲取元素,當我只有一個字符串「:q0」 –

回答

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

你可以做到這一點更加整齊 - 快 - 如果你改變了tableOfStates,一個state transition table,從地圖的矢量 s到一個地圖地圖的:

(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}的最終狀態。