你可以做到這一點更加整齊 - 快 - 如果你改變了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}
的最終狀態。
你傳遞一個字符串'「:q0」',而你想要的內容是':q0' - 一個關鍵字。嘗試'((get tableOfStates 0):q0)' – leetwinski
也可以使用'get-in'來代替'get':'(get-in tableOfStates [0:q0])''。順便說一句,你的向量的內容不是集合,但散列圖 – leetwinski
我知道它,但我的目標是獲取元素,當我只有一個字符串「:q0」 –