में अभिव्यक्तियों की एक श्रृंखला से एक सूची तैयार करें जब मैं स्कैला में आंतरिक डीएसएल बनाने की कोशिश करता हूं, तो मैं एक आम समस्या में भाग लेता हूं और मैं समाधान तैयार करने में सक्षम नहीं हूं। चीजें अधिक एक ठेठ भाषा जैसे दिखते हैं बनाने के लिए, मैं वाक्य रचना कुछ इस तरह देखने के लिए करना चाहते हैं:स्कैला
model 'Foo {
decl 'Real 'x;
decl 'Real 'y;
}
अभ्यास में, वहाँ कई मुद्दे हैं। इस तरह से दो तर्क लेने के लिए पहली समस्या model
ऑब्जेक्ट प्राप्त कर रही है। अगर किसी के पास कोई विचार है, तो मुझे बताएं।
model('Foo) {
...
}
कहाँ मॉडल अब एक समारोह जो तब एक apply
विधि जो तब लैम्ब्डा कि इस प्रकार की खपत के साथ एक वस्तु देता है: लेकिन क्या मैं बजाय किया है कुछ इस तरह थोड़ा और करना है। मैं साथ रह सकता हूँ मैं लैम्ब्डा के अंदर भी इसी तरह के मुद्दे के साथ रह सकता था, इसलिए अंदर decl 'Real 'x
या decl('Real,'x)
जैसी चीज़ें। लेकिन मैं जो करना चाहता हूं वह है कि सूची के रूप में "लौटा" पाने के लिए स्क्विगली ब्रेसिज़ के अंदर उन सभी अभिव्यक्तियों के परिणाम प्राप्त करना। दूसरे शब्दों में, क्या मैं चाहता हूँ कुछ इस तरह लिखने के लिए:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
जहां decl(...)
प्रकार Declaration
के बारे में कुछ करने के लिए मूल्यांकन करता है और {...}
तो List[Declaration]
मूल्यांकन करता है। मुझे संदेह है कि ऐसा करने के लिए implicits का उपयोग करने का कोई तरीका है, लेकिन मैं इसे खोजने में सक्षम नहीं हूं। संक्षेप में, मैं करना चाहते हैं:
model 'Foo {
decl('Real,'x);
decl('Real,'y);
}
... के बराबर का मूल्यांकन ...
model 'Foo {
decl('Real,'x) ::
decl('Real,'y) ::
Nil
}
टिप्पणियां या सुझाव?
हां, मैंने कुछ घोषणात्मक जीयूआई डीएसएल के साथ भी इस दृष्टिकोण को देखा है। मैं मानता हूं कि यह करीब है। मैं बस पूरी चीज के आसपास() का उपयोग करने की आवश्यकता नहीं थी और "," उपयोग करने की आवश्यकता समस्याग्रस्त है क्योंकि हर बार जब आप जोड़ना या हटाना चाहते हैं, तो आपको चीजों के बीच "," होने की चिंता करने की ज़रूरत है, लेकिन नहीं अतं मै। –
मैंने आपकी टिप्पणी का उत्तर देने के लिए मेरा उत्तर संशोधित किया। – paradigmatic
आह, बहुत चालाक। कन्स्ट्रक्टर सिंटैक्स और स्थानीय रूप से परिभाषित तरीकों का उपयोग करना। मुझे यह पसंद है और मुझे लगता है कि यह काम कर सकता है। असल में, मैं इसे "नया मॉडल ('Foo) {...}" तक सरल बना सकता हूं जो कोड को नीचे लाता है। इस तथ्य का फायदा उठाने का अच्छा तरीका है कि एक कन्स्ट्रक्टर संदर्भ में squiggly ब्रेसिज़ आपको उस दायरे में आसानी से चीजों को पेश करने की अनुमति देता है। मुझे आश्चर्य है कि स्कैला 2.10 मैक्रोज़ इसे और भी आसान बना देगा? –