2010-08-06 4 views
10

मैं एक सुविधा मैक्रो बना रहा हूँ। सुविधा का एक हिस्सा यह है कि एक नियमित अभिव्यक्ति को "पुनः" नोटेशन के बजाय केवल एक स्ट्रिंग के साथ निर्दिष्ट किया जा सकता है।स्ट्रिंग से नियमित अभिव्यक्ति बनाने के लिए मैं क्लोजर मैक्रो कैसे लिखूं?

एक भाग जिसे मैं नहीं समझ सकता, यह है कि मैक्रो को स्ट्रिंग लेने के लिए कैसे प्राप्त करें और क्लोजर रेगेक्स के रूप में इसे फिर से लिखें (उदा।, # "पुनः" नोटेशन उत्पन्न करें)। मुझे लगता है कि यह एक वाक्यविन्यास/भागने की समस्या है।

मेरी पहली अनुभवहीन प्रयास (नाटक मैं केवल स्ट्रिंग करने वाली regex हिस्सा चाहते हैं):

(defmacro mymac [mystr] `#~mystr) 

यह मैं क्या करने की कोशिश कर रहा हूँ करने के लिए भी संभव है? या, # रीडर मैक्रो का उपयोग करने के बजाय स्ट्रिंग लेने और रेगेक्स बनाने के लिए कोई वास्तविक कार्य है?

या मुझे जावा में बस छोड़ना चाहिए और java.util.regex.Pterntern का उपयोग करना चाहिए?

उत्तर

28

इसके लिए एक समारोह है: re-pattern

user=> (re-pattern "\\d+") 
#"\d+" 
0

मैं इस प्रश्न को गलत समझ सकता हूं, लेकिन क्या आप ऐसा नहीं करते हैं?

user=> (. java.util.regex.Pattern compile "mystr") 
#"mystr" 
+0

हाँ यह वही करता है जो मैं चाहता हूं। लेकिन आपको जे-जी-फस्टस (पुनः पैटर्न "mystr") – dirtyvagabond

+0

नहीं, वास्तव में नहीं, स्वीकार करना है। – Sean

7

में और व्याख्या करने के लिए:

#"" एक पाठक मैक्रो है। इसे पाठक द्वारा पढ़ने के समय में हल किया जाता है। तो एक मैक्रो बनाने का कोई तरीका नहीं है जो एक पाठक मैक्रो में फैलता है, क्योंकि पढ़ा गया चरण लंबा हो गया है। एक मैक्रो विस्तारित कोड का प्रतिनिधित्व करने वाली वास्तविक डेटा संरचना देता है, न कि एक स्ट्रिंग जिसे दोबारा पार्स किया जाता है। # परिभाषित करता है सी

जे-जी-फास्टस का जवाब सही रास्ता (टीएम) है।

+0

धन्यवाद कोटरक। मुझे एहसास होना चाहिए था कि पाठक जीवन चक्र मुझे ऐसा करने से रोकता है जो मैं करने की कोशिश कर रहा था। धन्यवाद! – dirtyvagabond

0

शब्दशः एक स्ट्रिंग से मेल करने के लिए, विशेष वर्ण अनदेखी:

(defn to-regex [some-string] 
    (re-pattern (java.util.regex.Pattern/quote some-string))) 

फिर ... केवल ..., नहीं aaa या किसी अन्य तीन पत्र संयोजन से मेल खाएगी।

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