2011-11-18 13 views
5

में संरचना प्रकार पर क्लेन स्टार के साथ पैटर्न मिलान हाल ही में मैंने रैकेट पैटर्न मिलान प्रणाली के साथ खेलना शुरू कर दिया और मुझे एक समस्या में आई जिसे मैं समझ नहीं पा रहा हूं।रैकेट

तो मुझे क्या:

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

आरईपीएल में मैं

'(3 : 2) 
मेरी वांछित परिणाम के रूप में

मिलता है।

तो मुझे क्या:

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

मैं संदेह है कि क्लीन तारा ... कुछ के लिए struct प्रकार के साथ काम नहीं करता है:

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

मैं इस त्रुटि मिलती है कारण। ऐसा क्यों है?

उत्तर

10

ऐसा लगता है कि आप वास्तव में क्या करना चाहते हैं, संरचना में खेतों के बाकी हिस्सों को वास्तव में बाध्य करने के बजाय, संरचना में खेतों के एक उप-समूह से मेल खाता है। इस मामले में, आप इसके बजाय 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 -matching और hash-table -matching और इसी तरह की एक विशिष्ट विशेषता नहीं है। आप the documentation में औपचारिक उत्पादन की जांच, तो आप, कि subpatterns के कुछ प्रकार के lvp विभिन्न स्थानों में (जो या तो pat, या pat... या उसके दोस्तों में से एक के बाद के रूप में परिभाषित किया गया है) को स्वीकार देख जबकि अन्य केवल pat को स्वीकार करेंगे।

Why is it so?

मुझे लगता है कि यह केवल कि ... सूची या वेक्टर या हैश तालिका या whatnot अपनी ही सूची में का हिस्सा अनुवाद करने के लिए प्रयोग किया जाता है, और वहाँ ऐसा करने के लिए है कि एक निश्चित लंबाई struct के लिए कोई समझदार तरीका है। यह इंगित करने योग्य हो सकता है कि ... विभिन्न प्रकारों के लिए अलग-अलग व्यवहार करता है — उदाहरण के लिए, इसका उपयोग हैश-टेबल — में चाबियों की एक सूची निकालने के लिए किया जा सकता है, इसलिए structs के लिए इसका समर्थन करने का एकमात्र कारण होगा यदि कोई विशिष्ट था समान ऑपरेशन जो structs के लिए समझ में आता है। मुझे नहीं लगता कि एक है।

संबंधित मुद्दे