2011-11-18 22 views
5

Tôi bắt đầu chơi với hệ thống phù hợp với mẫu vợt gần đây và gặp phải vấn đề mà tôi không thể hiểu được.Kết hợp mẫu với Kleene sao trên kiểu cấu trúc trong Racket

Nếu tôi làm:

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

trong REPL tôi nhận được

'(3 : 2) 

như kết quả mong muốn của tôi.

Nếu tôi làm:

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

hoặc

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

tôi nhận được lỗi này:

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

tôi nghi ngờ rằng ngôi sao Kleene ... không làm việc với cấu trúc kiểu đối với một số lý do. Tại sao nó như vậy?

Trả lời

10

Có vẻ như những gì bạn thực sự muốn làm là phù hợp với một tập con của các trường trong một cấu trúc, thay vì thực sự ràng buộc phần còn lại của các trường trong cấu trúc để (z ...). Trong trường hợp này, bạn có thể thử sử dụng mẫu so khớp struct* thay thế.

Dưới đây là một ví dụ:

(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 câu trả lời của bạn là thực sự nhiều hơn nữa hữu ích hơn tôi. :-) – ruakh

+0

@ruakh câu trả lời của bạn mô tả * tại sao * nó không hoạt động. Câu trả lời này mô tả * cách * để làm cho nó hoạt động. Cả hai đều khá hữu ích. –

+0

Có, cả hai đều hữu ích. Cảm ơn. – mentus

8

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

Đúng. Ký hiệu ... và các ký hiệu liên quan ..k_____k, thực sự không phải là tính năng chung của kết hợp, mà là một tính năng cụ thể của list -matching và hash-table -kết nối, v.v. Nếu bạn kiểm tra việc sản xuất chính thức trong the documentation, bạn sẽ thấy rằng một số loại mẫu con chấp nhận lvp (được xác định là pat hoặc pat theo sau là ... hoặc một trong số bạn bè của nó) ở những nơi khác nhau, trong khi những người khác chỉ chấp nhận pat.

Why is it so?

Tôi đoán nó chỉ đơn giản rằng ... được sử dụng để dịch một phần của một danh sách hoặc vector hoặc bảng băm hoặc không có điều gì vào danh sách riêng của mình, và không có cách nào hợp lý để làm điều đó cho một cấu trúc cố định chiều dài. Nó có thể là giá trị chỉ ra rằng ... hoạt động khác nhau cho các loại khác nhau — ví dụ, nó có thể được sử dụng để trích xuất danh sách các khóa trong bảng băm — do đó lý do duy nhất để hỗ trợ nó cho cấu trúc sẽ là nếu có hoạt động tương tự sẽ có ý nghĩa đối với các cấu trúc. Tôi không nghĩ có một.

Các vấn đề liên quan