2012-11-28 14 views
7

मैं रैकेट सीखने का प्रयास कर रहा हूं, और प्रक्रिया में एक पायथन फ़िल्टर को फिर से लिखने का प्रयास कर रहा हूं। मैं अपने कोड में कार्यों की निम्न जोड़ी है:पायथन से रैकेट (नियमित अभिव्यक्ति पुस्तकालयों और "रैकेट वे") से

def dlv(text): 
    """ 
    Returns True if the given text corresponds to the output of DLV 
    and False otherwise. 
    """ 
    return text.startswith("DLV") or \ 
      text.startswith("{") or \ 
      text.startswith("Best model") 

def answer_sets(text): 
    """ 
    Returns a list comprised of all of the answer sets in the given text. 
    """ 
    if dlv(text): 
     # In the case where we are processing the output of DLV, each 
     # answer set is a comma-delimited sequence of literals enclosed 
     # in {} 
     regex = re.compile(r'\{(.*?)\}', re.MULTILINE) 
    else: 
     # Otherwise we assume that the answer sets were generated by 
     # one of the Potassco solvers. In this case, each answer set 
     # is presented as a comma-delimited sequence of literals, 
     # terminated by a period, and prefixed by a string of the form 
     # "Answer: #" where "#" denotes the number of the answer set. 
     regex = re.compile(r'Answer: \d+\n(.*)', re.MULTILINE) 
    return regex.findall(text) 

मैं क्या रैकेट में पहली समारोह के कार्यान्वयन बता निम्नलिखित लाइनों के साथ कुछ किया जाएगा कर सकते हैं से:

(define (dlv-input? text) 
    (regexp-match? #rx"^DLV|^{|^Best model" text)) 

प्रकट होता है कौन सा काम करने के लिए सही ढंग से। दूसरा समारोह के कार्यान्वयन पर काम करते हुए, मैं वर्तमान में निम्नलिखित (साथ शुरू करने के लिए) के साथ आए हैं:

(define (answer-sets text) 
    (cond 
     [(dlv-input? text) (regexp-match* #rx"{(.*?)}" text)])) 

इस रूप में regexp-match* सहित तार जो रेगुलर एक्सप्रेशन से मेल की एक सूची देता है,, सही नहीं है घुंघराले ब्रेसिज़। क्या किसी को पाइथन कार्यान्वयन के समान व्यवहार कैसे प्राप्त होता है? इसके अलावा, नियमित अभिव्यक्तियों को "बेहतर" बनाने के बारे में कोई सुझाव बहुत सराहना की जाएगी।

+1

क्या हम माइग्रेशन के कारण से पूछ सकते हैं? –

+1

मैंने पायथन सीखने के लिए मूल फ़िल्टर लिखा, और रैकेट सीखने के लिए एक समान दृष्टिकोण ले रहा हूं। तो यह सिर्फ एक व्यक्तिगत है "क्योंकि मैं" कारण करना चाहता हूं। – ggelfond

+2

बस ध्यान दें: व्यवहार से मिलान करने के लिए, पाइथन संस्करण को संकलित नियमित अभिव्यक्ति मानों को उठाने के लिए आवश्यक होगा। पाइथन सरल इनपुट के लिए 're.compile 'के परिणाम को कैश कर सकता है, लेकिन आप प्रदर्शन-महत्वपूर्ण कोड के लिए इस व्यवहार पर निर्भर नहीं रहना चाहेंगे। – dyoo

उत्तर

8

आप बहुत करीब हैं। आप बस अपनी regexp-match कॉल करने के लिए #:match-select cadr जोड़ने की जरूरत:

(regexp-match* #rx"{(.*?)}" text #:match-select cadr) 

डिफ़ॉल्ट रूप से, #:match-selectcar, जो पूरी मिलान किया स्ट्रिंग रिटर्न का मूल्य है। cadr पहले समूह का चयन करता है, caddr दूसरे समूह का चयन करता है, आदि। अधिक जानकारी के लिए regexp-match* documentation देखें।

+0

बहुत बहुत धन्यवाद। – ggelfond

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