2011-11-18 82 views
5

我最近開始使用球拍模式匹配系統,並陷入了一個我無法理解的問題。與Kleene star在球拍結構類型上匹配的模式

如果我這樣做:

(match (list 1 2 3 4 5 6 7 8 9 10 11 12) 
    [(list _ x y z ...) (list y ': x)]) 

在REPL我得到

'(3 : 2) 

如我期望的結果。

如果我這樣做:

(match (current-date) 
    [(date* _ x y z ...) (list y ': x)]) 

(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time") 
    [(date* _ x y z ...) (list y ': x)]) 

我得到這個錯誤:

match: wrong number for fields for structure date*: expected 12 but got 5 in: (_ x y z ...) 

我懷疑是克林星...不能與結構類型,工作一段原因。爲什麼這樣?

回答

10

看來,你真正想要做的是匹配結構中的字段子集,而不是實際將結構中的其餘字段綁定到(z ...)。在這種情況下,您可能需要嘗試使用struct*匹配模式。

下面是一個例子:

(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time") 
    [(struct* date ([minute x] [hour y])) (list y ': x)]) 
+0

+1你的回答居然比我更加有幫助。 :-) – ruakh

+0

@ruakh你的答案描述*爲什麼*它不起作用。這個答案描述了*如何使它工作。兩者都很有幫助。 –

+0

是的,兩者都有幫助。謝謝。 – mentus

8

i suspect that the Kleene star ... does not work with struct type for some reason.

正確。 ...表示法以及相關的..k_____k表示法不是匹配的一般特徵,而是list匹配和匹配等特定功能。如果您檢查the documentation中的正式產品,您會看到某些類型的子模式在各個地方接受lvp(其定義爲patpat後跟...或其一位朋友),而其他人只接受pat

Why is it so?

我想這僅僅是...用於轉換列表或向量或哈希表或諸如此類的東西變成自己的列表的一部分,而且也沒有合理的方式做了一個固定長度的結構。值得指出的是...對於不同類型的行爲會有所不同—例如,它可以用來提取散列表—中的密鑰列表,所以支持結構的唯一原因是如果存在特定類似的操作將對結構有意義。我不認爲有一個。